面向下一代云的嵌套虛擬化
十年前,“云” 的話題才剛剛出現,當時的重點是公共基礎架構中的簡單服務。但正如技術中的典型情形那樣,這些服務隨著其使用模式不斷發展。同樣地,在商用硬件上引入虛擬化也只是為了關注最簡單的使用模式,然后,隨著人們越來越認可虛擬化潛能,虛擬化也在不斷發生演變。
因為硬件提供者目睹了虛擬化和云的發展,所以他們也將提供的產品發展成為能夠更有效地滿足需求。早先的 x86 處理器對虛擬化并不理想,但一些處理器內行人士則一直關注于新的使用模式,并為平臺虛擬化創建了一種更有效的環境。
讓我們先來簡短介紹一下云架構及其具有的一些限制。
公有云架構
公有云(或可公開使用的虛擬化基礎架構)側重的是虛擬服務器的簡單分配,該分配是通過多租戶使用的虛擬機管理程序完成的。虛擬機管理程序充當的是一個多路復用器 (multiplexer),讓一個物理平臺可供多個用戶共享。有多個產品可供虛擬機管理程序(從 Kernel 虛擬機 (KVM) 到 Xen 虛擬機管理程序等)使用。
在虛擬化了的基礎架構中存在一個限制,即虛擬化對給定虛擬環境的依賴性。比如,Amazon Elastic Compute Cloud (Amazon EC2) 依賴于 Xen 虛擬化。Amazon EC2 希望運行在其基礎架構中的所有來賓都能夠以一種稱為 Amazon Machine Image (AMI) 格式的特定方式進行打包。AMI 是 Amazon EC2 內的基礎部署單元,可以是諸多預配置類型(基于操作系統和應用程序集)中的一種,也可以通過某些額外工作進行定制創建。
這種虛擬機 (VM) 格式(包括元數據和一種虛擬的磁盤格式)有可能成為云使用者的一個障礙。將 VM 從私有的基礎架構遷移到公共基礎架構或在公共基礎架構之間相互遷移的能力會受到這種格式的阻礙,而且會過多地依賴于目標虛擬機管理程序的選擇。
因此,對于嵌套虛擬化的支持將會為云使用者創建新的抽象。如果云支持在一個虛擬機管理程序上虛擬化另一個虛擬機管理程序,那么 VM 格式就會與云無關。惟一的依賴關系是此來賓虛擬機管理程序本身的格式。這種改變將第一代云從一成不變演變成了高度靈活的虛擬化基礎架構,為用戶帶來了更多的自由。圖 1 展示了面向虛擬機管理程序的虛擬平臺上下文環境中的新抽象,不僅僅是 VM。請注意此圖中對虛擬化的不同級別所使用的術語:L0 代表的是裸機虛擬機管理程序,L1 代表的是來賓虛擬管理程序,L2 代表的是來賓 VM。
圖 1. 傳統虛擬機管理程序對比嵌套虛擬機管理程序的簡單說明
這種改變帶來的功能不僅包括為新的基礎架構打包 VM,還包括打包 VM 集與其虛擬機管理程序,簡化了私有云基礎架構用戶將功能(靜態或動態)遷移到公有云基礎架構的過程。這種改變如 圖 2 所示,包含將私有虛擬機管理程序轉換成嵌套云中的來賓虛擬機管理程序的轉換。
圖 2. 嵌套云中的來賓虛擬機管理程序和主機虛擬機管理程序
下一代云:引入了嵌套虛擬化
嵌套虛擬化并不是一個新概念,這個概念在 IBM? z/VM? 虛擬機管理程序中已經實現有一段時間了。IBM System z? 操作系統本身就是一個虛擬機管理程序,它不僅虛擬化了處理器和內存,還虛擬化了存儲器、網絡硬件協助和其他資源。z/VM 虛擬化管理程序代表的是有硬件協助的實際嵌套虛擬化的首次實現(為性能)。此外,z/VM 虛擬機管理程序還支持任何深度的 VM 嵌套(當然,有額外的費用)。新近,基于該技術使用模式的增加,x86 平臺已經開始向虛擬化協助進軍。
實現嵌套虛擬化,并用于商用硬件的第一個虛擬機管理程序是 KVM。增加對 KVM 的支持是在 IBM 的 Turtles 項目下執行的,并允許多個未修改的虛擬機管理程序在 KVM 之上運行(本身就是一個虛擬機管理程序,可充當 Linux? 內核的一個自制系統優化工具)。啟動 Turtles 項目的部分原因是:客戶想采用 IBM 倡導的使用 IBM System p? 和 System z 操作系統的方式來使用商用硬件。在這種模型中,服務器運行了一個嵌套式虛擬機管理程序,并允許用戶在其上運行其自選的虛擬機管理程序。這種方式吸引了虛擬化社區,因為有些功能(對 KVM 的修改)目前已經成為主流 Linux 內核的一部分。
嵌套虛擬化的架構
嵌套虛擬化帶來了一些前所未見的獨特問題。讓我們一同來看看這些問題,了解如何在 KVM 中解決它們。
處理器虛擬化
目前的處理器架構中的虛擬化支持所存在的一個缺陷是它側重雙級(dual-level)虛擬化(單個虛擬機管理程序上堆疊多個 VM)。Turtles 通過簡單的多路復用處理擴展了這一支持。回顧 圖 1 可以看出,存在三個級別(L0 為主機虛擬機管理程序,L1 為來賓虛擬機管理程序,L2 為來賓 VM)。利用當今的處理器,可有效處理 L0 和 L1,但無法有效處理 L2。Turtles 并未維護這種嚴格的堆疊,而是復用了 L1 上的各個條目( entities),并實際允許主機虛擬機管理程序在 L1 上復用來賓虛擬機管理程序和來賓 VM。因此,沒有通過虛擬化這些虛擬化指令來支持這三層,而是有效使用了處理器中的可用硬件協助來支持這三層(參見 圖 3)。
圖 3. 復用主機 (L0) 虛擬機管理程序上的來賓
但是,利用處理器的虛擬化資產并不是惟一的障礙。讓我們來看看其他的一些問題,以及它們在 KVM 中的解決方案。
嵌套虛擬化帶來了一些有趣問題。請注意,傳統的虛擬化部分處理了指令集,直接執行處理器上的某些指令,并通過陷阱模仿其他指令。在嵌套虛擬化中,引入了另一個級別,在這一級別上,某些指令繼續直接在硬件上執行,而其他指令則被捕獲并托管在一層或其他層中(具有用于各層之間的轉換的有效負載)。
這種設置會公開處理器虛擬化實現中的優勢和劣勢,正如 Turtles 項目發現的那樣。VM 控制結構 (VMCS) 的管理就是這樣的一個領域。在 Intel 的實現中,讀寫這些結構涉及到一些特權指令,要求跨嵌套堆棧的各層進行多次出入。這些轉換會帶來有效負載,以性能降低的形式表現出來。AMD 的實現則通過正常的內存讀寫來管理 VMCS,這意味著當來賓虛擬機管理程序 (L1) 修改了來賓 VM 的 VMCS (L2) 時,并不要求主機虛擬機管理程序 (L0) 的介入。
即使沒有處理器對嵌套的支持,Turtles 復用方法仍會最大程度地減少各層之間的轉換。虛擬化中的轉換通過出入 VM 的特殊指令(VMexit 和 VMentry)進行,并且代價昂貴。某些退出指令還會要求 L1 虛擬機管理程序的介入,但其他的條件(比如外部中斷)則由 L0 獨自處理。最大程度地減少 L2 到 L0 到 L1 的轉換,這會導致性能提升。
MMU 和內存虛擬化
在借助現代處理器中的頁表協助之前,虛擬機管理程序會模仿內存管理單元 (MMU) 的行為。來賓 VM 會創建來賓頁表來支持來賓虛擬地址到來賓實際地址的轉換。虛擬機管理程序維護了一些影子頁表,以便將來賓物理地址轉換為主機物理地址。這會要求捕獲頁表的變化,以便虛擬機管理程序能夠管理 CPU 中的物理表。
Intel 和 AMD 都通過添加二維頁表來解決這個問題,Intel 稱之為擴展頁表 (EPT),AMD 稱之為嵌套頁表 (NPT)。這些協助允許二級頁表將來賓物理地址轉變為主機物理地址(而傳統頁表則繼續支持來賓虛擬到來賓物理的轉換)。
Turtles 項目引入了三個模型來處理嵌套。首要的也是最無效的地方是在影子頁表上使用影子頁表。如果來賓和主機虛擬機管理程序維護了影子表,那么這個做法僅在硬件協助均不可用的時候使用。第二個方法是在 L0 管理的二維頁表之上使用影子表。雖然有效性更好一些,但是來賓 VM 內的頁錯誤會導致多個 L1 退出并帶來有效負載。最后一種方法是為 L1 虛擬機管理程序虛擬化這個二維頁表。通過在 L1 上仿真這個二級頁表(L0 使用的是物理 EPT/NPT),L1 退出次數和帶來的有效負載都會減少。來自 Turtles 項目的這種創新形式被稱為多維分頁。
I/O 設備虛擬化
虛擬化 I/O 設備可能是虛擬化代價最為昂貴的方面之一。仿真(由 QEMU 提供)最為昂貴,像半虛擬化(讓來賓了解并用虛擬機管理程序協調 I/O)這樣的方式能夠提升總體性能。最有效的方案是使用像 AMD I/O MMU (IOMMU) 這樣的硬件協助來提供來賓物理地址到主機物理地址的透明轉換(用于直接內存訪問 [DMA] 這樣的操作)。
Turtles 項目通過賦予 L2 來賓對 L0 的可用物理設備的直接訪問來提高性能。L0 主機虛擬機管理程序為 L1 來賓虛擬機管理程序仿真了一個 IOMMU。這種方法最大程度地減少了來賓退出(exit),從而減少了有效負載,提升了性能。
嵌套的性能
根據使用的模型,KVM 中的嵌套可能導致的有效負載可以忽略不計。促使 VM 退出的工作負載(比如外部中斷處理)常常是最壞的冒犯者,但 KVM 內的優化則會帶來 6% 到 14% 的負載提升。考慮到嵌套虛擬化所提供的功能,這個有效負載當然還是合理的。處理器架構的進步將會進一步改善這一點。#p#
何處可以找到嵌套虛擬化?
如今,大量虛擬機管理程序均支持嵌套虛擬化,但還不是很高效。Linux KVM 支持最新的啟用了虛擬化功能的處理器上的嵌套。Xen 虛擬機管理程序也已做了相應修改,以支持嵌套的虛擬化,所以開源社區已經快速轉而采用這一功能及其潛在的使用模式。
從產品的立場上衡量,這個功能尚處于早期的開發階段。此外,利用嵌套擴展虛擬化意味著物理主機上的負載的加重,因此應該采用處理器功能更強的服務器。
還要注意的是,在其他的上下文環境中執行嵌套虛擬化也是可行的。在最新的一篇 OpenStack 文章中,通過使用 VirtualBox 作為主機虛擬機管理程序并使用 QEMU(提供仿真)作為來賓來展示嵌套。雖然這不是最為高效的配置,但這篇文章介紹了更為普遍的硬件上的一些基本功能。有關的更多細節,請參閱 參考資料。
其他應用程序
未來,使用虛擬機管理程序作為桌面機或服務器上的固件中的標準組成部分可能會非常常見。這種使用模式意味著嵌套的虛擬機管理程序可以支持一個操作系統(作為 VM)或用戶自選的另一個虛擬機管理程序。
以這種方式使用虛擬機管理程序還可以支持新的安全模型(因為虛擬機管理程序存在于用戶的代碼和黑客的代碼之下)。此概念最初用于不法的目的。"Blue Pill" rootkit 是 Joanna Rutkowska 的開發結果,它會在操作系統的一個運行實例下插入一個瘦虛擬機管理程序。Rutkowska 還開發了一個稱為 Red Pill 的技術,可用來檢測將 "Blue Pill" 插入運行的操作系統之下的時間。
結束語
通過使用 KVM 虛擬機管理程序作為測試平臺,Turtles 項目證明了虛擬機管理程序的嵌套虛擬化不僅是可能的,而且在某些情況下還很高效。KVM 方面的研究工作還在繼續,但它現在已經成為在虛擬機管理程序中實現嵌套的一個模型,支持多個來賓虛擬機管理程序的同時執行。隨著處理器架構逐漸能夠滿足這些新需求,未來,嵌套虛擬化很可能會成為一個常見的使用模式,不僅會出現在下一代云產品的企業服務器中,還會出現在商用服務器和臺式機上。