有时候我们会遇到需要多台服务器在部署实施前进行实验,这时候我们可以用多台虚机解决,但是如果这些实验是虚拟化的实验呢。一般情况下虚机中是不允许再建虚机的,虚机的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 <虚拟机名称>