當前位置:
首頁 > 科技 > OpenStack關鍵技術系列:Libvirt基礎知識

OpenStack關鍵技術系列:Libvirt基礎知識

libvirt是什麼?從字面上看,由lib和virt兩部分組成。lib是指庫library的縮寫,virt是虛擬化virtualization的縮寫,所以他的定位是「虛擬化的庫」。它是一套開源的API、管理工具,用來管理虛擬化平台。可以應用在KVM、XEN、VMware ESX、QEMU等虛擬化技術,在OpenStack Nova中,默認採用libvirt對不同類型的虛擬機(OpenStack默認KVM)進行管理。

libvirt是目前使用最為廣泛的針對KVM虛擬機進行管理的工具和API。Libvirtd是一個daemon進程,可以被本地和遠程的virsh(命令行工具)調用,Libvirtd通過調用qemu-kvm操作管理虛擬機。libvirt 由應用程序編程介面 (API) 庫、一個守護進程 (libvirtd),和默認命令行實用工具 (virsh)等部分組成。那麼,libvirt支持什麼? 一張圖了解libvirt支持的Hypervisor和哪些管理工具支持libvirt。

對上層libvirt是個C語言庫,但同時它也提供了其他編程語言的封裝,這些語言使用libvirt封裝好的libvirtmod。2014年以前的libvirt代碼中,包含python介面,在2014年某個版本以後,將python單獨提出去了,不再和libvirt代碼使用同一個git庫,獨立成為libvirt-python的Git庫

對下層libvirt也支持多種Hypervisor,幾乎囊括了目前世界上所有主流/大公司的虛擬化Hyperviosr,主要包括的Hyperviosr如下。

libvirt既然是開源社區項目,那麼作為一個libvirt技術愛好者,就必須要了解libvirt開源社區情況。Libvirt目前已經對Ruby、Java語言,Perl和 OCaml實施了綁定,支持最流行的系統編程語言(C和C++)、多種腳本語言。Libvirt的架構如下。

沒有使用libvirt架構如下左圖,為支持各種Hypervisor的可擴展性,libvirt實施一種基於驅動程序的架構,該架構允許一種通用的API以通用方式為不同的Hyperviosr供服務。右圖展示了libvirt API與相關驅動程序的層次結構(Hypervisor和Domain在同一個節點)。

Hypervisor和Domain位於不同節點上時,管理應用程序通過一種通用協議從本地libvirt連接到遠程libvirtd,通過運行於遠程節點的libvirtd的特殊守護進程來實現管理。libvirtd提供從遠程應用程序訪問本地Domain的方式。

2005年12月19日,libvirt第一個版本問世,創始人是Daniel Veillard,libvirt項目雖然是開源的,但是也有它的copyright。目前libvirt項目copyright是Redhat的。目前大部分libvirt社區的maintainer也是redhat主導。maintainer列表大家可以看源碼目錄下的AUTHORS.in文件。

在maintainer中Redhat佔了16席Suse和富士通各佔2席。其中創始人Daniel Veillard目前基本不負責合代碼,只負責出版本(鎖庫、打tag、偶爾自己跑一下測試用例、發版本release notes、解庫)。注意libvirt社區maintainer中有兩個Daniel,一個就是創始人Veillard,另外一個是Daniel P.Berrange。創始人相當於幫主,另外一個Daniel P也是個大牛,在社區的地位相當於副幫主,其他的maintainer都很聽從他的建議。

除了在libvirt社區郵件進行交流外,libvirt還在IRC上開放了在線交流頻道。IRC是國際上一個知名度很高的類似於簡單的聊天室功能的一個交流平台,很多開源組織和其他組織都會在上面開通自己的頻道。

如果要參與到libvirt的代碼開發,必須遵守libvirt現有的風格框架。libvirt 的核心價值和主要目標就是提供了一套管理虛擬機的、穩定的、高效的應用程序介面(API)。libvirt API 大致可劃分為如下8個大的部分:

連接 Hypervisor相關的API:以virConnect 開頭的一系列函數。

域管理的 API:以virDomain 開頭的一系列函數。

節點管理的 API:以virNode 開頭的一系列函數。

網路管理的 API:以 virNetwork 開頭的一系列函數和部分以 virInterface 開頭的函數。

存儲卷管理的 API:以 virStorageVol 開頭的一系列函數。

存儲池管理的 API:以virStoragePool 開頭的一系列函數。

事件管理的API:以virEvent 開頭的一系列函數。

數據流管理的API:以virStream 開頭的一系列函數。

連接相關API為例進行說明。凡是跟連接相關libvirt介面(virConnect*)調用都需要首先調用virConnectOpen。此介面目的是通過libvirtd建立與底層Hypervisor連接,長期執行後續介面任務直至不再需要為止。調用步驟分為client端及server端,解析如下:

1、Client端直接調用virConnectOpen,獲取後端真正的driver,此時會先連接libvirtd,即C/S模式中的connect。

2、Server端首先經事件機制分發,添加與client端對應的響應對象virNetServerClient,後續所有來自此client端的請求都由對應的響應對象處理

3、Client端調用virConnectOpen的RPC介面去連接libvirtd,以便獲取真正的Hypervisor;

4、Server端事件機制分發read事件,經線程池再分發線程任務,響應對象據信息頭proc,選擇真實的remote Dispatch Connect OpenHelper過程,最終再次調用virConnectOpen,至此RPC調用完成。

5、Server端調用virConnectOpen的目的是連接真正的hypervisor,比如Qemu,保存driver指針到響應對象的privateData,後續普通介面調用就能直接使用。

當已經建立了與libvirtd服務的連接,後續介面調用就可直接使用連接對象。

在KVM虛擬化技術中,KVM負責CPU和內存虛擬化,但KVM不能模擬其他設備;Qemu是模擬IO設備(網卡,磁碟等),KVM和Qemu一起就能實現真正意義上伺服器虛擬化;故而一般都稱之為Qemu-KVM

溫馨提示:

求知若渴, 虛心若愚—Stay hungry,Stay foolish


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 架構師技術聯盟 的精彩文章:

Veritas Velocity數據副本管理技術、原理詳解
VMware vCloud雲解決方案有些啥?

TAG:架構師技術聯盟 |