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