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

1、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|ssh

2、Libvirt的結構

Libvirt屏蔽了不一樣虛擬化的實現,提供統一管理接口。用戶只關心高層的功能,而VMM的實現細節,對於最終用戶應該是透明的。Libvirt就做爲VMM和高層功能之間的橋樑,接收用戶請求,而後調用VMM提供的接口,來完成最終的工做。
Libvirt的層次結構以下:
20160120015330353.png編程語言

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

20160120015408307.jpg

3、Libvirt的實現

Libvirt代碼裏所定義的主要對象以下圖所示。
20160120015453291.png工具

  1. VirConnectPtr:表明了一個特定VMM創建的鏈接。每個基於Libvirt的應用程序都應該先提供一個URI來指定本地或遠程的某個VMM,從而得到一個VirConnectPtr鏈接。好比xen+ssh://host-virt/表明了經過ssh鏈接一個在host-virt機器上運行的Xen VMM。拿到virConnectPtr鏈接後,應用程序就能夠管理這個VMM的虛擬機和對應的虛擬化資源,好比存儲和網絡。spa

  2. VirDomainPtr:表明一個虛擬機,多是激活狀態或者僅僅已定義。

  3. VirNetworkPtr:表明一個網絡

  4. VirStorageVolPtr:表明一個存儲卷,一般被虛擬機當作塊設備使用。

  5. VirStoragePoolPtr:表明一個存儲池,用來分配和管理存儲卷的邏輯區域。

一、本機之間的通訊‘

在初始化的過程當中,全部的驅動被枚舉和註冊。每個驅動都會加載特定的函數爲Libvirt API所調用。以下圖所示,Application經過URI調用Public API,而後PublicAPI經過使用Driver提供的API接口調用正真的Driver實現。

20160120015515301.png

二、遠程主機之間的通訊

Libvirt的目標是支持遠程管理,因此到Libvirt的驅動的訪問,都由Libvirt守護進程libvirtd處理,libvirtd被部署在運行虛擬機的節點上,經過RPC由對端的remote Driver管理,以下圖所示。

20160120015527301.png

在遠程管理模式下,virConnectionPtr實際上鍊接了本地的remote Driver和遠端的特定Driver。全部的調用都經過remote Driver先到達雲端的libvirtd,libvirtd訪問對應的Driver。

原文連接: http://blog.csdn.net/xingjiarong/article/details/50545826

相關文章
相關標籤/搜索