What's QEMU
QEMU是一個主機上的VMM(virtual machine monitor),經過動態二進制轉換來模擬CPU,並提供一系列的硬件模型,使guest os認爲本身和硬件直接打交道,實際上是同QEMU模擬出來的硬件打交道,QEMU再將這些指令翻譯給真正硬件進行操做。經過這種模式,guest os能夠和主機上的硬盤,網卡,CPU,CD-ROM,音頻設備和USB設備進行交互。但因爲全部指令都須要通過QEMU來翻譯,於是性能會比較差:html
What's KVM?
KVM實際是linux內核提供的虛擬化架構,可將內核直接充當hypervisor來使用。KVM須要處理器硬件自己支持虛擬化擴展,如intel VT 和AMD AMD-V技術。KVM自2.6.20版本後已合入主幹併發行,除此以外,還以模塊形式被移植到FreeBSD和illumos中。除了支持x86的處理器,同時也支持S/390,PowerPC,IA-61以及ARM等平臺。linux
工做原理
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才能構成一個完整的虛擬化技術,也就是下面要介紹的技術。服務器
What's 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模擬其餘的硬件,如Network, Disk,一樣會影響這些設備的性能。因而又產生了pass through半虛擬化設備virtio_blk, virtio_net,提升設備性能。工具
QEMU-KVM,是QEMU的一個特定於KVM加速模塊的分支,裏面包含了不少關於KVM的特定代碼,與KVM模塊一塊兒配合使用。
目前QEMU-KVM已經與QEMU合二爲一,全部特定於KVM的代碼也都合入了QEMU,當須要與KVM模塊配合使用的時候,只須要在QEMU命令行加上 --enable-kvm就能夠。