歡迎光臨
每天分享高質量文章

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

技術熱文推薦:

溫馨提示:

請搜索“ICT_Architect”“掃一掃”二維碼關註公眾號,點擊原文鏈接獲取更多技術資料

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

赞(0)

分享創造快樂