OpenStack設計與實現(二)Libvirt簡介與實現原理
一、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程式碼裡所定義的主要物件如下圖所示。
- VirConnectPtr:代表了一個特定VMM建立的連線。每一個基於Libvirt的應用程式都應該先提供一個URI來指定本地或遠端的某個VMM,從而獲得一個VirConnectPtr連線。比如xen+ssh://host-virt/代表了透過ssh連線一個在host-virt機器上執行的Xen VMM。拿到virConnectPtr連線後,應用程式就可以管理這個VMM的虛擬機器和對應的虛擬化資源,比如儲存和網路。
- VirDomainPtr:代表一個虛擬機器,可能是啟用狀態或者僅僅已定義。
- VirNetworkPtr:代表一個網路
- VirStorageVolPtr:代表一個儲存卷,通常被虛擬機器當做塊裝置使用。
- 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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- OpenStack設計與實現(一)虛擬化
- 【Linux核心設計與實現】Linux核心簡介Linux
- 網路程式設計原理與UDP實現程式設計UDP
- 簡讀筆記-Redis設計與實現第二章筆記Redis
- Redis 設計與實現 (二)--資料庫Redis資料庫
- 簡單介紹numpy實現RNN原理實現RNN
- Redis(設計與實現):---釋出與訂閱介紹Redis
- virtual-dom原理與簡單實現
- vitual-dom原理與簡單實現
- Redis設計與實現Redis
- 《redis設計與實現》Redis
- Lombok 原理與實現Lombok
- LRU原理與實現
- 一個RtspServer的設計與實現和RTSP2.0簡介Server
- 單點登入原理與簡單實現
- Titan 的設計與實現
- LFU 的設計與實現
- Cuckoo Filter:設計與實現Filter
- API的設計與實現API
- octavia的實現與分析(二)·原理,架構與基本流程架構
- 堆的原理與實現
- 熔斷原理與實現
- @weakify 與 @strongify 實現原理
- 自動化測試平臺設計與實現(二、自動化測試用例物件設計實現、關鍵字物件設計與實現)物件
- Python實現火柴人的設計與實現Python
- 快捷簡易統計圖表模型設計與實現模型
- 理解Spring(二):AOP 的概念與實現原理Spring
- javascript實現二維陣列實現簡單介紹JavaScript陣列
- Vue主要原理最簡實現與邏輯梳理Vue
- 按揭貸款的計算原理與java實現Java
- Picker元件的設計與實現元件
- linux核心設計與實現Linux
- 淺談VueUse設計與實現Vue
- OpenMP 原子指令設計與實現
- Redis 設計與實現 4:字典Redis
- Redis 設計與實現 (九)--LuaRedis
- RedisHttpSession 的設計與實現RedisHTTPSession
- 限流 SDK 的設計與實現