「QEMU and KVM」

  CREATED BY JENKINSBOT

QEMU – Quick Emulator

QEMU是一个管理程序(Virtual Machine Monitor),一个管理和分配硬件资源的程序。QEMU通过动态二进制转换来模拟CPU,并提供一系列的硬件模型,使客户操作系统认为自己和硬件直接打交道,其实是同QEMU模拟出来的硬件打交道,QEMU再将这些指令翻译给真正硬件进行操作。通过这种模式,客户操作系统可以和主机上的硬盘、网卡、CPU、CD-ROM、音频设备、USB设备进行交互。但由于所有指令都需要经过QEMU来翻译,因而性能会比较差。

所以说,QEMU是一个模拟器。

http://wiki.qemu.org/Main_Page
http://wiki.qemu.org/Contribute
http://wiki.qemu.org/Documentation

KVM – Kernel-based Virtual Machine

KVM实际是Linux内核提供的虚拟化架构,可将内核直接充当Hypervisor来使用。KVM需要处理器硬件本身支持虚拟化扩展,如intel VT和AMD AMD-V技术。KVM自2.6.20版本后已合入主干并发行,除此之外,还以模块形式被移植到FreeBSD和illumos中。除了支持x86的处理器,同时也支持S/390、PowerPC、IA-61以及ARM等平台。

KVM包含一个内核模块kvm.ko用来实现核心虚拟化功能,以及一个和处理器强相关的模块(如kvm-intel.ko或kvm-amd.ko)。KVM本身不实现任何模拟,仅仅是暴露了一个/dev/kvm接口,这个接口可被宿主机用来主要负责vCPU的创建,虚拟内存的地址空间分配,vCPU寄存器的读写以及vCPU的运行。有了KVM以后,guest os的CPU指令不用再经过QEMU来转译便可直接运行,大大提高了运行速度。但KVM的kvm.ko本身只提供了CPU和内存的虚拟化,所以它必须结合QEMU才能构成一个完整的虚拟化技术。

QEMU-KVM

从前面的介绍可知,KVM负责CPU虚拟化+内存虚拟化,实现了CPU和内存的虚拟化,但kvm并不能模拟其他设备,还必须有个运行在用户空间的工具才行。KVM的开发者选择了比较成熟的开源虚拟化软件QEMU来作为这个工具,QEMU模拟IO设备(网卡,磁盘等),对其进行了修改,最后形成了QEMU-KVM。

从前面的介绍可知,KVM负责CPU虚拟化+内存虚拟化,实现了CPU和内存的虚拟化,但kvm并不能模拟其他设备,还必须有个运行在用户空间的工具才行。KVM的开发者选择了比较成熟的开源虚拟化软件QEMU来作为这个工具,QEMU模拟IO设备(网卡,磁盘等),对其进行了修改,最后形成了QEMU-KVM。

在QEMU-KVM中:KVM运行在内核空间;QEMU运行在用户空间,实际模拟创建、管理各种虚拟硬件。QEMU将KVM整合了进来,通过ioctl调用/dev/kvm,从而将CPU指令的部分交给内核模块来做,KVM实现了CPU和内存的虚拟化,但KVM不能虚拟其他硬件设备,因此qemu还有模拟IO设备(磁盘,网卡,显卡等)的作用,KVM加上QEMU后就是完整意义上的服务器虚拟化。

综上所述,QEMU-KVM具有两大作用:

	* 提供对CPU,内存(KVM负责),IO设备(QEMU负责)的虚拟;
	* 对各种虚拟设备的创建,调用进行管理(QEMU负责);

这个方案中,QEMU模拟其他的硬件,如网络、硬盘,同样会影响这些设备的性能。于是又产生了半虚拟化设备virtio_blk, virtio_net,提高设备性能。

libvirt

是一个管理虚拟化平台的工具包;
可以从C,Python,Perl,Java等访问;
支持KVM,QEMU,Xen,Virtuozzo,VMWare ESX,LXC,BHyve等;
针对Linux,FreeBSD,Windows和OS-X;
许多应用程序都是使用该库来管理虚拟机;使用libvirt的应用可以参考「Applications using libvirt」一文。

更多的内容可以参考libvirt的主页

virt-manager

是通用桌面管理工具,能够跨本地和远程访问的虚拟机管理程序管理虚拟机。它针对家庭和小型办公室的使用,最多可管理 10-20 台主机及其 VM。该工具实质上还是使用了libvirt库。

更多的管理工具,参考 Applications using libvirt 页面。

总结

目前来说,QEMU是一个独立的虚拟化解决方案,并不依赖KVM(它本身自己可以做CPU和内存的模拟,只不过效率较低),而KVM是另一套虚拟化解决方案,对CPU进行虚拟效率较高(采用了硬件辅助虚拟化),但本身不提供其他设备的虚拟化,借用了QEMU的代码进行了定制,所以KVM方案一定要依赖QEMU。

即使后来RedHat后来开发了libvirt,也只能简单的认为libvirt是个虚拟机管理工具,仍然需要通过用户空间QEMU来与KVM进行交互。

相关文章

Difference between KVM and QEMU

参考文献

KVM – Kernel Virtual Machine
homepage of the virt-manager
QEMU,KVM及QEMU-KVM介绍
Hypervisor, KVM, QEMU总结
Wikipedia/QEMU, Hypervisor
Qemu-KVM基本工作原理分析