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
相關文章
- OpenStack必備基礎知識
- 全方位掌握OpenStack技術知識
- 【Git 系列】基礎知識全集Git
- 資訊處理技術基礎知識(2.4多媒體基礎知識 )--第2章
- 什麼是美顏sdk?美顏sdk基礎知識、應用場景、關鍵技術詳解
- 學習下區塊鏈技術基礎知識區塊鏈
- Pytest 實踐:Python 測試技術基礎知識Python
- 面試圖譜:前端基礎技術知識講解面試前端
- 前端基礎技術知識講解-面試圖譜前端面試
- Java核心技術 卷1 基礎知識 部分筆記Java筆記
- Java基礎知識系列—序列化Java
- IdentityServer4系列 | 初識基礎知識點IDEServer
- Python基礎知識_第10節_檔案操作(IO技術)Python
- 技術分享 | Kubernetes 學習筆記之基礎知識篇筆記
- Python技術基礎知識點:OS模組的應用Python
- 小白系列:資料庫基礎知識解析資料庫
- WebSocket系列之基礎知識入門篇Web
- Git 關鍵知識Git
- 基礎知識
- BSN-DDC 基礎網路關鍵知識點(一)DDC背景介紹
- 網站安全相關的基礎知識網站
- 關於mysql基礎知識的介紹MySql
- 走進JavaWeb技術世界1:JavaWeb的由來和基礎知識JavaWeb
- Mac基礎知識分享:option鍵的隱藏技巧Mac
- Envoy基礎知識
- DockerFile基礎知識Docker
- Webpack 基礎知識Web
- js基礎知識JS
- React基礎知識React
- 程式基礎知識
- Docker基礎知識Docker
- qml基礎知識
- Mybatis基礎知識MyBatis
- python基礎知識Python
- Hadoop基礎知識Hadoop
- webpack基礎知識Web
- AI 基礎知識AI
- JSP基礎知識JS