KVM嵌套虚拟化实现

By | 2021年10月22日

嵌套虚拟化的实现是允许我们在虚拟机中暴露更多物理CPU的特性,进而让我们可以在虚拟机中运行虚拟机。

具体的线上使用场景目前也不太清晰….不过在公有云上跑自己的私有云不知是不是一个好的idea…

不过最近有一个测试需求,需要在虚机中再开启虚机,于是就研究了一下基于KVM的嵌套虚拟化的使用。

使用嵌套虚拟化,我们首先要看下当前的系统中有没有配置支持。

cat /sys/module/kvm_intel/parameters/nested
Y  ##结果为Y表示当前的操作系统已经支持了嵌套虚拟化,使用跑虚拟化的程序直接使用就ok了
N  ##那当然就表示当前操作系统未配置嵌套虚拟化喽

如果你的结果为N,看下配置过程吧

vi /etc/modprobe.d/kvm-nested.conf
options kvm_intel nested=1   #打开KVM内核模块的Nested特性
options kvm-intel enable_shadow_vmcs=1   #没找到相关资料
options kvm-intel enable_apicv=1         #没找到相关资料
options kvm-intel ept=1                  #没找到相关资料

配置好后保存退出
modprobe -r kvm_intel   #协助掉内核中的kvm_intel模块,注意要在所有虚拟机都关闭的情况下执行
modprobe -a kvm_intel   #重新加载该模块

之后就可以再查看下状态,看看是否支持了

光当前操作系统支持嵌套虚拟化还不成,我们在建立虚拟机的时候也要指定允许当前建立的虚拟机使用嵌套虚拟化的功能,那么给出一段建立时的命令,这里是用virt-install进行创建的虚拟机。

virt-install --name manager03 --memory=16384 --arch=x86_64 --cpu=host-model --vcpus=16 --check-cpu --os-type=linux --os-variant='rhel7'  --cdrom=/home/iso/ZStack-x86_64-DVD-2.3.0.495.iso --disk path=/home/VMDATA/manager03.img  --network bridge=br0 --noautoconsole --graphics vnc,password=xxxx,listen=0.0.0.0,port=8000
--cpu=host-model  ##这一段就是配置当前的虚拟机支持嵌套虚拟化的,如果不配置这段,
                    虚拟机启动后是无法再运行虚拟化的

创建虚拟机后可以查看下虚拟机的配置文件
virsh edit manager03
......
  <cpu mode='host-model'>
    <model fallback='allow'/>
  </cpu>

我们可以在配置文件中过滤到cpu相关的配置行,如果mode的信息为host-model即当前的虚拟机可以再创建一层虚拟机

目前翻着资料,kvm的cpu的工作模式有以下三种,下面是我个人的理解,不对之处欢迎指正

custom

这种目前看来是默认的,就是你的虚拟机起来后无法再运行虚拟化程序,其他的一些特性还没研究到,如果看到了贴在这里

host-model

使用host-model看到的VCPU:Libvir 会根据物理cpu的型号,从规定的CPU中选择一种最接近的CPU型号

processor       : 3
vendor_id       : GenuineIntel
cpu family      : 6
model           : 44
model name      : Westmere E56xx/L56xx/X56xx (Nehalem-C)

host-passthrough

使用host-passthrough看到的VCPU:直接看到物理CPU的型号

processor       : 3
vendor_id       : GenuineIntel
cpu family      : 6
model           : 44
model name      : Intel(R) Xeon(R) CPU           X5650  @ 2.67GHz

以上2中host类型的cpu工作模式都可以在虚拟机中再次运行虚拟机,不过要注意host-passthrough 方式虚拟机不能迁移到不同型号的CPU上

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注