剖析 Linux hypervisor

圖 1. 顯示經常使用硬件虛擬化的簡單分層架構
顯示經常使用硬件虛擬化的簡單分層架構  

平臺虛擬化的好處不少。美國環境保護署(EPA)報告的一組有趣的統計數據就證實了其好處。EPA 研究服務器和數據中心的能源效率時發現,實際上服務器只有 5% 的時間是在工做的。在其餘時間,服務器都處於 「休眠」 狀態。在單個服務器上的虛擬化平臺可以改善服務器的利用率,可是減小服務器的數量纔是它的最大功用。減小服務器數量意味着減小不動資產、能耗、冷卻和管理成本。使用更少的硬件還能提升可靠性。總之,平臺虛擬化不只帶來技術優點,還能創形成本和能源優點。 html

在圖 1 中能夠看到,hypervisor 是提供底層機器虛擬化的軟件層(在某些狀況下須要處理器支持)。並非全部虛擬化解決方案都是同樣的,您能夠在 參考資料 中瞭解更多的虛擬化方式。繼續討論進程,操做系統將對機器的底層資源的訪問虛擬化爲進程。hypervisor 也作同樣的事情,但其對象不是進程,而是整個來賓操做系統。 linux

hypervisor 分類 編程

hypervisor 能夠劃分爲兩大類。首先是類型 1,這種 hypervisor 是直接運行在物理硬件之上的。其次是類型 2,這種 hypervisor 運行在另外一個操做系統(運行在物理硬件之上)中。類型 1 hypervisor 的一個例子是基於內核的虛擬機(KVM —— 它自己是一個基於操做系統的 hypervisor)。類型 2 hypervisor 包括 QEMU 和 WINE。 服務器

hypervisor 的構成 網絡

hypervisor(不論是什麼類型)僅是一個從其來賓操做系統抽象機器硬件的分層應用程序。經過這種方式,每一個來賓操做系統看到的僅是一個 VM 而不是真實的硬件機器。咱們大體看一下 hypervisor 的內部組成,以及它在 VM(來賓操做系統)上的表示。 架構

在較高級別上,hypervisor 須要少許設施啓動來賓操做系統:一個須要驅動的內核映像、一個配置(好比 IP 地址和所需的內存量)、一個磁盤盒一個網絡設備。磁盤和網絡設備一般映射到機器的物理磁盤和網絡設備(如圖 2 所示)。最後,須要使用一組來賓操做系統工具啓動和管理來賓操做系統。 jsp


圖 2. 在假設 hypervisor 中的最小資源映射
在假設 hypervisor 中的最小資源映射  

而後,一個簡化的 hypervisor 架構實現最後的關鍵功能,從而使來賓操做系統能夠和宿主操做系統同時運行。實現這個功能須要一些特定的要素,如圖 3 所示。首先,相似於將用戶空間應用程序和內核函數鏈接起來的系統調用,一個一般可用的虛擬化調用(hapercall,hypervisor 對操做系統進行的系統調用)層容許來賓系統向宿主操做系統發出請求。能夠在內核中虛擬化 I/O,或經過來賓操做系統的代碼支持它。故障必須由 hypervisor 親自處理,從而解決實際的故障,或將虛擬設備故障發送給來賓操做系統。hypervisor 還必須處理在來賓操做系統內部發生的異常。(畢竟,來賓操做系統發生的錯誤僅會中止該系統,而不會影響 hypervisor 或其餘來賓操做系統)。hypervisor 的核心要素之一是頁映射器,它將硬件指向特定操做系統(來賓或 hypervisor)的頁。最後,須要使用一個高級別的調度器在hypervisor和來賓操做系統之間傳輸控制。 函數

圖 3. 簡化的基於 Linux 的hypervisor
簡化的基於 Linux 的hypervisor  

Linux hypervisor 工具

本文探索兩個基於 Linux 的 hypervisor 解決方案。首先是 KVM,它是首個被集成到 Linux 內核的 hypervisor 解決方案,而且實現了完整的虛擬化。其次是 Lguest,這是一個實驗 hypervisor,它經過少許的更改提升準虛擬化。 性能

KVM

KVM 針對運行在 x86 硬件硬件上的、駐留在內核中的虛擬化基礎結構。KVM 是第一個成爲原生 Linux 內核(2.6.20)的一部分的 hypervisor,它是由 Avi Kivity 開發和維護的,如今歸 Red Hat 全部。

這個 hypervisor 提供 x86 虛擬化,同時擁有到 PowerPC® 和 IA64 的通道。另外,KVM 最近還添加了對對稱多處理(SMP)主機(和來賓)的支持,而且支持企業級特性,好比活動遷移(容許來賓操做系統在物理服務器之間遷移)。

KVM 是做爲內核模塊實現的,所以 Linux 只要加載該模塊就會成爲一個hypervisor。KVM 爲支持 hypervisor 指令的硬件平臺提供完整的虛擬化(好比 Intel® Virtualization Technology [Intel VT] 或 AMD Virtualization [AMD-V] 產品)。KVM 還支持準虛擬化來賓操做系統,包括 Linux 和 Windows®。

這種技術由兩個組件實現。第一個是可加載的 KVM 模塊,當在 Linux 內核安裝該模塊以後,它就能夠管理虛擬化硬件,並經過 /proc 文件系統公開其功能(見圖 4)。第二個組件用於 PC 平臺模擬,它是由修改版 QEMU 提供的。QEMU 做爲用戶空間進程執行,而且在來賓操做系統請求方面與內核協調。


圖 4. KVM hypervisor 的高級別視圖
KVM hypervisor的高級別視圖  

當新的操做系統在 KVM 上啓動時(經過一個稱爲 kvm 的實用程序),它就成爲宿主操做系統的一個進程,所以就能夠像其餘進程同樣調度它。但與傳統的 Linux 進程不同,來賓操做系統被 hypervisor 標識爲處於 「來賓」 模式(獨立於內核和用戶模式)。

每一個來賓操做系統都是經過 /dev/kvm 設備映射的,它們擁有本身的虛擬地址空間,該空間映射到主機內核的物理地址空間。如前所述,KVM 使用底層硬件的虛擬化支持來提供完整的(原生)虛擬化。I/O 請求經過主機內核映射到在主機上(hypervisor)執行的 QEMU 進程。

KVM 在 Linux 環境中以主機的方式運行,不過只要底層硬件虛擬化支持,它就可以支持大量的來賓操做系統。您能夠在 參考資料 部分找一個到受支持的來賓操做系統的列表。

Lguest(之前的 lhype)

Lguest hypervisor 由澳大利亞 IBM 的 Rusty Russell 開發,它採用徹底不一樣的方式實現虛擬化。Lguest 並無爲運行任意操做系統提供完整的虛擬化支持,而是爲支持 x86 的 Linux 來賓操做系統(也稱爲Linux-on-Linux 虛擬化)提供輕量級準虛擬化。這意味着來賓操做系統知道本身正在被虛擬化,而且這同時還會改進性能。可是,Lguest 不須要 QEMU 提供平臺虛擬化(像在 KVM 中同樣)來改進性能。使用 Lguest 這種方法還減小了總代碼需求,僅需在來賓操做系統和宿主操做系統中使用一個瘦層。如今,咱們探索這些變化,並查看 Lguest 環境的高級別架構。

如圖 5 所示,來賓操做系統包含一個 Lguest 代碼瘦層(根據定義,就是準虛擬化)。這段代碼提供許多服務。在最高的級別,有一些代碼能夠決定正在啓動的內核是否被虛擬化。此外,還有一個經過虛擬化調用將特權操做發送給宿主操做系統的抽象層(經過 paravirt_ops 實現)。例如,來賓操做系統不能禁用中斷,以使這些請求在宿主操做系統中執行。您還可找到一個爲來賓操做系統實現設備抽象的總線,以及一組實現控制檯、虛擬塊驅動器和虛擬網絡驅動器(容許與其餘來賓通訊)的簡單驅動器。


圖 5. 實現 x86 準虛擬化的 Lguest 的架構
實現 x86 準虛擬化的 Lguest 的架構  

內核部分被實現爲可加載的模塊,即lg.ko。這個模塊包含來賓操做系統通向宿主內核的接口。第一個組件是切換器,它實現一種方法,讓來賓操做系統在執行時根據上下文進行切換。這個模塊還實現 /proc 文件系統代碼(針對 /dev/lguest),該代碼實現到內核和驅動器(包括虛擬化調用)的用戶空間接口。還有一些代碼經過使用影子頁表(shadow page-table)和管理 x86 區段來提供內存映射。

最後,內核中的 Documentation 子目錄包含啓動實用程序(lguest),用於啓動新的來賓操做系統實例。這個文件負責兩項任務,即便用和記錄。

Lguest 從 2.6.23(2007 年 10 月)開始就成爲主流內核,而且由 Rusty Russell 開發和維護。它大約包含 5000 行源代碼,包括用戶空間實用程序。儘管 Lguest 很簡單(聽說是這樣的),但它能提供真正的準虛擬化。不過簡單性每每與侷限性相隨。例如,Lguest 僅虛擬化其餘支持 Lguest 的來賓操做系統,而且目前僅能用於 x86 架構。儘管存在這些限制,Lguest 仍然提供一種有趣的虛擬化方式,而且對任何但願研究 Rusty 的代碼的人員公開。

Linux hypervisor 的益處

使用 Linux 做爲內核開發 hypervisor 有實實在在的好處。最明顯的是, 以 Linux 爲基礎開發 hypervisor 受益於穩步前進的 Linux,以及爲改進 Linux 投入的大量工做。從典型的優化、bug 修復、調度和內存管理創新到支持不一樣處理器架構,Linux 都是一個不斷進步的平臺(引自 Salisbury 市的 John 的 「站在巨人的肩膀上」 一文)。

不久前已經證實,經過向 KVM 添加一個內核模塊,就能夠將 Linux 內核轉變爲 hypervisor。Lguest 進一步改進了這種方法,而且經過受限制的準虛擬化進一步簡化了該解決方案。

使用 Linux 做爲平臺的另外一個奇特好處是,除了能夠將該平臺用做 hypervisor 以外,您還能夠將其用做操做系統。所以,除了能夠在 Linux hypervisor 上運行多個來賓操做系統以外,您還能夠在該級別上運行其餘傳統的應用程序。因此,沒必要擔憂帶有新的應用編程接口(API)的新平臺,由於您擁有用於開發應用程序的標準 Linux 平臺(若是須要監控應用程序或 hypervisor)。標準協議(TCP/IP)和其餘有用的應用程序(Web 服務器)和來賓操做系統都是可用的。回顧一下討論 KVM 時的 圖 4:除了來賓操做系統以外,還使用了修改了 KVM 的 QEMU。這是一個標準進程,並展現了 Linux 做爲 hypervisor 的強大之處。KVM 在平臺虛擬化中利用 QEMU,並使用 Linux 做爲hypervisor,所以實現了這個構思,即讓來賓操做系統可以和其餘 Linux 應用程序協調執行。

結束語

在 hypervisor 開發的過程當中,hypervisor 就是新開闢的戰場。3 年之前,操做系統是戰場的主線,而且控制了一小部分據點。然而,今天戰場已轉移到 hypervisor,而且 Linux 擔任一個明確的角色。

可是,也有聲音反對使用 Linux 做爲 hypervisor,而且最劇烈的批評來自於誇誇其談的空論。在數年之前這種狀況曾出如今嵌入式領域。今天,做爲嵌入式操做系統的 Linux 已經是未曾止步的強者。可是咱們也有對付批評的辦法,經過一些架構上的改進可讓 Linux 成爲最強大、最廣泛和更靈活的操做系統。


參考資料

學習

 

copy from:http://www.ibm.com/developerworks/cn/linux/l-hypervisor/

相關文章
相關標籤/搜索