###嵌套虚拟化

一般情况下,我们是无法在KVM虚拟机里面再去创建虚拟机的,因为我们的KVM虚拟机的CPU默认情况下并不支持虚拟化功能,对于Inter的CPU来说,如果要支持虚拟化功能,必须要有一个叫vmx的特性,以下是一个物理服务器的CPU信息:



在CPU特性(flags)中包含了vmx这个特性,说明这台服务器是支持虚拟化功能的,也就是说我们可以在这台服务器上创建虚拟机。我们再看看以这台服务器作为宿主机,创建的虚拟机的CPU特性:

我们可以看到虚拟机的CPU特性(flags)相比起宿主机来说要少很多,并且没有vmx这个特性,所以我们是无法在这台虚拟机上创建虚拟机的。

那么,我们如何让创建出来的虚拟机的CPU也带有vmx特性呢?这就要用到所谓的嵌套虚拟化的功能了。当宿主机开启嵌套虚拟化功能时,我们在该宿主机上创建的虚拟机的CPU也可以获得vmx特性,从而可以在该虚拟机中再去创建虚拟机:


检查宿主机机是否开启了嵌套虚拟化功能:

cat
/sys/module/kvm_intel/parameters/nested结果为Y时表示宿主机支持嵌套虚拟化,为N为不支持。如何开启宿主机的嵌套虚拟化功能可参考这篇文章:
http://www.cnblogs.com/jython/p/4458807.html
<http://www.cnblogs.com/jython/p/4458807.html>

###创建支持虚拟化功能的虚拟机

当我们有了支持KVM嵌套虚拟化的宿主机后,便可以创建支持虚拟化功能的虚拟机了。我们使用libvirt来创建虚拟机,虚拟机的配置文件可以参考下面的vm01.xml文件:
<domain type = 'kvm'> <name>vm01</name> <memory>2096576</memory>
<vcpu>2</vcpu> <os> <type arch = 'x86_64' machine = 'rhel6.0.0'>hvm</type>
<boot dev = 'hd'/> </os> <features> <acpi/> <apic/> <pae/> </features> <domain
type = 'kvm'> <name>vm01</name> <memory>2096576</memory> <vcpu>2</vcpu> <os>
<type arch = 'x86_64' machine = 'rhel6.0.0'>hvm</type> <boot dev = 'hd'/> </os>
<features> <acpi/> <apic/> <pae/> </features> <cpu mode='host-model'>
<!--使虚拟机也支持虚拟化 --> <model fallback='allow'/> <topology sockets='1' cores='2'
threads='1'/> </cpu> <clock offset = 'localtime'/>
<on_poweroff>destroy</on_poweroff> <on_reboot>restart</on_reboot>
<on_crash>destroy</on_crash> <devices>
<emulator>/usr/libexec/qemu-kvm</emulator> <disk type = 'file' device = 'disk'>
<driver name = 'qemu' type = 'qcow2'/> <source file =
'/var/lib/libvirt/images/CentOS7.2-20180708.qcow2'/> <target dev = 'hda' bus =
'ide'/> </disk> <interface type='bridge'> <source bridge='virbr0'/>
<!--宿主机的网桥,virbr0为kvm模块提供给连接在该网桥上面的guest使用NAT方式访问外网 --> <target dev='vnet001'/>
<!-- 在virbr0网桥上增加的网口 --> <model type='virtio'/> <address type='pci'
domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> </interface> <input
type ='tablet' bus='usb'/> <input type = 'mouse' bus = 'ps2'/> <graphics type =
'vnc' port = '-1' listen = '0.0.0.0' autoport = 'yes'/> <console type='pty'>
<!-- 加上这行设置,否则无法使用virsh console连上虚拟机--> <target port='0'/> </console>
</devices> </domain>
使用以下命令创建虚拟机:
virsh define vm01.xml virsh start vm01
进入虚拟机,查看CPU特性,可以看到此时虚拟机的CPU已经支持vmx特性:


我们再参考上面的方式在这个虚拟机中使用libvirt再创建一台虚拟机:


可以看到虚拟机成功创建出来了。

友情链接
ioDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:ixiaoyang8@qq.com
QQ群:637538335
关注微信