1. 程式人生 > >QEMU和QEMU-KVM的關係

QEMU和QEMU-KVM的關係

不同的基於KVM的虛擬化平臺,可能會採用不同的虛擬化元件,目前主流的採用QEMU-KVM元件,但在不同的產品裡版本有所不同,功能也有差異,下面就幾個概念進行梳理下

KVM:Kernel-Based Virtual Machine 基於核心的虛擬機器,是Linux核心的一個可載入模組,通過呼叫Linux本身核心功能,實現對CPU的底層虛擬化和記憶體的虛擬化,使Linux核心成為虛擬化層,需要x86架構的,支援虛擬化功能的硬體支援(比如Intel VT,AMD-V),是一種全虛擬化架構。KVM在2007年年2月被匯入Linux 2.6.20核心中。從存在形式來看,它包括兩個核心模組:kvm.ko  和  kvm_intel.ko(或kvm_amd.ko),本質上,KVM是管理虛擬硬體裝置的驅動,該驅動使用字元裝置/dev/kvm(由KVM本身建立)作為管理介面,主要負責vCPU的建立,虛擬記憶體的分配,vCPU暫存器的讀寫以及vCPU的執行

QEMU:是一套由Fabrice Bellard編寫的模擬處理器的自由軟體,它是一個完整的可以單獨執行的軟體,可以獨立模擬出整臺計算機,包括CPU,記憶體,IO裝置,通過一個特殊的“重編譯器”對特定的處理器的二進位制程式碼進行翻譯,從而具有了跨平臺的通用性。QEMU有兩種工作模式:系統模式,可以模擬出整個電腦系統,另一種是使用者模式,可以執行不同與當前硬體平臺的其他平臺上的程式(比如在x86平臺上執行跑在ARM平臺上的程式);其程式碼地址 http://git.qemu.org/qemu.git  ,有興趣的同學可以自己去看看,目前最新的版本是2.7.0,在0.9.1及之前版本還可以使用kqemu加速器(可以理解為QEMU的一個外掛,用來提高QEMU的翻譯效能,支援Windows平臺),但1.0以後版本就只能使用qemu-kvm(只支援Linux)進行加速了,1.3版本後QEMU和QEMU-KVM合二為一了。

QEMU-KVM:從前面對KVM核心模組的介紹知道,它只負責CPU和記憶體的虛擬化,載入了它以後,使用者就可以進一步通過工具建立虛擬機器(KVM提供介面),但僅有KVM還是不夠的,使用者無法直接控制核心去做事情(KVM只提供介面,怎麼建立虛擬機器,分配vCPU等並不在它上面進行),還必須有個執行在使用者空間的工具才行,KVM的開發者選擇了比較成熟的開源虛擬化軟體QEMU來作為這個工具,並對其進行了修改,最後形成了QEMU-KVM。

在QEMU-KVM中,KVM執行在核心空間,QEMU執行在使用者空間,實際模擬建立,管理各種虛擬硬體,QEMU將KVM整合了進來,通過/ioctl 呼叫 /dev/kvm,從而將CPU指令的部分交給核心模組來做,KVM實現了CPU和記憶體的虛擬化,但kvm不能虛擬其他硬體裝置,因此qemu還有模擬IO裝置(磁碟,網絡卡,顯示卡等)的作用,KVM加上QEMU後就是完整意義上的伺服器虛擬化

當然,由於qemu模擬io裝置效率不高的原因,現在常常採用半虛擬化的virtio方式來虛擬IO裝置,另文再談

綜上所述,QEMU-KVM具有兩大作用:

1.提供對cpu,記憶體(KVM負責),IO裝置(QEMU負責)的虛擬

2.對各種虛擬裝置的建立,呼叫進行管理(QEMU負責)

libvirt

順帶提一提libvirt,這是RedHat開始支援KVM後,大概是覺得QEMU+KVM方案中的使用者空間虛擬機器管理工具不太好用或者通用性不強,所以乾脆搞了個libvirt出來,一個針對各種虛擬化平臺的虛擬機器管理的API庫,一些常用的虛擬機器管理工具如virsh(類似vim編輯器),virt-install,virt-manager等和雲端計算框架平臺(如OpenStack,OpenNebula,Eucalyptus等)都在底層使用libvirt提供的應用程式介面。

libvirt主要由三個部分組成:API庫,一個守護程序 libvirtd 和一個預設命令列管理工具 virsh。

總結:

目前來說,QEMU是一個獨立的虛擬化解決方案,並不依賴KVM(它本身自己可以做CPU和記憶體的模擬,只不過效率較低),而KVM是另一套虛擬化解決方案,對CPU進行虛擬效率較高(採用了硬體輔助虛擬化),但本身不提供其他裝置的虛擬化,借用了QEMU的程式碼進行了定製,所以KVM方案一定要依賴QEMU

即使後來RedHat後來開發了libvirt,也只能簡單的認為是個虛擬機器管理工具,仍然需要通過使用者空間QEMU來與KVM進行互動