研扬UP2折腾记----KVM嵌套虚拟化


有时候我们会遇到需要多台服务器在部署实施前进行实验,这时候我们可以用多台虚机解决,但是如果这些实验是虚拟化的实验呢。一般情况下虚机中是不允许再建虚机的,虚机的CPU不支持虚拟化。这种情况我们可以使用嵌套虚拟化来解决这个问题。

这篇文章是基于Debian10来做的,CentOS的小伙伴也可以看看,基本是大同小异,实在不行可以去bing搜索,网上大部分都是针对CentOS。还有一点需要说明的是,我所用服务器使用的是UEFI引导,修改grub.conf对UEFI引导来说没有用,grub.conf文件里没有相应的关键字。

进入正题,首先查看当前服务器是否已经开启了嵌套虚拟化,执行如下命令:

cat /sys/module/kvm_intel/parameters/nested

这是针对Intel CPU的服务器的,手头没有AMD CPU的服务器,所以没法验证,按从国外网站找到的资料AMD CPU服务器使用的命令如下:

cat /sys/module/kvm_amd/parameters/nested

有AMD CPU的小伙伴可以验证一下,我有空了也会找个AMD CPU的主机验证。

执行命令后返回N表示没有开启嵌套虚拟化,如果是Y则表示已经开启了嵌套虚拟化,如下图:

需要开启嵌套虚拟化,需要将内核升级至3.18以上,怎么升级内核请自行查找资料。

内核是3.18以上的,在/etc/modprobe.d/目录创建文件kvm-nested.conf,在文件中写入如下内容:

options kvm_intel nested=1

注意区分是I家还是A家的CPU。

保存文件,执行命令 modprobe -r kvm_intel先卸载kvm_intel模块,再执行modprobe kvm_intel重新加载kvm_intel模块,再执行cat /sys/module/kvm_intel/parameters/nested查看嵌套虚拟化是否已经开启,如图:

编辑虚机,执行命令:

virsh edit <虚拟机名称>

修改CPU标签的内容,有以下三种方式:

第一种:

<cpu mode='custom' match='exact'>
    <model fallback='allow'>core2duo</model>
    <feature policy='require' name='vmx'/>
</cpu>

第二种:

<cpu mode='host-model'>
    <model fallback='allow'/>
</cpu>

第三种(需要注意,此方式为CPU穿透方式,如果需要虚机迁移,则目标宿主服务器硬件必须和当前宿主服务器硬件相同):

<cpu mode='host-passthrough'>
    <topology sockets='2' cores='2' threads='2'/>
</cpu>

再次启动虚机,这个时候虚机就已经开启了嵌套虚拟化。

扩展一下,Windows Server的Hyper-V也可以开启嵌套虚拟化,开启方式比较简单,以管理员身份启动PowerShell执行如下命令:

Set-VMProcessor -ExposeVirtualizationExtensions $true -VMName <虚拟机名称>