OpenStack設計與實現(二)Libvirt簡介與實現原理

arron劉發表於2016-01-23

一、Libvirt簡介

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

二、Libvirt的結構

Libvirt遮蔽了不同虛擬化的實現,提供統一管理介面。使用者只關心高層的功能,而VMM的實現細節,對於終端使用者應該是透明的。Libvirt就作為VMM和高層功能之間的橋樑,接收使用者請求,然後呼叫VMM提供的介面,來完成最終的工作。
Libvirt的層次結構如下:

為了支援多種VMM,Libvirt採用了基於驅動的架構,如圖下圖所示。也就是說,每種VMM需要提供一個Driver和Libvirt進行通訊來操控特定的VMM。

三、Libvirt的實現

Libvirt程式碼裡所定義的主要物件如下圖所示。

  1. VirConnectPtr:代表了一個特定VMM建立的連線。每一個基於Libvirt的應用程式都應該先提供一個URI來指定本地或遠端的某個VMM,從而獲得一個VirConnectPtr連線。比如xen+ssh://host-virt/代表了透過ssh連線一個在host-virt機器上執行的Xen VMM。拿到virConnectPtr連線後,應用程式就可以管理這個VMM的虛擬機器和對應的虛擬化資源,比如儲存和網路。
  2. VirDomainPtr:代表一個虛擬機器,可能是啟用狀態或者僅僅已定義。
  3. VirNetworkPtr:代表一個網路
  4. VirStorageVolPtr:代表一個儲存卷,通常被虛擬機器當做塊裝置使用。
  5. VirStoragePoolPtr:代表一個儲存池,用來分配和管理儲存卷的邏輯區域。

1、本機之間的通訊‘

在初始化的過程中,所有的驅動被列舉和註冊。每一個驅動都會載入特定的函式為Libvirt API所呼叫。如下圖所示,Application透過URI呼叫Public API,然後PublicAPI透過使用Driver提供的API介面呼叫正真的Driver實現。

2、遠端主機之間的通訊

Libvirt的目標是支援遠端管理,所以到Libvirt的驅動的訪問,都由Libvirt守護程式libvirtd處理,libvirtd被部署在執行虛擬機器的節點上,透過RPC由對端的remote Driver管理,如下圖所示。

在遠端管理模式下,virConnectionPtr實際上連線了本地的remote Driver和遠端的特定Driver。所有的呼叫都透過remote Driver先到達雲端的libvirtd,libvirtd訪問對應的Driver。



原文連結: 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26916835/viewspace-1981323/,如需轉載,請註明出處,否則將追究法律責任。

相關文章