Libvirt是由Redhat開發的一套開源的軟件工具,目標是提供一個通用和穩定的軟件庫來高效、安全地管理一個節點上的虛擬機,並支持遠程操做。它由如下的模塊組成:編程
一個庫文件,實現管理接口安全
一個守護進程(libvirtd)服務器
一個命令行工具(virsh)網絡
基於可移植性和高可靠性的考慮,Libvirt採用C語言開發,可是也提供了對其餘編程語言的綁定,包括Python,Perl,Ocaml,Ruby,Java和PHP。所以Libvirt的調用能夠被集成到各類編程語言中,適應不一樣的環境。
Libvirt支持多種虛擬機,具體狀況以下:架構
|名稱|註釋|
|-|-|
|LXC|輕量級的Linux容器|
|OpenVZ|基於Linux內核的輕量級Linux容器|
|KVM/QEMU|基於Linux的類型2的VMM|
|Xen|開源的類型1的VMM|
|User-mode Linux(UML)|系統調用級別的Linux虛擬機|
|VirtualBox|Oracle開發的類型2的VMM|
|Vmware ESX and GSX|Vmware虛擬化的服務器版本|
|Vmware Workstation and Player|Vmware虛擬化的桌面版本|
|Hyper-V|微軟開發的VMM|
|PowerVM|IBM開發的VMM|
|Parallels Workstation|Parallels爲Mac開發的VMM|
|Bhyve|FreeBSD 9+上的VMM|ssh
Libvirt屏蔽了不一樣虛擬化的實現,提供統一管理接口。用戶只關心高層的功能,而VMM的實現細節,對於最終用戶應該是透明的。Libvirt就做爲VMM和高層功能之間的橋樑,接收用戶請求,而後調用VMM提供的接口,來完成最終的工做。
Libvirt的層次結構以下:編程語言
爲了支持多種VMM,Libvirt採用了基於驅動的架構,如圖下圖所示。也就是說,每種VMM須要提供一個Driver和Libvirt進行通訊來操控特定的VMM。函數
Libvirt代碼裏所定義的主要對象以下圖所示。工具
VirConnectPtr:表明了一個特定VMM創建的鏈接。每個基於Libvirt的應用程序都應該先提供一個URI來指定本地或遠程的某個VMM,從而得到一個VirConnectPtr鏈接。好比xen+ssh://host-virt/表明了經過ssh鏈接一個在host-virt機器上運行的Xen VMM。拿到virConnectPtr鏈接後,應用程序就能夠管理這個VMM的虛擬機和對應的虛擬化資源,好比存儲和網絡。spa
VirDomainPtr:表明一個虛擬機,多是激活狀態或者僅僅已定義。
VirNetworkPtr:表明一個網絡
VirStorageVolPtr:表明一個存儲卷,一般被虛擬機當作塊設備使用。
VirStoragePoolPtr:表明一個存儲池,用來分配和管理存儲卷的邏輯區域。
在初始化的過程當中,全部的驅動被枚舉和註冊。每個驅動都會加載特定的函數爲Libvirt API所調用。以下圖所示,Application經過URI調用Public API,而後PublicAPI經過使用Driver提供的API接口調用正真的Driver實現。
Libvirt的目標是支持遠程管理,因此到Libvirt的驅動的訪問,都由Libvirt守護進程libvirtd處理,libvirtd被部署在運行虛擬機的節點上,經過RPC由對端的remote Driver管理,以下圖所示。
在遠程管理模式下,virConnectionPtr實際上鍊接了本地的remote Driver和遠端的特定Driver。全部的調用都經過remote Driver先到達雲端的libvirtd,libvirtd訪問對應的Driver。
原文連接: http://blog.csdn.net/xingjiarong/article/details/50545826