嵌套虚拟化是指在虚拟化的客户机中运行一个Hypervisor,从而再虚拟化运行一个客户机。 嵌套虚拟化不仅包括相同Hypervisor的嵌套(如KVM嵌套KVM、Xen嵌套Xen等),也包括不同Hypervisor的相互嵌套(如KVM嵌套嵌套Xen等)根据嵌套虚拟化的概念可知,其不仅包括两层嵌套(如KVM嵌套KVM),还包括多层的嵌套(如KVM嵌套KVM再嵌套KVM) 。
嵌套虚拟化的五大应用场景。
1)IaaS类型的云计算提供商 :如果有了嵌套虚拟化功能的支持,就可以为其客户提供让客户可以自己运行所需Hypervisor和客户机的能力。
2)为测试和调试Hypervisor带来了非常大的便利:了嵌套虚拟化的支持,被调试Hypervisor运行在更底层的Hypervisor之上,遇到被调试Hypervisor的系统崩溃,也只需要在底层的Hypervisor上重启被调试系统即可。
3)在一些为了起到安全作用的带有Hypervisor的固件上:如果有嵌套虚拟化的支持,则在它上面不仅可以运行一些普通的负载,还可以运行一些Hypervisor启动另外的客户机。
4)嵌套虚拟化的支持,对虚拟机系统的动态迁移也提供了新的功能:从而可将一个Hypervisor及其上面运行的客户机作为单一的节点进行动态迁移,这对服务器的负载均衡及灾难恢复等有积极意义。
5)嵌套虚拟化的支持,对于系统隔离性、安全性方面也提供更多的实施方案。
KVM嵌套KVM,既是在KVM上面运行的第一级客户机中再加载kvm和kvm_intel(或kvm_amd)模块,然后在第一级的客户机中用qemu-kvm启动带有kvm加速的第二级客户机。“KVM嵌套KVM”的基本架构示意图如下:
“KVM嵌套KVM”的基本架构示意图中低层是具有Intel VT或AMD-V特性的硬件系统,硬件层之上就是底层的宿主机系统(Level 0,即L0); 在L0 宿主机中可以运行加载有KVM模块的客户及(Level 1 第一级,即L1); 在L1客户机中通过QEMU/KVM启动一个普通的客户机(Level 2 第二级,即L2); 如果KVM还可以做多级的嵌套虚拟化,各个级别的操作系统被依次称为:L0、L1、L2、L3、L4........,其中L0向L1提供硬件虚拟化环境(Intel VT 或 AMD-V),L1向L2提供硬件虚拟化环境,依次类推。
KVM对“KVM嵌套KVM”的支持从2010年就开始了,目前已经比较成熟了。“KVM嵌套KVM”功能的配置和使用,有如下几个步骤:
1)在进行虚拟机的嵌套时需要在底层的宿主机中打开kvm嵌套kvm的功能方法为在进行虚拟机的kvm模块加载的时候进行一些设定和使用qemu-system-x86_64的时候进行一些参数的设定具体如下()这是kvm的L0:
root@ubuntu:~# rmmod kvm_intel ----此时kvm_intel模块已经加载需要将其删除才能进行参数设定
root@ubuntu:~# lsmod | grep kvm
kvm 451511 0
root@ubuntu:~# modprobe kvm_intel nested=1
root@ubuntu:~# cat /sys/module/kvm_intel/parameters/nested
Y
是Y则表示kvm嵌套kvm的功能已经打开了
root@ubuntu:~# lsmod | grep kvm
kvm_intel 143060 6
kvm 451511 1 kvm_intel
2) 使用qemu打开一个虚拟机在启动命令上加上“-cpu host”或“-cpu qemu64,+vmx”如下面所示:
root@ubuntu:~/qemu# qemu-system-x86_64 -enable-kvm -m 1024 -smp 4 -hda ubuntu.raw -cpu host -net nic -net tap,ifname=tap1 -monitor stdio
在开启的虚拟机中查看kvm 模块的加载情况,如下图所示:
因为我的CPU为奔腾处理器所以在执行cat /proc/cpuinfo | grep ‘vmx|svm’的时候,依旧什么都没有。
此时L1已经具备作为一个宿主机的功能,现在安装qemu开始进行虚拟机的创建。此时的L 1相当与一个宿主机了。此处我使用的是mount挂载nfs,在挂载的地方,放上需要使用的镜像文件,直接使用以前的镜像文件,而没有从新制作。如下图所示:
我通过我的Windows端进行vnc连接如下图:
此时虚拟化的嵌套就此完成。