QEMU、KVM、libvirt三者間的關系


QEMU

QEMU提供了一個開源的服務器全虛擬化解決方案,它可以使你在特定平台的物理機上模擬出其它平台的處理器,比如在X86 CPU上虛擬出Power的CPU,此時的Guest OS感覺不到虛擬機的存在,就像運行在物理機上,QEMU可以單獨使用模擬CPU和各種外設,也可以作為一個用戶空間工具和運行在內核中的KVM結合使用以充分發揮KVM的功能。

KVM

KVM是一個基於內核的虛擬機(Linux中一個可加載模塊),在硬件支持虛擬化(intel VT,AMD-V)的X86平台上實現了全虛擬化功能,由於用戶不能直接操作內核,所以它還需要一個用戶空間工具,一個修改過的QEMU,這樣用戶可以通過QEMU去使用KVM,QEMU專門提供了一些命令工具來操作KVM。

qemu-img:用來進行磁盤管理的一個工具

qemu-system-x86_64:用來專門創建x86平台的虛擬機的命令行工具

libvirt

libvirt是為了更方便地管理平台虛擬化技術而設計的開放源代碼的應用程序接口、守護進程和管理工具,它不僅提供了對虛擬化客戶機的管理,也提供了對虛擬化網絡和存儲的管理。盡管libvirt項目最初是為Xen設計的一套API,但是目前對KVM等其他Hypervisor的支持也非常的好。libvirt支持多種虛擬化方案,既支持包括KVM、QEMU、Xen、VMware、VirtualBox等在內的平台虛擬化方案,又支持OpenVZ、LXC等Linux容器虛擬化系統,還支持用戶態Linux(UML)的虛擬化。libvirt是一個免費的開源的軟件,使用的許可證是LGPL(GNU寬松的通用公共許可證),使用libvirt庫進行鏈接的軟件程序不需要一定選擇開源和遵守GPL許可證。

libvirt其實質就是對針對不同的hypervisor的命令進行了一個封裝,libvirt針對不同的開發語言提供了api接口,如python、c等;libvirtd是linux的一個守護進程,使用libvirt必須先啟動這個守護進程。

因為libvirt是目前使用最為廣泛的對KVM虛擬機進行管理的工具和應用程序接口(API),而且一些常用的虛擬機管理工具(如virsh、virt-install、virt-manager等)和雲計算框架平台(如OpenStack、OpenNebula、Eucalyptus等)都在底層使用libvirt的應用程序接口。

libvirt作為中間適配層,讓底層Hypervisor對上層用戶空間的管理工具是可以做到完全透明的,因為libvirt屏蔽了底層各種Hypervisor的細節,為上層管理工具提供了一個統一的、較穩定的接口(API)。libvirt對多種不同的Hypervisor的支持是通過一種基於驅動程序的架構來實現的。libvirt對不同的Hypervisor提供了不同的驅動:對Xen有Xen的驅動,對QEMU/KVM有QEMU驅動,對VMware有VMware驅動。在libvirt源代碼中,可以很容易找到qemu_driver.c、xen_driver.c、xenapi_driver.c、vmware_driver.c、vbox_driver.c這樣的驅動程序源代碼文件。

libvirt作為中間適配層,讓底層Hypervisor對上層用戶空間的管理工具是可以做到完全透明的,因為libvirt屏蔽了底層各種Hypervisor的細節,為上層管理工具提供了一個統一的、較穩定的接口(API)。通過libvirt,一些用戶空間管理工具可以管理各種不同的Hypervisor和上面運行的客戶機,它們之間基本的交互框架如下圖所示。


虛擬機管理工具通過libvirt管理各種類型的虛擬機


在libvirt中涉及到幾個重要的概念,解釋如下:

1.節點(Node):一個物理機器,上面可能運行着多個虛擬客戶機。Hypervisor和Domain都運行在Node之上。

2.Hypervisor:也稱虛擬機監控器(VMM),如KVM、Xen、VMware、Hyper-V等,是虛擬化中的一個底層軟件層,它可以虛擬化一個節點讓其運行多個虛擬客戶機(不同客戶機可能有不同的配置和操作系統)。

3.域(Domain):是在Hypervisor上運行的一個客戶機操作系統實例。域也被稱為實例(instance,如亞馬遜的AWS雲計算服務中客戶機就被稱為實例)、客戶機操作系統(guest OS)、虛擬機(virtual machine),它們都是指同一個概念。

關於節點、Hypervisor和域的關系,可以簡單地用下圖來表示。


節點、Hypervisor和域三者之間的關系

在了解了節點、Hypervisor和域的概念之后,用一句話概括libvirt的目標,就是:為了安全高效的管理節點上的各個域,而提供一個公共的穩定的軟件層。當然,這里的管理,既包括本地的管理,也包含遠程的管理。具體地講,libvirt的管理功能主要包含如下五個部分:

(1)域的管理:包括對節點上的域的各個生命周期的管理,如:啟動、停止、暫停、保存、恢復和動態遷移。也包括對多種設備類型的熱插拔操作,包括:磁盤、網卡、內存和CPU,當然不同的Hypervisor上對這些熱插拔的支持程度有所不同。

(2)遠程節點的管理:只要物理節點上運行了libvirtd這個守護進程,遠程的管理程序就可以連接到該節點進程管理操作,經過認證和授權之后,所有的libvirt功能都可以被訪問和使用。libvirt支持多種網絡遠程傳輸類型,如SSH、TCP套接字、Unix domain socket、支持TLS的加密傳輸等。假設使用最簡單的SSH,則不需要額外配置工作,比如:example.com節點上運行了libvirtd,而且允許SSH訪問,在遠程的某台管理機器上就可以用如下的命令行來連接到example.com上,從而管理其上的域。

virsh -c qemu+ssh://root@example.com/system

(3)存儲的管理:任何運行了libvirtd守護進程的主機,都可以通過libvirt來管理不同類型的存儲,如:創建不同格式的客戶機鏡像(qcow2、raw、qde、vmdk等)、掛載NFS共享存儲系統、查看現有的LVM卷組、創建新的LVM卷組和邏輯卷、對磁盤設備分區、掛載iSCSI共享存儲,等等。當然libvirt中,對存儲的管理也是支持遠程管理的。

(4)網絡的管理:任何運行了libvirtd守護進程的主機,都可以通過libvirt來管理物理的和邏輯的網絡接口。包括:列出現有的網絡接口卡,配置網絡接口,創建虛擬網絡接口,網絡接口的橋接,VLAN管理,NAT網絡設置,為客戶機分配虛擬網絡接口,等等。

(5)提供一個穩定、可靠、高效的應用程序接口(API)以便可以完成前面的4個管理功能。

libvirt主要由三個部分組成,它們分別是:應用程序編程接口(API)庫、一個守護進程(libvirtd)和一個默認命令行管理工具(virsh)。應用程序接口(API)是為了其他虛擬機管理工具(如virsh、virt-manager等)提供虛擬機管理的程序庫支持。libvirtd守護進程負責執行對節點上的域的管理工作,在用各種工具對虛擬機進行管理之時,這個守護進程一定要處於運行狀態中,而且這個守護進程可以分為兩種:一種是root權限的libvirtd,其權限較大,可以做所有支持的管理工作;一種是普通用戶權限的libvirtd,只能做比較受限的管理工作。virsh是libvirt項目中默認的對虛擬機管理的一個命令行工具,將在6.2節中詳細介紹該工具。


參考來源:

KVM虛擬化原理與實踐(連載)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM