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


















 
 
 


 
 
 
 