2010/07/23

[轉載] KVM-ON-KVM:Nested Virtualization

[來源: http://www.liangsuilong.info/?p=851]

早前听Fai Wong (lazyfai)说起过KVM可以支持AMD SVM的nested virtualization,凭借着好奇心就折腾来玩玩。nested virtualization有不少学问值得探讨的,这里得感谢lazyfai为本人解答了。

在介绍KVM-ON-KVM前,本人得先说清楚nested paging和nested virtualization 的区别。因为本人在Google搜索KVM的nested virtualization发现很多是关于nested paging,但是实际上两者完全是两码事。还有很多老外都搞不清楚nested virtualization和nested paging,常常以为前者就是后者。

Nested Virtualization:实际就是在一个正在运行的虚拟机内安装多一个虚拟机,并且使之运行,有时也称之为 Nested VMs。

Nested Paging: 其作用就是为了把Guest的内存地址直接映射至Host的系统内存地址上,让CPU能够像读取实体系统的内存地址一样可以直接读取虚拟系统的内存地址。这种方案可以减轻了VMM因为内存地址转换的负担,提升内存读写性能。 从原理上说Nested Paging和Nested Virtualization是毫不相干的,所以本篇文章不会探讨前者。

Nested Virtualization并非KVM一家独有的技术,VMware的虚拟化软件同样支持Nested Virtualization,但是其技术无法无限地Nested下去。其第一层虚拟机必须使用VT-x/AMD-V硬件辅助虚拟化技术,而第二层虚拟机则必须使用传统的二进制软件转换的虚拟化技术。因此无法再运行第三层甚至更多层虚拟机。 相反KVM必须使用硬件辅助虚拟化技术,理论上可以无限地Nested下去,只要机器有足够的速度。KVM的Nested Virtualization暂时只能应用于AMD的处理器上,只要支持AMD-V虚拟化技术,就可以运行Nested Virtualization,包括老旧的K8架构,这与Nested Paging必须运行在K10架构上不同。从qemu-kvm的帮助选项上看出此特性紧限于AMD处理器。至于Intel的处理器什么时候支持 Nested Virtualization,KVM说正在做,但是做了很久都还没有突破性消息。

-enable-nesting enable support for running a VM inside the VM (AMD only)

硬件平台如旧:

CPU:AMD Athlon 64 X2 4200+ RAM:4GB DDR2-800 Host OS:Fedora 13 (2.6.33.6-147.fc13.x86_64) Guest OS 1:Fedora 13 (2.6.33.3-85.fc13.x86_64)1st Layer KVM Guest OS 2:Fedora 13 (2.6.33.3-85.fc13.x86_64) 2st Layer KVM QEMU-KVM:0.12.3

安装好Host系统以后,就可以安装KVM,Fedora下可以尝试安装整个虚拟化组:

yum groupinstall Virtualization

实际上虚拟化组里面的软件包用不上的,比如virt-manager和libvirt。virt-manager里面没有Nested VMs的选项,所以实际上只能通过命令行工具操作KVM。其他发行版可以尝试qemu-kvm、qemu-img等几个常见的命令即可。 然后加载AMD的KVM模块:

modprobe kvm-amd nested=1

注意,因为需要运行Nested Virtualization,所以后面需要添加nested=1参数。查看是否启动了Nested Virtualization:

dmesg | grep kvm

若是支持Nested Virtualization,终端回返回如下信息:

kvm: Nested Virtualization enabled

创建磁盘镜像并且启动KVM:

qemu-img create -f qcow2 kvm-test.img qemu-kvm -m 2048 -drive file=kvm-test.img,cache=writeback -enable-nesting -enable-kvm -cdrom Fedora-13-x86_64-Live.iso

为了启动Nested Virtualization,qemu-kvm后面需要添加-enable-nesting参数。至于其他参数,则跟平常的KVM一样。为了测试方便,此次测试并没有为KVM搭建桥接网络,而是使用了默认的NAT。KVM启动后,就需要为虚拟机安装操作系统。紧接就是安装KVM和加载KVM模块,方法与步骤和前文一样,这里就不再详述了。 在确保所有组件都已经安装妥当并且确保KVM模块已经加载的情况下启动KVM,并且加载第一层KVM内的光盘: qemu-kvm -m 512-cdrom /dev/cdrom 纯粹是试验,本人只在第二层虚拟机启动了Live CD,以验证第二层KVM能够运行Linux即可。因为是光盘,所以启动的速度相当慢,I/O性能已经被压榨尽了,但最后还是能够启动并且能够登入 GDM,效果图如下:

实际上,第一层KVM虚拟机内的同样也能够加载kvm-amd模块,才能够再运行多一个KVM实例:

第一层虚拟机内的虚拟CPU,能够支持AMD的svm指令:


当然家用机并不适合跑Nested Virtualization,姑且不论CPU和内存的压力如何大,就以磁盘的读写性能也得够呛了。CPU再快,内存的容量再大。硬盘的读写速度上不去,第二层虚拟机甚至在第一层虚拟机就已经明显感觉到卡机的迹象。如果有专门的存储设备,虚拟机的速度将会有不错的提升。

Nested Virtualization虽然在家用机上用处近乎没有,但是在数据中心内,则可以更加优化系统资源,细化各种计算资源的用途和调配,目的就是要运算能力使用得更加恰当,令服务器能够承担更多用途和任务。

KVM理论上能够支持无限次数Nested Virtualization,但需要的是每一层Guest都要运行支持KVM的Linux系统,如果运行的Windows或者其他不支持KVM的系统,那么则只能安装其他虚拟化软件运行多一层虚拟机,无法再向下扩展。

最后,还是要感谢Fai Wong(lazyfai)的热情帮助。