目录
第一章、嵌套(nested)虚拟化
1.1 概述
从 Red Hat Enterprise Linux 7.5 开始,嵌套虚拟化作为 KVM 虚拟机的技术预览提供。借助此功能,在物理主机(级别 0 或 L0)上运行的虚拟机(也称为级别 1 或 L1)可以充当虚拟机监控程序,并创建自己的虚拟机 (L2)。
嵌套虚拟化在各种场景中都很有用,例如在受限环境中调试虚拟机监控程序,以及在有限数量的物理资源上测试更大的虚拟部署。但是,请注意,在生产用户环境中不支持或建议使用嵌套虚拟化,它主要用于开发和测试。
嵌套虚拟化依赖于主机虚拟化扩展来运行,不应将其与使用 QEMU 微小代码生成器 (TCG) 仿真在虚拟环境中运行客户机相混淆,而 Red Hat Enterprise Linux 不支持后者。
1.2 什么是嵌套(nested)虚拟化
借助嵌套虚拟化,您可以在其他 虚拟机中运行虚拟机 (VM)。在物理主机上运行的标准 虚拟机 还可以充当第二个虚拟机管理程序并创建自己的 虚拟机。
嵌套虚拟化术语
0 级 (L0
)
一个物理主机,一台裸机。
1 级 (L1
)
在L0
物理主机上运行的标准 VM(虚拟机),可以充当其他虚拟主机。
2 级 (L2
)
在L1
虚拟主机上运行的嵌套 VM虚拟机。
重要:第二级虚拟化严重限制了 L2
VM虚拟机 的性能。因此,嵌套虚拟化主要用于开发和测试方案,例如:
- 在受约束的环境中调试虚拟机管理程序
- 在有限数量的物理资源上测试更大规模的虚拟部署
1.3 嵌套(nested)虚拟化的限制性和局限性
使用嵌套虚拟化时,请记住以下限制。若要详细了解嵌套虚拟化的相关术语
经过测试的架构
L0
主机必须是 Intel、AMD、IBM POWER9 或 IBM Z 系统。嵌套虚拟化目前不适用于其他架构,例如 ARM。
经过测试的环境
若要创建嵌套虚拟机 (VM),必须使用以下版本的操作系统:
在 L0 主机上: | 在 L1 VM 上: | 在 L2 VM 上: |
---|---|---|
RHEL 8.2 及更高版本 | RHEL 7.8 及更高版本 | RHEL 7.8 及更高版本 |
RHEL 8.2 及更高版本 | RHEL 8.2 及更高版本 | |
Windows 服务器 2016 | ||
Windows 服务器 2019 |
注意在其他 Red Hat 虚拟化产品中使用时,不会测试创建 RHEL L1VM。这些包括:
- 红帽虚拟化
- 红帽 OpenStack 平台
- OpenShift 虚拟化
此外,在 IBM POWER9 上,嵌套虚拟化目前仅在以下情况下工作:
L0
主机和L1
VM 都使用 RHEL 8L2
VM 使用 RHEL 8 或带有rhel-alt
内核的 RHEL 7。L1
VM 和L2
VM 未在 POWER8 兼容模式下运行。
虚拟机监控程序限制
- 目前,Red Hat 仅在 RHEL-KVM 上测试嵌套。当 RHEL 用作
L0
虚拟机管理程序时,您可以使用 RHEL 或 Windows 作为L1
虚拟机管理程序。 - 在非
L0
KVM 虚拟机管理程序(如 VMware ESXi 或 Amazon Web Services (AWS))上使用L1
RHEL 8 VM 时,在 RHEL 8 客户机操作系统中创建 L2
VM 可能会起作用,但不会经过测试。
功能限制
- 使用
L2
虚拟机作为L3
虚拟机管理程序和创建虚拟机尚未经过适当测试,预计无法正常工作。 - 如果在
L0
主机上启用了嵌套虚拟化,则迁移 VM 当前无法在 AMD 系统上运行。 -
在 IBM Z 系统上,大页面备份存储和嵌套虚拟化不能同时使用。
# modprobe kvm hpage=1 nested=1
modprobe: ERROR: could not insert 'kvm': Invalid argument
# dmesg |tail -1
[90226.508366] kvm-s390: A KVM host that supports nesting cannot back its KVM guests with huge pages
-
L0
主机上可用的某些功能可能对L1
虚拟机管理程序不可用。例如,在 IBM POWER 9 硬件上,外部中断虚拟化引擎 (XIVE) 不起作用。但是,
L1
VM 可以使用模拟的 XIVE 中断控制器来启动L2
VM。
第二章、配置
2.1 在Intel平台上创建嵌套虚拟机
按照以下步骤在 Intel 主机上启用和配置嵌套虚拟化。
警告
Red Hat 目前仅以技术预览的形式提供嵌套虚拟化,因此不受支持。
此外,嵌套虚拟化仅在一组有限的体系结构和操作系统版本上进行了测试。在您的环境中使用此功能之前,请参阅嵌套虚拟化的限制和局限性。
先决条件
- 运行 L1 虚拟机 (VM) 的 L0 RHEL 8 主机。
- 虚拟机监控程序 CPU 必须支持嵌套虚拟化。要进行验证,请在 L0 虚拟机管理程序上使用cat /proc/cpuinfo 命令。如果命令的输出包含 vmx和ept标志,则可以创建 L2 VM。这通常是在 Intel Xeon v3 内核及更高版本上的情况。
确保在 L0 物理主机上启用了嵌套虚拟化:
cat /sys/module/kvm_intel/parameters/nested
- 如果命令返回 1 或 Y,则表示该功能已启用。跳过其余的先决条件步骤,并继续执行“过程”部分。
-
如果命令返回 0 或 N,但您的系统支持嵌套虚拟化,请使用以下步骤启用该功能。
1、卸载
kvm_intel
模块:modprobe -r kvm_intel
2、激活嵌套功能:
modprobe kvm_intel nested=1
3、嵌套功能现在已启用,但仅在下次重新启动 L0 主机之前启用。若要永久启用它,请将以下行添加到
/etc/modprobe.d/kvm.conf
文件中:options kvm_intel nested=1
过程&步骤
1、配置 L1 VM 以实现嵌套虚拟化。
a.打开 VM 的 XML 配置。以下示例打开 Intel-L1 VM 的配置:
virsh edit Intel-L1
b.通过编辑
<cpu>
元素将 VM 配置为使用host-passthrough
CPU 模式:<cpu mode='host-passthrough'/>
如果需要 VM 使用特定的 CPU 型号,请将 VM 配置为使用
custom
CPU 模式。在<cpu>
元素内部,添加一个<feature policy='require' name='vmx'/>
元素和一个内部指定的 CPU 模型的<model>
元素。例如:<cpu mode ='custom' match ='exact' check='partial'> <model fallback='allow'>Haswell-noTSX</model> <feature policy='require' name='vmx'/> ... </cpu>
2、在 L1 VM 中创建 L2 VM。为此,请按照与创建 L1 VM 时相同的过程操作。
2.2 在AMD上创建嵌套虚拟化
按照以下步骤在 AMD 主机上启用和配置嵌套虚拟化。
先决条件
- 运行 L1 虚拟机 (VM) 的 L0 RHEL 8 主机。
- 虚拟机监控程序 CPU 必须支持嵌套虚拟化。要进行验证,请在 L0 虚拟机管理程序上使用
cat /proc/cpuinfo
命令。如果命令的输出包含svm
和npt
标志,则可以创建 L2 VM。这通常是 AMD EPYC 内核及更高版本的情况。 -
确保在 L0 主机上启用了嵌套虚拟化:
cat /sys/module/kvm_amd/parameters/nested
- 如果命令返回 1 或 Y,则表示该功能已启用。跳过其余的先决条件步骤,并继续执行“过程”部分。
-
如果命令返回 0 或 N,请使用以下步骤启用该功能。
1、停止 L0 主机上所有正在运行的 VM。
2、卸载kvm_amd
模块:
modprobe -r kvm_amd
3、激活嵌套功能:
modprobe kvm_amd nested=1
4、嵌套功能现在已启用,但仅在下次重新启动 L0 主机之前启用。要永久启用它,请将以下内容添加到/etc/modprobe.d/kvm.conf
文件中:
options kvm_amd nested=1
过程&步骤
1、配置 L1 VM 以实现嵌套虚拟化。
a.打开 VM 的 XML 配置。以下示例打开 AMD-L1 VM 的配置:
virsh edit AMD-L1
b.通过编辑<cpu>
元素将 VM 配置为使用host-passthrough
CPU 模式:
<cpu mode='host-passthrough'/>
如果需要 VM 使用特定的 CPU 型号,请将 VM 配置为使用custom
CPU 模式。在<cpu>
元素内部,添加一个<feature policy='require' name='svm'/>
元素和一个内部指定的 CPU 模型的<model>
元素。例如:
<cpu mode="custom" match="exact" check="none">
<model fallback="allow">EPYC-IBPB</model>
<feature policy="require" name="svm"/>
...
</cpu>
2、在 L1 VM 中创建 L2 VM。为此,请按照与创建 L1 VM 时相同的过程操作。