1. 虚拟化嵌套(VM-in-VM)
你是否在开发测试时希望打包一整套环境?你是否遇到过复杂的软件集群在POC演示时希望快速部署?你是否遇到过多项目之间即希望有独立环境却没有足够的机器?
虚拟化嵌套可以在虚拟机中传递的物理 CPU 虚拟化特性(vmx/svm),即可以在虚拟机中再次进行虚拟化(VM-in-VM)。
目前大部分的公有云环境的虚拟机禁用了虚拟化嵌套能力,其应用场景目前大多还是在开发测试环境以少量高性能机器搭建多套全隔离环境,但由于多层虚拟化带来了较大的性能损耗,生产环境不推荐使用。
使用嵌套虚拟化,我们首先要看下当前的系统中有没有配置支持嵌套,查看当前系统是否支持 nested
systool -m kvm_intel -v | grep -i nested
nested = "N"
#或者这样查看
cat /sys/module/kvm_intel/parameters/nested
N
Y
: 结果为Y
表示当前的操作系统已经支持了嵌套虚拟化N
: 表示当前操作系统未配置嵌套虚拟化
如果结果为 N,可以通过以下方式开启
1.1. 开启 nested 方法1
编辑或创建文件 /etc/modprobe.d/kvm-nested.conf
,文件包含以下内容:
options kvm_intel nested=1
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 #重新加载该模块
可以再查看下 nested 状态,看看是否支持
1.2. 开启 nested 方法2
另一种方法是添加引导参数,需要在 kernel 那一行的末端加上 kvm-intel.nested=1
参数,然后重启系统
#修改grub.conf
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title Red Hat Enterprise Linux Server (3.18.3-1.el6.elrepo.x86_64)
root (hd0,0)
kernel /vmlinuz-3.18.3-1.el6.elrepo.x86_64 ro root=UUID=9c1afc64-f751-473c-aaa6-9161fff08f6f rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcy
rheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet kvm-intel.nested=1
...
上面修改之后, 重启系统, 用 uname -r
查看系统内核, 并检查 nested 是否支持
1.3. 虚拟机支持配置
仅当前操作系统支持嵌套虚拟化还不行,在创建虚拟机的时候也要指定允许当前创建的虚拟机使用嵌套虚拟化的功能。
1.3.1. libvirt 模式
如果你使用 libvirt 管理虚拟机,需要修改虚拟机 xml 文件中 CPU 的定义,下面三种定义都可以
Custom 模式:
配置信息如下:
<cpu mode='custom' match='exact'>
<model fallback='allow'>core2duo</model>
<feature policy='require' name='vmx'/>
</cpu>
这种方式为虚拟机定义需要模拟的 CPU 类型 "core2duo", 并且为虚拟机添加 "vmx" 特性
host-mode 模式:
<cpu mode='host-model'>
<model fallback='allow'/>
</cpu>
host 模式直接配置 fallback 为 allow。
host-passthrough 模式:
<cpu mode='host-passthrough'>
<topology sockets='2' cores='2' threads='2'/>
</cpu>
CPU 穿透,在虚拟机中看到的 vcpu 将会与物理机的 CPU 同样配置,这种方式缺点在于如果要对虚拟机迁移,迁移的目的服务器硬件配置必须与当前物理机一样
1.3.2. qemu-kvm 命令行启动虚拟机
如果你使用 qemu-kvm 命令行启动虚拟机,那么可以简单的添加
-enable-kvm -cpu qemu64,+vmx
设置虚拟机 CPU 为 qemu64 型号,添加 vmx 支持
1.4. 使用验证
假设机器系统嵌套如下:
| --- 底层物理机-PHY(物理机需要开启 nested 功能)
| ---------|- 虚拟机-VM(第一层虚拟机,需要启用 nested 功能)
|--------- 虚拟机内虚拟机-innerVM(正常创建和运行)
|--------- 理论可以无限层嵌套
一般两次嵌套后虚拟化的性能的损耗就能明显体现,这里核心是在 虚拟机-VM
的系统支持虚拟化,可以通过如下方式判断:
cat /proc/cpuinfo | egrep '(vmx|svm)'
如果是 Intel 的 CPU 能过滤到 vmx 的行,如果是 AMD 的 CPU 能过滤到 svm 的行。有了 vmx 或 svm 就说明可以再次支持虚拟化,即可以正常创建和运行 虚拟机内虚拟机-innerVM