第3章
实现嵌套虚拟化
嵌套虚拟化是指在一个虚拟机之中再运行另外一个虚拟机。由于嵌套虚拟化有一些功能上的限制,所以通常不建议在生产环境中使用,它主要用于开发和测试。有多种嵌套虚拟化的方法,本章将介绍通过KVM实现嵌套虚拟化。
本章要点
嵌套虚拟化的原理。
L1级别宿主机的准备。
L2级别KVM宿主机的配置。
L2级别VMware ESXi宿主机的配置。
L2级别Microsoft HyperV宿主机的配置。
3.1嵌套虚拟化的原理
为了保证虚拟化平台的安全和稳定,默认情况下L1级别(也称为第一层)的Hypervisor会阻止其他软件使用CPU的虚拟化功能,所以其上的虚拟机就无法再充当Hypervisor了。
如果在L1级别的Hypervisor上启动了对嵌套虚拟化的支持,它就会向其虚拟机公开硬件虚拟化扩展。这些虚拟机可以充当L2级别的Hypervisor,安装并运行自己的虚拟机,如图31所示。图中箭头表示硬件虚拟化扩展。
图31嵌套虚拟化原理
要实现嵌套虚拟化,需要L1和L2级别都支持Hypervisor。RHEL/CentOS 8.2及更高版本全面支持Intel CPU上的嵌套虚拟化功能。Red Hat公司当前仅在Intel CPU嵌套虚拟化提供技术支持。在AMD、IBM POWER9和IBM Z系统上的嵌套虚拟化仅作为技术预览提供,因此Red Hat公司不提供支持服务。
早期的Linux发行版本例如CentOS 7.2,无法实现Microsoft HyperV 2012和2016的嵌套虚拟化。随着技术的发展,RHEL/CentOS 8.3可以很好地支持Microsoft HyperV 2019的嵌套虚拟化。
3.2L1级别宿主机的准备
嵌套虚拟化对运行L1级别Hypervisor宿主机的硬件要求比较高。下面的实验中使用一台HP Z420工作站,通过lshw命令查看其硬件信息,示例命令如下:
#lshw -short
H/W path ClassDescription
==============================
systemHP Z420 Workstation (LJ449AV)
/0bus1589
/0/0memory64KiB BIOS
/0/4processor Intel(R) Xeon(R) CPU E5-2670 0 @ 2.60GHz
/0/4/5memory512KiB L1 cache
/0/4/6memory2MiB L2 cache
/0/4/7memory20MiB L3 cache
/0/44memory32GiB System Memory
/0/44/0memory8GiB DIMM DDR3 Synchronous Registered (Buffered) 1333 MHz (0.8 ns)
/0/44/1memoryDIMM Synchronous [empty]
/0/44/2memory8GiB DIMM DDR3 Synchronous Registered (Buffered) 1333 MHz (0.8 ns)
/0/44/3memoryDIMM Synchronous [empty]
/0/44/4memoryDIMM Synchronous [empty]
/0/44/5memory8GiB DIMM DDR3 Synchronous Registered (Buffered) 1333 MHz (0.8 ns)
/0/44/6memoryDIMM Synchronous [empty]
/0/44/7memory8GiB DIMM DDR3 Synchronous Registered (Buffered) 1333 MHz (0.8 ns)
...
这台宿主机包括一个16核的Intel(R) Xeon(R) CPU E52670 0 @ 2.60GHz,32GB内存。
在其上安装CentOS 8.3并进行升级,升级后的版本信息如下:
#cat /etc/redhat-release
CentOS Linux release 8.3.2011
#uname -a
Linux localhost.localdomain 4.18.0-240.el8.x86_64 #1 SMP Fri Sep 25 19:48:47 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
HP Z420工作站的BIOS默认启用了虚拟化支持,可以通过检查/proc/cpuinfo是否包含vmx和ept标志来确认,示例命令如下:
#cat /proc/cpuinfo | egrep '(vmx|ept)'
flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx lahf_lm epb pti ssbd ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid xsaveopt dtherm ida arat pln pts md_clear flush_l1d
...
检查内核参数是否启用了嵌套虚拟化的支持,示例命令如下:
#cat /sys/module/kvm_intel/parameters/nested
0
如果命令返回1或Y,则表示已经启用了该功能。如果命令返回0或N,则表示未启用。
有两种方法启用对嵌套虚拟化的支持。
第1种方法是使用modprobe命令进行临时启用,示例命令如下:
#modprobe -r kvm_intel
#modprobe kvm_intel nested=1
先通过modprobe命令卸载kvm_intel模块,然后使用选项nested=1启用嵌套功能。
第2种方法是修改配置文件/etc/modprobe.d/kvm.conf中的选项,这样可以在下次重新启动宿主机之后一直生效,示例命令如下:
#vi /etc/modprobe.d/kvm.conf
#Setting modprobe kvm_intel/kvm_amd nested = 1
#only enables Nested Virtualization until the next reboot or
#module reload. Uncomment the option applicable
#to your system below to enable the feature permanently.
#
#User changes in this file are preserved across upgrades.
#
#For Intel
#options kvm_intel nested=1
options kvm_intel nested=1
#
#For AMD
#options kvm_amd nested=1
如果是AMD的CPU,则其内核模块名称为kvm_amd,选项名为kvm_amd nested,所以会有一些不同,示例命令如下:
#modprobe -r kvm_amd
#modprobe kvm_amd nested=1
#vi /etc/modprobe.d/kvm.conf
添加
options kvm_amd nested=1
3.3L2级别KVM宿主机的配置
实验中L2级别的KVM宿主机使用CentOS 8.3,安装方法与普通的KVM虚拟化宿主机相同。
3.3.1虚拟机配置(Intel)
安装完成后,通过virsh edit命令修改虚拟机的配置文件,主要编辑CPU的设置。示例命令如下:
#virsh edit centos8.3
将原有CPU参数
SandyBridge-IBRS
Intel
修改为
如果L1级别宿主机采用的是Intel的CPU,通过设置,则可以使L2宿主机像L1宿主机一样使用CPU的虚拟化特性。
也可以使用virtmanager设置虚拟机CPU的模式,如图32所示。
图32在virtmanager中设置虚拟机CPU的属性
目前Cockpit还不支持修改虚拟机的CPU的模式。
启动L2级别的虚拟机CentOS 8.3,通过SSH登录,示例命令如下:
#virsh start centos 8.3
Domain centos8.3 started
#virsh domifaddr centos 8.3
NameMAC addressProtocolAddress
-------------------------------------------------------------
vnet052:54:00:ff:a7:9aipv4192.168.122.146/24
#ssh 192.168.122.146
root@192.168.122.146's password:
Activate the web console with: systemctl enable --now cockpit.socket
L2级别宿主机的IP地址是192.168.122.146,使用SSH登录。通过虚拟化验证工具virthostvalidate进行检查,示例命令如下:
[root@localhost ~]#virt-host-validate
QEMU: Checking for hardware virtualization: PASS
QEMU: Checking if device /dev/kvm exists: PASS
QEMU: Checking if device /dev/kvm is accessible: PASS
QEMU: Checking if device /dev/vhost-net exists: PASS
QEMU: Checking if device /dev/net/tun exists: PASS
QEMU: Checking for cgroup 'cpu' controller support: PASS
QEMU: Checking for cgroup 'cpuacct' controller support: PASS
QEMU: Checking for cgroup 'cpuset' controller support: PASS
QEMU: Checking for cgroup 'memory' controller support: PASS
QEMU: Checking for cgroup 'devices' controller support: PASS
QEMU: Checking for cgroup 'blkio' controller support: PASS
QEMU: Checking for device assignment IOMMU support: WARN (No ACPI DMAR table found, IOMMU either disabled in BIOS or not supported by this hardware platform)
QEMU: Checking for secure guest support: WARN (Unknown if this platform has Secure Guest support)
输出结果说明此宿主机支持虚拟化。
提示: 对于嵌套虚拟化实验环境,可以忽略与IOMMU和Secure Guest support有关的警告。
查看L2级别宿主机的CPU属性,示例命令如下:
[root@localhost ~]#cat /proc/cpuinfo | grep model
model: 45
model name: Intel(R) Xeon(R) CPU E5-2670 0 @ 2.60GHz
model: 45
model name: Intel(R) Xeon(R) CPU E5-2670 0 @ 2.60GHz
[root@localhost ~]#cat /proc/cpuinfo | grep vmx
flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon rep_good nopl xtopology cpuid tsc_known_freq pni pclmulqdq vmx ssse3 cx16 pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx hypervisor lahf_lm cpuid_fault pti ssbd ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid tsc_adjust xsaveopt arat umip md_clear arch_capabilities
flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon rep_good nopl xtopology cpuid tsc_known_freq pni pclmulqdq vmx ssse3 cx16 pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx hypervisor lahf_lm cpuid_fault pti ssbd ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid tsc_adjust xsaveopt arat umip md_clear arch_capabilities
在L2级别的宿主机CentOS 8.3上,可以看到HP Z420工作站的CPU型号及特性。有了这些特性,就可以在其上再创建虚拟机了。创建的过程与直接在L1宿主机上创建虚拟机类似,这里不再赘述。
3.3.2虚拟机配置(AMD)
如果L1级别宿主机采用的是AMD的CPU,则配置L2级别宿主机的方法与配置Intel的CPU类似,也是将虚拟机CPU配置为使用hostpassthrough模式,示例命令如下:
#virsh edit centos 8.3
将CPU属性修改为
如果要求L2级别宿主机使用特定的CPU而不是hostpassthrough,则需在CPU配置中添加,示例命令如下:
#virsh edit centos 8.3
将CPU属性修改为
Haswell-noTSX
3.4L2级别VMware ESXi宿主机的配置
3.4.1VMware ESXi下载与安装
VMware vSphere Hypervisor ESXi是一个商业产品,但是VMware公司提供了60天试用版。下面的实验使用的版本是VMware vSphere Hypervisor(ESXi) 6.7,它的ISO文件的下载网址为https://my.vmware.com/en/web/vmware/evalcenter?p=freeesxi6。
在下载页面中会显示文件的MD5及SHA类型的摘要信息,如图33所示。
图33VMware vSphere Hypervisor 6.7文件的信息
在安装前,建议通过这些信息来检查所下载文件的完整性,示例命令如下:
#md5sum /iso/VMware-VMvisor-Installer-6.7.0.update03-14320388.x86_64.iso
cafb95ae04245eb3e93fed1602b0fd3b/iso/VMware-VMvisor-Installer-6.7.0.update03-14320388.x86_64.iso
由于Cockpit和virtmanager没有适合ESXi的操作系统参数,所以需要通过virtinstall命令来创建能够运行ESXi的虚拟机,示例命令如下:
#virt-install --name=esxi6.7u3 \
--cpu host-passthrough \
--ram 4096 --vcpus=4 \
--virt-type=kvm --hvm \
--cdrom /iso/VMware-VMvisor-Installer-6.7.0.update03-14320388.x86_64.iso \
--network bridge=virbr1,model=e1000 \
--graphics spice,listen=127.0.0.1 \
--graphics vnc \
--video qxl \
--disk pool=vm,size=80,sparse=true,bus=ide,format=qcow2 \
--boot cdrom,hd --noautoconsole --force
需要注意以下选项参数。
(1) CPU: hostpassthrough。
(2) 网卡类型: E1000。
(3) 磁盘接口类型: IDE。
(4) 显卡类型: QXL。
提示: ESXi的硬件兼容列表很短,这些是经过验证的虚拟硬件类型的组合。
从ISO文件启动虚拟机,会出现安装的ESXi引导菜单,如图34所示。
图34ESXi安装引导菜单
在欢迎屏幕上,按Enter键,如图35所示。
图35安装ESXi的欢迎信息
按F11键接受许可,如图36所示。
图36ESXi的许可协议
按Enter键选择单个磁盘作为默认安装驱动器,如图37所示。
图37选择要安装或升级的磁盘
将键盘布局选为US Default,按Enter键,如图38所示。
输入root的初始密码,如图39所示。
如果收到CPU或其他设备的兼容性警告,则可按Enter键继续,如图310所示。
图38选择键盘布局
图39设置root用户的密码
图310硬件兼容性警告
确认将会安装在目标磁盘,按F11键开始安装,如图311所示。
图311确认安装目标磁盘
安装的速度很快。在安装的过程中会显示进度条,如图312所示。
图312安装进度
安装结束后,提示断开安装介质,如图313所示。
图313安装完成
重新启动后,会出现ESXi服务器的管理入口页面,如图314所示。可以使用浏览器访问屏幕上显示的地址,这是一个功能丰富的基于Web的管理工具。
图314ESXi服务器的管理入口页面
也可以按F2键,输入在安装过程中设置的root密码,这样就会进入系统设置界面。可以在其中完成一些最基本的设置,如图315所示。
图315系统设置界面
3.4.2VMware ESXi管理
通过Web浏览器(建议使用对HTML5支持比较好的浏览器,如Chrome、Firefox等)打开ESXi的管理页面,使用root的用户名和密码登录,如图316所示。
图316VMware Host Client登录界面
这是一个HTML/JavaScript的应用程序,是由ESXi主机直接提供的轻量级管理界面,如图317所示。
图317VMware Host Client主界面
下面在ESXi中再创建一个虚拟机。首先单击“创建/注册虚拟机”按钮,就会出现创建新虚拟机的向导,如图318所示。
图318创建新虚拟机的向导(一)
向导共分为5个步骤,分别是:
(1) 选择创建类型。
(2) 选择名称和客户机操作系统。
(3) 选择存储。
(4) 自定义设置。
(5) 即将完成。
首先选择“创建新的虚拟机”,然后单击“下一步”按钮。向导的提示信息友好、简洁,此处不再赘述详细操作过程。向导最后的界面如图319所示。
默认情况下,新虚拟的电源是关闭的。启动虚拟机之后,应该看到预览屏幕的更改。单击“控制台”,然后单击“打开浏览器控制台”,这样就可以获得虚拟机的控制台了,如图320所示。
图319创建新虚拟机的向导(二)
图320虚拟机控制台
可以很顺利地完成操作系统的安装,后续操作不再赘述。虚拟机的详细信息如图321所示。
图321虚拟机的详细信息
3.4.3实验中遇到的问题
如前所述,ESXi的硬件兼容列表很短,所以在做嵌套实验时会遇到不少问题。以下是可以重复再现但无法解决的问题。
(1) CentOS 8.3+ESXi 6.7组合: 只能选择e1000网卡。如果选择的是e1000e网卡,则会出现紫色的系统崩溃屏幕,如图322所示。
(2) CentOS 8.3+ESXi7(7.0U116850804)组合: 由于ESXi7已不再支持e1000网卡,所以只能选择e1000e网卡。安装ESXi7没有问题,但是无法出现VMware Host Client的登录界面。
图322ESXi安装程序崩溃
除了上述实验所使用的CentOS 8.3+ESXi 6.7(6.7.0.update0314320388)组合之外,还在CentOS 7.2+ESXi6.0(6.0.0.update023620759)组合下通过了实验。
3.5L2级别Microsoft HyperV宿主机的配置
本次实验将采用CentOS 8.3+Microsoft Windows Server 2019简体中文服务器版(17763.973)的组合。
由于本次实验环境采用的是Intel的CPU,所以将L2级别虚拟机的CPU设置为。
安装Windows Server 2019后,可以在其中通过SecurAble工具来检测是否支持虚拟化。如果支持,则会显示绿色的Yes,如图323所示。
图323检查CPU的特性
提示: SecurAble是一个免费的系统硬件检测工具,其下载网址为https://securable.en.softonic.com/。
启动管理工具的服务器管理,在其中单击“添加角色和功能”,如图324所示。
图324服务管理器
在向导中单击“下一步”按钮。根据需求选择“安装类型”。由于是本地安装,所以选择“基于角色或基于功能的安装”,单击“下一步”按钮,如图325所示。
图325安装类型
选择服务器,单击“下一步”按钮,如图326所示。
图326服务器选择
选中HyperV功能,在弹出的窗口中单击“添加功能”按钮,如图327~图329所示。
图327服务器角色选择(一)
图328相关工具
图329服务器角色选择(二)
根据向导提示还需要完成以下步骤:
(1) 是否需要添加其他角色?
(2) 是否需要添加其他功能?
(3) 选择网卡,创建虚拟交换机。
(4) 根据实际需求选择“允许发送和接收虚拟机的实时迁移”。
(5) 选择虚拟硬盘和虚拟机配置文件的默认存储位置。
在向导的最后的确认页面中单击“安装”按钮进行安装,如图330所示。安装完成后单击“关闭”按钮,然后重启服务器。
图330添加角色和功能的最后确认页面
HyperV的功能到此已经安装完成,接下来需要创建虚拟机、安装操作系统、连接网络并使用虚拟机,如图331和图332所示。此处不再赘述详细操作过程。
图331通过HyperV管理器创建虚拟机
图332虚拟机管理
3.6本章小结
嵌套虚拟化主要用于开发和测试环境。本章讲解了如何构建基于KVM的嵌套虚拟化。有两个关键点:
(1) 设置L1级别宿主机的内核参数以启用对嵌套虚拟化的支持。
(2) 将充当L2级别宿主机的虚拟机CPU模式设置为hostpassthrough。
第4章将讲解性能监视与优化。