基于KVM虚拟化的嵌套(nested)虚拟化技术研究

目录

第一章、嵌套(nested)虚拟化

1.1 概述

1.2 什么是嵌套(nested)虚拟化 

1.3 嵌套(nested)虚拟化的限制性和局限性 

第二章、配置

2.1 在Intel平台上创建嵌套虚拟机

 2.2 在AMD上创建嵌套虚拟化


第一章、嵌套(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 8
  • L2VM 使用 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命令。如果命令的输出包含svmnpt 标志,则可以创建 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 时相同的过程操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

技术瘾君子1573

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值