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

架構師技術聯盟發表於2018-04-28

640?wx_fmt=png&wxfrom=5&wx_lazy=1


640?wx_fmt=gif

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


640?wx_fmt=png


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


640?wx_fmt=jpeg


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


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


640?wx_fmt=png


      libvirt既然是開源社群專案,那麼作為一個libvirt技術愛好者,就必須要了解libvirt開源社群情況。Libvirt目前已經對Ruby、Java語言,Perl和 OCaml實施了繫結,支援最流行的系統程式語言(C和C++)、多種指令碼語言。Libvirt的架構如下。


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



640?wx_fmt=png


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


640?wx_fmt=png


      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。


640?wx_fmt=jpeg


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


3、Client端呼叫virConnectOpen的RPC介面去連線libvirtd,以便獲取真正的Hypervisor;


4、Server端事件機制分發read事件,經執行緒池再分發執行緒任務,響應物件據資訊頭proc,選擇真實的remote Dispatch Connect OpenHelper過程,最終再次呼叫virConnectOpen,至此RPC呼叫完成。


640?wx_fmt=png


5、Server端呼叫virConnectOpen的目的是連線真正的hypervisor,比如Qemu,儲存driver指標到響應物件的privateData,後續普通介面呼叫就能直接使用。


640?wx_fmt=jpeg
640?wx_fmt=jpeg


      當已經建立了與libvirtd服務的連線,後續介面呼叫就可直接使用連線物件。


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


技術熱文推薦:

640?wx_fmt=jpeg

溫馨提示:

請搜尋“ICT_Architect”“掃一掃”二維碼關注公眾號,點選原文連結獲取更多技術資料

640?wx_fmt=png

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

640?wx_fmt=gif

相關文章