進行虛拟化 就是要将某種形式的東西以另外一種形式呈現出來。對計算機進行虛拟化就是要将計算機以多台計算機或一台完全不同的計算機的形式呈現出來。
虛拟化也可以将多台計算機組合成一台計算機的形式呈現出來。這通常稱為伺服器聚合或網格計算。
下面讓我們首先來看一下虛拟化的起源。
虛拟化的曆史
虛拟化并不是什麼新主題;實際上,它的存在已經超過 40 年了。虛拟化技術最早的一些用法包括 IBM® 7044、麻省理工學院(MIT)在 IBM 704 上開發的 CTSS(Compatible Time Sharing System)以及曼徹斯特大學的 Atlas 項目(世界上最早的超級計算機之一),這些都是請求頁面排程和監管程序調用的先驅。
硬體虛拟化
IBM 早在 20 世紀 60 年代開發 System/360™ Model 67 大型機時就認識到了虛拟化的重要性。Model 67 通過 VMM(Virtual Machine Monitor)對所有的硬體接口都進行了虛拟化。在早期計算中,作業系統被稱為 supervisor。能夠在其他作業系統上運作的作業系統被稱為 hypervisor(這個術語是在 20 世紀 70 年代出現的)。
VMM 可以直接在底層硬體上運作,允許運作多個虛拟機(VM)。每個 VM 都可以運作一個自己私有作業系統的執行個體 —— 在早些時候,這稱為 CMS(或 Conversational Monitor System)。之後 VM 繼續發展,現在您可以在 System z9™ 大型機上發現 VM。這提供了很好的向後相容性,甚至是對 System/360 産品線的相容性。
處理器虛拟化
虛拟化早期的另外一種用法(在本例中是對處理器的仿真)是 P-code(或僞碼)機。P-code 是一種機器語言,運作于虛拟機而不是實際硬體。P-code 早在 20 世紀 70 年代就已在加州大學聖地亞哥分校(UCSD)Pascal 系統上頗有名氣了,它将 Pascal 程式編譯成 P-code,然後在一個 P-code 虛拟機上運作。這就使 P-code 程式具有了高度的可移植性,而且,隻要有可用的 P-code 虛拟機,P-code 程式就可以運作。
20 世紀 60 年代對 BCPL(Basic Combined Programming Language)的設計中也采用了相同的概念,C 語言即由 BCPL 發展而來。在這種用法中,編譯器會将 BCPL 代碼編譯成稱為 O-code 的中間機器代碼。接下來的第二個步驟是将 O-code 編譯成目标機器的原始語言。現代編譯器所使用的這種模型為将編譯器移植到新目标體系結構上提供了很大的靈活性(通過一種中間語言将前端和後端分隔開來)。
指令集虛拟化
虛拟化最新的發展稱為指令集虛拟化,或者二進制轉換。在這種模型中,虛拟指令集被轉換成底層硬體的實體指令集,這個過程通常都是動态的。當代碼執行時,就會對代碼的某個段進行轉換。如果出現分支情況,就會導入新代碼集并進行轉換。這使它與緩存操作非常類似,後者是将指令塊從記憶體移動到本地快速緩存中執行。
這種模型最近在 Transmeta 設計的 Crusoe 中央處理單元(CPU)中得到了使用。二進制轉換由 Code Morphing 的專利技術實作。類似的一個例子是完全虛拟化解決方案通過運作時代碼掃描來查找和重定向特權指令(用來解決特定處理器指令集的一些問題)。
虛拟化的類型
實作虛拟化的方法不止一種。實際上,有幾種方法都可以通過不同層次的抽象來實作相同的結果。本節将介紹 Linux 中常用的 3 種虛拟化方法,以及它們相應的優缺點。業界有時會使用不同的術語來描述相同的虛拟化方法。本文中使用的是最常用的術語,同時給出了其他術語以供參考。
硬體仿真
毫無疑問,最複雜的虛拟化實作技術就是硬體仿真。在這種方法中,可以在宿主系統上建立一個硬體 VM 來仿真所想要的硬體,如圖 1 所示。
圖 1. 硬體仿真使用 VM 來模拟所需要的硬體

正如您所能預見的一樣,使用硬體仿真的主要問題是速度會非常慢。由于每條指令都必須在底層硬體上進行仿真,是以速度減慢 100 倍的情況也并不稀奇。若要實作高度保真的仿真,包括周期精度、所仿真的 CPU 管道以及緩存行為,實際速度差距甚至可能會達到 1000 倍之多。
硬體仿真也有自己的優點。例如,使用硬體仿真,您可以在一個 ARM 處理器主機上運作為 PowerPC® 設計的作業系統,而不需要任何修改。您甚至可以運作多個虛拟機,每個虛拟器仿真一個不同的處理器。
完全虛拟化
完全虛拟化(full virtualization),也稱為原始虛拟化,是另外一種虛拟化方法。這種模型使用一個虛拟機,它在客戶作業系統和原始硬體之間進行協調(參見圖 2)。“協調”在這裡是一個關鍵,因為 VMM 在客戶作業系統和裸硬體之間提供協調。特定受保護的指令必須被捕獲下來并在 hypervisor 中進行處理,因為這些底層硬體并不由作業系統所擁有,而是由作業系統通過 hypervisor 共享。
圖 2. 完全虛拟化使用 hypervisor 來共享底層硬體
雖然完全虛拟化的速度比硬體仿真的速度要快,但是其性能要低于裸硬體,因為中間經過了 hypervisor 的協調過程。完全虛拟化的最大優點是作業系統無需任何修改就可以直接運作。惟一的限制是作業系統必須要支援底層硬體(例如 PowerPC)。
超虛拟化
超虛拟化(paravirtualization)是另外一種流行的虛拟化技術,它與完全虛拟化有一些類似。這種方法使用了一個 hypervisor 來實作對底層硬體的共享通路,還将與虛拟化有關的代碼內建到了作業系統本身中(參見圖 3)。這種方法不再需要重新編譯或捕獲特權指令,因為作業系統本身在虛拟化程序中會互相緊密協作。
圖 3. 超虛拟化與客戶作業系統共享程序
正如前面介紹的一樣,超虛拟化技術需要為 hypervisor 修改客戶作業系統,這是它的一個缺點。但是超虛拟化提供了與未經虛拟化的系統相接近的性能。與完全虛拟化類似,超虛拟化技術可以同時支援多個不同的作業系統。
作業系統級的虛拟化
我們要介紹的最後一種技術是作業系統級的虛拟化,它使用的技術與前面所介紹的有所不同。這種技術在作業系統本身之上實作伺服器的虛拟化。這種方法支援單個作業系統,并可以将獨立的伺服器互相簡單地隔離開來(參見圖 4)。
圖 4. 作業系統級虛拟化實作伺服器的隔離
作業系統級的虛拟化要求對作業系統的核心進行一些修改,但是其優點是可以獲得原始性能。
回頁首
為什麼虛拟化如此重要?
在了解目前 Linux 可以使用的虛拟化方法之前,讓我們先來了解一下虛拟化的優點。
從商業角度來看,使用虛拟化技術有很多原因。大部分原因都可以歸結于伺服器的鞏固(server consolidation)。簡單來說,如果您可以對一個伺服器上多個未經充分利用的系統進行虛拟化,由于伺服器的數量少了,顯然可以節省大量電力、空間、制冷和管理成本。由于很難确定伺服器的利用情況,虛拟化技術支援稱為動态遷移的技術。動态遷移(Live migration)允許作業系統及其應用程式遷移到新的伺服器上,進而實作負載在可用硬體上的均衡。
虛拟化技術對于開發人員來說也非常重要。Linux 核心占據了一個單一的位址空間,這意味着核心或任何驅動程式的故障都會導緻整個作業系統的崩潰。虛拟化技術意味着您可以運作多個作業系統,如果其中一個系統由于某個 bug 而崩潰了,那麼 hypervisor 和其他作業系統都依然可以繼續運作。這可以使核心的調試非常類似于使用者空間應用程式的調試。
回頁首
與 Linux 有關的虛拟化項目
表 1 給出了幾個 Linux 系統上的虛拟化項目,并着重介紹了其中的開源解決方案。
表 1. 與 Linux 有關的虛拟化項目
項目 | 類型 | 許可證 |
---|---|---|
Bochs | 仿真 | LGPL |
QEMU | 仿真 | LGPL/GPL |
VMware | 完全虛拟化 | 私有 |
z/VM | 完全虛拟化 | 私有 |
Xen | 超虛拟化 | GPL |
UML | 超虛拟化 | GPL |
Linux-VServer | 作業系統級虛拟化 | GPL |
OpenVZ | 作業系統級虛拟化 | GPL |
有關其他解決方案的資訊,請參看 參考資料 部分。
Bochs(仿真)
Bochs 是一個 x86 計算機仿真器,它在很多平台上(包括 x86、PowerPC、Alpha、SPARC 和 MIPS)都可以移植和運作。使 Bochs 更為有趣的是它不僅可以對處理器進行仿真,還可以對整個計算機進行仿真,包括計算機的外圍裝置,比如鍵盤、滑鼠、視訊圖像硬體、網卡(NIC)等。
Bochs 可以配置作為一個老式的 Intel® 386 或其後繼處理器使用,例如 486、Pentium、Pentium Pro 或 64 位處理器。它甚至還可以對一些可選的圖形指令進行仿真,例如 MMX 和 3DNow。
使用 Bochs 仿真器,您可以運作任何 Linux 上的 Linux 發行版、Linux 上的 Microsoft® Windows® 95/98/NT/2000(以及各種應用程式),甚至 Linux 上的 BSD(Berkeley Software Distribution)作業系統(FreeBSD、OpenBSD 等)。
QEMU(仿真)
QEMU 是另外一個仿真器,它與 Bochs 非常類似,不過也有一些值得一提的差別。QEMU 支援兩種操作模式。第一種是 Full System Emulation(完全系統仿真)模式。這種模式與 Bochs 非常類似,它可以對一個具有處理器和外圍裝置的完整個人計算機(PC)進行仿真。這種模式可以仿真很多處理器架構,例如 x86、x86_64、ARM、SPARC、PowerPC 和 MIPS,其動态轉換的速度也比較理想。使用這種模式,您可以在 Linux、Solaris 和 FreeBSD 上仿真 Windows 作業系統(包括 XP)和 Linux。很多其他作業系統的組合也都可以得到支援(更多資訊請參看 參考資料 部分)。
QEMU 還可以支援第二種模式,稱為 User Mode Emulation(使用者模式仿真)。這種模式隻能宿主于 Linux,在這種模式下,可以啟動不同體系結構的二進制檔案。例如,在 x86 平台上運作的 Linux 系統上可以執行為 MIPS 體系架構編譯的二進制檔案。這種模式支援的其他體系結構還包括 ARM、SPARC 和 PowerPC,而且還有很多尚在開發之中。
VMware(完全虛拟化)
VMware 是完全虛拟化的一個商業解決方案。在客戶作業系統和裸硬體之間有一個 hypervisor 作為抽象層使用。這個抽象層允許任何作業系統在硬體上運作,而不需要了解任何其他客戶作業系統。
VMware 也會對可用的 I/O 硬體進行虛拟化,并将一些高性能的裝置驅動程式加入到 hypervisor 中。
整個虛拟化後的環境都作為一個檔案儲存,這意味着整個系統(包括客戶作業系統、VM 和虛拟硬體)可以很容易地快速遷移到新主控端器上進行負載均衡。
z/VM (完全虛拟化)
盡管 IBM System z™ 是一個新品牌,不過它實際上已經有很長的一段曆史,可以一直追溯到 20 世紀 60 年代。System/360 在 1965 年就可以支援使用虛拟機進行虛拟化。有趣的是,System z 保留了對之前的 System/360 産品線的向後相容性。
z/VM® 是 System z 上的作業系統 hypervisor。其核心是 Control Program(CP),它為客戶作業系統,包括 Linux,提供了實體資源的虛拟化(參見圖 5)。這樣,多個處理器和其他資源就可以在多個客戶作業系統上被虛拟化。
圖 5. 使用 z/VM 的作業系統級虛拟化
z/VM 也可以為想要互相通信的客戶作業系統仿真一個客戶區域網路(LAN)。仿真完全是在 hypervisor 中進行的,是以相當安全。
Xen(超虛拟化)
Xen 是一個來自于 XenSource 的作業系統級超虛拟化的免費開源解決方案。回想一下在超虛拟化中,hypervisor 和作業系統會共同協作,雖然作業系統需要進行一些更改,但卻可以帶來接近于原始系統的性能。
就像 Xen 需要進行協作(對客戶作業系統進行修改)一樣,隻有那些修補過的作業系統才可以通過 Xen 進行虛拟化。Linux 本身就是開源的,是以從 Linux 角度來看,這是一個很合理的折衷,因為最終可以獲得比完全虛拟化更好的性能。但是從廣泛支援的角度來看(例如對其他非開源作業系統的支援),這顯然是一個缺點。
Windows 可以在 Xen 上作為一個客戶作業系統運作,但是它隻能在運作 Intel Vanderpool 或 AMD Pacifica 的系統上使用。支援 Xen 的其他作業系統包括 Minix、Plan 9、NetBSD、FreeBSD 和 OpenSolaris。
User-mode Linux(超虛拟化)
User-mode Linux(UML)允許 Linux 作業系統在其他作業系統的使用者空間中運作。每個客戶 Linux 作業系統都存在于宿主 Linux 作業系統中的一個程序中(參見圖 6)。這就允許 Linux 核心(使用自己的相關使用者空間)在單個 Linux 核心中運作。
圖 6. User-mode Linux 中的 Linux
在 2.6 版本的 Linux 核心中,UML 駐留于主核心樹内,但它必須提前啟用,然後再重新編譯才能使用。這些變化除了常見的虛拟化功能之外,還可以提供裝置的虛拟化。這樣一來,客戶作業系統就可以共享可用的實體裝置,例如塊裝置(比如軟碟、CD-ROM 和檔案系統)、控制台、NIC 裝置、聲音硬體等。
注意由于客戶核心是在應用程式空間中運作的,是以它們必須為這種用法而被特殊編譯(不過它們可以是不同的核心版本)。這樣就産生了主機核心(硬體上的核心)和客戶核心(在主機核心的使用者空間中運作)。這些核心甚至可以是嵌套的,這樣就允許一個客戶核心在另外一個運作于主機核心的客戶核心上運作。
Linux-VServer(作業系統級虛拟化)
Linux-VServer 是一個作業系統級虛拟化解決方案。Linux-VServer 對 Linux 核心進行虛拟化,這樣多個使用者空間環境 —— 又稱為Virtual Private Server(VPS) —— 就可以單獨運作,而不需要互相了解。Linux-VServer 通過修改 Linux 核心實作使用者空間的隔離。
要将各個使用者空間與其他使用者空間隔離開來,就需要從上下文的概念入手。上下文 是給定 VPS 程序使用的一個容器,這樣通過諸如
ps
之類的工具就可以了解 VPS 的程序。核心為最初的引導定義了一個預設的上下文。另外管理端還能檢視所有的上下文(所有的執行程序)。正如您可能猜到的那樣,核心和内部資料結構也需要進行修改來支援這種虛拟化方法。
Linux-VServer 還使用了一種
chroot
格式來為每個 VPS 隔離 root 目錄。雖然
chroot
允許指定新 root 目錄,但還是需要其他一些功能(稱為 Chroot-Barrier)來限制 VPS 脫離其隔離的 root 目錄回到上級目錄。給定一個隔離的 root 目錄之後,每個 VPS 就可以擁有自己的使用者清單和 root 密碼。
2.4 和 2.6 版本的 Linux 核心支援 Linux-VServer,它可以運作于很多平台之上,包括 x86、x86-64、SPARC、MIPS、ARM 和 PowerPC。
OpenVZ(作業系統級虛拟化)
OpenVZ 是另外一個作業系統級的虛拟化解決方案,它與 Linux-VServer 類似,不過也有一些有趣的差別。OpenVZ 是一個支援虛拟化的核心(修改過的),可以支援使用者空間隔離、VPS 和一組使用者管理工具。例如,您可以簡單地從指令行建立一個新的 VPS:
清單 1. 從指令行建立 VPS
|
另外還可以使用
vzlist
指令顯示目前建立的 VPS,該指令與标準 Linux
ps
指令類似。
為了對程序進行排程,OpenVZ 還包括了兩級 CPU 排程器。首先,排程器确定哪個 VPS 應該獲得 CPU。在這個步驟完成之後,第二級排程器會根據給定的标準 Linux 優先級挑選程序來執行。
OpenVZ 還包括了所謂的 beancounters。beancounter 包括很多參數,這些參數為給定的 VPS 定義了資源配置設定。這為 VPS 提供了一定層次上的控制,定義了有多少記憶體可用,有多少程序間通信(IPC)對象可用等。
OpenVZ 的一個特性是檢查點功能和将 VPS 從一個實體伺服器遷移到其他實體伺服器上的能力。檢查點 意味着正在運作的 VPS 的狀态被當機并存儲到一個檔案中。然後可以将這個檔案遷移到一個新伺服器上并加以還原以使 VPS 恢複運作。
OpenVZ 支援很多硬體體系結構,包括 x86、x86-64 和 PowerPC。
回頁首
對完全虛拟化和超虛拟化的硬體支援
回想一下 IA-32(x86)體系結構在進行虛拟化時會産生的一些問題。特定的特權模式指令無法捕獲,基于所使用的模式還可能傳回不同的結果。例如,x86
STR
指令可以檢索安全狀态,但是所傳回的值要取決于請求者特定的特權級别。在嘗試在不同的層次對不同的作業系統進行虛拟化時,這會出現問題。例如,x86 支援 4 環保護,其中級别 0 (最高特權)通常運作作業系統,級别 1 和 2 支援作業系統服務,級别 3(最低級别)支援應用程式。不過硬體供應商已經認識到了這種缺陷(以及其他一些問題),并且已經開發了一些支援并加速虛拟化的新設計。
Intel 正在開發新虛拟化技術,能在 x86(VT-x)和 Itanium®(VT-i)體系架構上支援 hypervisor。VT-x 支援兩種格式的操作,一種用于 VMM(root),另外一種用于客戶作業系統(非 root)。root 格式完全是特權級的,而非 root 格式是非特權級的(即使對環 0 來說也是如此)。這種體系架構支援定義指令來使 VM(客戶作業系統)退出到 VMM 和儲存處理器狀态。此外還添加了許多其他的功能,請參看 參考資料 部分。
AMD 也開發了硬體輔助虛拟化技術,稱為 Pacifica。除了其他一些特性之外,Pacifica 還為在特殊指令執行時儲存的客戶作業系統維護了一個控制塊。
VMRUN
指令允許虛拟機(及其相關的客戶作業系統)一直運作,直到 VMM 重新獲得控制權為止(這也是可配置的)。這種可配置能力允許 CMM 為每個客戶作業系統定制特權指令。Pacifica 還可以使用宿主和客戶記憶體管理單元(MMU)表來進行位址轉換。
這些新技術也可以應用到此處讨論的很多其他虛拟化技術中,包括 Xen、VMware、User-mode Linux 等。
回頁首
Linux KVM(核心虛拟機)
Linux 傳出的最新消息是将 KVM 合并到 Linux 核心中(2.6.20)。KVM 是一種完全虛拟化解決方案,它有一個方面非常獨特:它将 Linux 核心轉換為一個使用核心子產品的 hypervisor。這個子產品允許使用其他客戶作業系統,然後在宿主 Linux 核心的使用者空間中運作(參見圖 7)。核心中的 KVM 通過
/dev/kvm
字元裝置來公開虛拟化後的硬體。客戶作業系統使用為 PC 硬體仿真修改過的 QEMU 程序與 KVM 子產品接口。
圖 7. 使用核心虛拟機(KVM)的虛拟化
KVM 子產品向核心中引入了一個新的執行子產品。普通核心支援核心 模式和使用者 模式,而 KVM 則引入了一種客戶 模式。客戶模式用來執行所有非 I/O 客戶代碼,而普通使用者模式支援客戶 I/O。
KVM 的引入是 Linux 的一個有趣革新,因為它代表了作為主流 Linux 核心一部分的第一個虛拟化技術。它已經存在于 2.6.20 樹中,不過也可以作為 2.6.19 核心的一個核心子產品使用。當在支援虛拟化的硬體上運作時,KVM 支援 Linux(32 位和 64 位)和 Windows(32 位)客戶機。有關 KVM 的更多資訊,請參看 參考資料 部分。
回頁首
結束語
如果 40 年前出現的技術還可以算是“新”技術的話,那麼虛拟化就是一個重要的新技術領域。虛拟化技術已經在很多場合中應用過了,但現在主要的關注點是伺服器和作業系統的虛拟化。與 Linux 非常類似,虛拟化為性能、可移植性和靈活性提供了很多選項。這意味着您可以選擇最适合于您自己應用程式的虛拟化方法。
參考資料
學習
- 您可以參閱本文在 developerWorks 全球站點上的 英文原文 。
- 如果 IBM System 對于您來說是全新的,那麼 New to IBM Systems 頁面将會非常有幫助。這個頁面詳細介紹了 System i、p、x、z 的知識以及其他更多内容。
- IBM 的 網格計算 基于一組開放标準和協定,這些标準和協定對分布式計算機進行虛拟化來建立功能強大的單一系統。
- 在 developerWorks 中國網站 Linux 專區 中可找到為 Linux 開發人員準備的更多資源。
- 随時關注 developerWorks 技術活動 和 網絡廣播。
獲得産品和技術
- Bochs 和 QEMU 是 PC 仿真器,它們允許諸如 Windows 或 Linux 之類的作業系統在 Linux 作業系統的使用者空間中運作。
- VMware 是一個流行的完全虛拟化的商業解決方案,它可以對未經修改的作業系統進行虛拟化。
- z/VM 是 64 位 z/Architecture 使用的最新的 VM 作業系統。z/VM 通過硬體輔助提供了完全虛拟化功能,并且可以支援很多作業系統,包括 Linux。
- Xen 是一個開源的超虛拟化解決方案,它雖然需要對客戶作業系統進行修改,但可以通過與 hypervisor 的協作獲得接近原始系統的性能。
- User-mode Linux 是另外一個超虛拟化解決方案,也是開源的。每個客戶作業系統都是作為主機作業系統的一個程序執行的。
- coLinux 或 Cooperative Linux,是一個允許兩個作業系統協作式共享底層硬體的虛拟化解決方案。
- Linux-Vserver 是一個 GNU/Linux 系統使用的作業系統級虛拟化解決方案,它安全地隔離了各個客戶伺服器。
- OpenVZ 是一個作業系統級虛拟化解決方案,可以支援檢查點和動态遷移。
- Linux KVM 是第一個內建到主流 Linux 核心中的虛拟化技術。通過一個可加載的核心子產品,運作于可虛拟化的硬體上的 Linux 核心可以充當 hypervisor 并可支援未經修改的 Linux 和 Windows 客戶作業系統。
- 訂購免費的 SEK for Linux,共包含兩張 DVD,其中有用于 Linux 的最新 IBM 試用軟體,包括 DB2®、Lotus®、Rational®、Tivoli® 和 WebSphere®。
- 利用可直接從 developerWorks 下載下傳的 IBM 試用版軟體 建構您的下一個 Linux 開發項目。
讨論
- 通過參與 developerWorks blog 加入 developerWorks 社群。
關于作者
M. Tim Jones 是一名嵌入式軟體工程師,他是 GNU/Linux Application Programming、AI Application Programming以及 BSD Sockets Programming from a Multilanguage Perspective 等書的作者。他的工程背景非常廣泛,從同步宇宙飛船的核心開發到嵌入式架構設計,再到網絡協定的開發。Tim 是位于科羅拉多州 Longmont 的 Emulex Corp. 的一名顧問工程師。
轉載于:https://www.cnblogs.com/yecllsl/archive/2011/02/12/1952337.html