1. 程式人生 > >Hypervisor, KVM, QEMU總結

Hypervisor, KVM, QEMU總結

Hypervisor

1.概念

Hypervisor——一種執行在基礎物理伺服器和作業系統之間的中間軟體層,可允許多個作業系統和應用共享硬體。也可叫做VMM( virtual machine monitor ),即虛擬機器監視器。

Hypervisors是一種在虛擬環境中的“元”作業系統。他們可以訪問伺服器上包括磁碟和記憶體在內的所有物理裝置。Hypervisors不但協調著這些硬體資源的訪問,而且在各個虛擬機器之間施加防護。當伺服器啟動並執行Hypervisor時,它會載入所有虛擬機器客戶端的作業系統同時會分配給每一臺虛擬機器適量的記憶體,CPU,網路和磁碟。

2.作用

Hypervisor是所有虛擬化技術的核心。 非中斷地支援多工作負載遷移的能力是Hypervisor的基本功能。

3.種類

目前市場上各種x86 管理程式(hypervisor)的架構存在差異,三個最主要的架構類別包括:

I型:虛擬機器直接執行在系統硬體上,建立硬體全模擬例項,被稱為“裸機”型。
裸機型在虛擬化中Hypervisor直接管理呼叫硬體資源,不需要底層作業系統,也可以將Hypervisor看作一個很薄的作業系統。這種方案的效能處於主機虛擬化與作業系統虛擬化之間。

II型:虛擬機器執行在傳統作業系統上,同樣建立的是硬體全模擬例項,被稱為“託管(宿主)”型。託管型/主機型Hypervisor執行在基礎作業系統上,構建出一整套虛擬硬體平臺(CPU/Memory/Storage/Adapter),使用者根據需要安裝新的作業系統和應用軟體,底層和上層的作業系統可以完全無關化,如Windows執行Linux作業系統。主機虛擬化中VM的應用程式呼叫硬體資源時需要經過:VM核心->Hypervisor->主機核心,因此相對來說,效能是三種虛擬化技術中最差的。

Ⅲ型:虛擬機器執行在傳統作業系統上,建立一個獨立的虛擬化例項(容器),指向底層託管作業系統,被稱為“作業系統虛擬化”。作業系統虛擬化是在作業系統中模擬出執行應用程式的容器,所有虛擬機器共享核心空間,效能最好,耗費資源最
少。但是缺點是底層和上層必須使用同一種作業系統,如底層作業系統執行的是Windows系統,則VPS/VE就必須執行Windows。

Hypervisor示例圖

廠商
目前市場主要廠商及產品:VMware vSphere、微軟Hyper-V、Citrix XenServer 、IBM PowerVM、Red Hat Enterprise Virtulization、Huawei FusionSphere、開源的KVM、Xen、VirtualBSD等。

4.特點

軟硬體架構和管理更高效、更靈活,硬體的效能能夠更好地發揮出來。

5.多Hypervisor

伺服器虛擬化需要評估、選擇和部署hypervisor,組織通常會選擇一種主流的hypervisor:VMware的ESXi、微軟的Hyper-V或者思傑的XenServer。然而,對很多組織來說,單獨的hypervisor已經不能滿足所有的虛擬化需求。這時候可以選擇採用第二類hypervisor產品。隨著伺服器虛擬化技術的成熟,多hypervisor環境已經變得常見。但是,採用第二類虛擬化平臺時,必須要仔細考慮其成本、部署範圍和總開銷。

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的執行。

KVM是linux核心的模組,它需要CPU的支援,採用硬體輔助虛擬化技術Intel-VT,AMD-V,記憶體的相關如Intel的EPT和AMD的RVI技術,Guest OS的CPU指令不用再經過Qemu轉譯,直接執行,大大提高了速度,KVM通過/dev/kvm暴露介面,使用者態程式可以通過ioctl函式來訪問這個介面。見如下虛擬碼:

open("/dev/kvm")
ioctl(KVM_CREATE_VM)
ioctl(KVM_CREATE_VCPU)
for (;;) {
    ioctl(KVM_RUN)
        switch (exit_reason) {
        case KVM_EXIT_IO: 
        case KVM_EXIT_HLT:
    }
}

QEMU

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示例圖

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示例圖

綜上所述,QEMU-KVM具有兩大作用:
1.提供對cpu,記憶體(KVM負責),IO裝置(QEMU負責)的虛擬
2.對各種虛擬裝置的建立,呼叫進行管理(QEMU負責)

libvirt

一個針對各種虛擬化平臺的虛擬機器管理的API庫,一些常用的虛擬機器管理工具如virsh(類似vim編輯器),virt-install,virt-manager等和雲端計算框架平臺(如OpenStack,OpenNebula,Eucalyptus等)都在底層使用libvirt提供的應用程式介面。libvirt主要由三個部分組成:API庫,一個守護程序 libvirtd 和一個預設命令列管理工具 virsh。

libvirt示例圖

總結:
目前來說,QEMU是一個獨立的虛擬化解決方案,並不依賴KVM(它本身自己可以做CPU和記憶體的模擬,只不過效率較低),而KVM是另一套虛擬化解決方案,對CPU進行虛擬效率較高(採用了硬體輔助虛擬化),但本身不提供其他裝置的虛擬化,借用了QEMU的程式碼進行了定製,所以KVM方案一定要依賴QEMU
即使後來RedHat後來開發了libvirt,也只能簡單的認為是個虛擬機器管理工具,仍然需要通過使用者空間QEMU來與KVM進行互動。