進行虛擬化 就是要將某種形式的東西以另一種形式呈現出來。對計算機進行虛擬化就是要將計算機以多臺計算機或一臺徹底不一樣的計算機的形式呈現出來。html
虛擬化也能夠將多臺計算機組合成一臺計算機的形式呈現出來。這一般稱爲服務器聚合或網格計算。前端
下面讓咱們首先來看一下虛擬化的起源。linux
虛擬化並非什麼新主題;實際上,它的存在已經超過 40 年了。虛擬化技術最先的一些用法包括 IBM® 704四、麻省理工學院(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 所示。
正如您所能預見的同樣,使用硬件仿真的主要問題是速度會很是慢。因爲每條指令都必須在底層硬件上進行仿真,所以速度減慢 100 倍的狀況也並不稀奇。若要實現高度保真的仿真,包括週期精度、所仿真的 CPU 管道以及緩存行爲,實際速度差距甚至可能會達到 1000 倍之多。
硬件仿真也有本身的優勢。例如,使用硬件仿真,您能夠在一個 ARM 處理器主機上運行爲 PowerPC® 設計的操做系統,而不須要任何修改。您甚至能夠運行多個虛擬機,每一個虛擬器仿真一個不一樣的處理器。
徹底虛擬化(full virtualization),也稱爲原始虛擬化,是另一種虛擬化方法。這種模型使用一個虛擬機,它在客戶操做系統和原始硬件之間進行協調(參見圖 2)。「協調」在這裏是一個關鍵,由於 VMM 在客戶操做系統和裸硬件之間提供協調。特定受保護的指令必須被捕獲下來並在 hypervisor 中進行處理,由於這些底層硬件並不禁操做系統所擁有,而是由操做系統經過 hypervisor 共享。
雖然徹底虛擬化的速度比硬件仿真的速度要快,可是其性能要低於裸硬件,由於中間通過了 hypervisor 的協調過程。徹底虛擬化的最大優勢是操做系統無需任何修改就能夠直接運行。唯一的限制是操做系統必需要支持底層硬件(例如 PowerPC)。
超虛擬化(paravirtualization)是另一種流行的虛擬化技術,它與徹底虛擬化有一些相似。這種方法使用了一個 hypervisor 來實現對底層硬件的共享訪問,還將與虛擬化有關的代碼集成到了操做系統自己中(參見圖 3)。這種方法再也不須要從新編譯或捕獲特權指令,由於操做系統自己在虛擬化進程中會相互緊密協做。
正如前面介紹的同樣,超虛擬化技術須要爲 hypervisor 修改客戶操做系統,這是它的一個缺點。可是超虛擬化提供了與未經虛擬化的系統相接近的性能。與徹底虛擬化相似,超虛擬化技術能夠同時支持多個不一樣的操做系統。
咱們要介紹的最後一種技術是操做系統級的虛擬化,它使用的技術與前面所介紹的有所不一樣。這種技術在操做系統自己之上實現服務器的虛擬化。這種方法支持單個操做系統,並能夠將獨立的服務器相互簡單地隔離開來(參見圖 4)。
操做系統級的虛擬化要求對操做系統的內核進行一些修改,可是其優勢是能夠得到原始性能。
在瞭解目前 Linux 可使用的虛擬化方法以前,讓咱們先來了解一下虛擬化的優勢。
從商業角度來看,使用虛擬化技術有不少緣由。大部分緣由均可以歸結於服務器的鞏固(server consolidation)。簡單來講,若是您能夠對一個服務器上多個未經充分利用的系統進行虛擬化,因爲服務器的數量少了,顯然能夠節省大量電力、空間、製冷和管理成本。因爲很難肯定服務器的利用狀況,虛擬化技術支持稱爲動態遷移的技術。動態遷移(Live migration)容許操做系統及其應用程序遷移到新的服務器上,從而實現負載在可用硬件上的均衡。
虛擬化技術對於開發人員來講也很是重要。Linux 內核佔據了一個單一的地址空間,這意味着內核或任何驅動程序的故障都會致使整個操做系統的崩潰。虛擬化技術意味着您能夠運行多個操做系統,若是其中一個系統因爲某個 bug 而崩潰了,那麼 hypervisor 和其餘操做系統都依然能夠繼續運行。這可使內核的調試很是相似於用戶空間應用程序的調試。
表 1 給出了幾個 Linux 系統上的虛擬化項目,並着重介紹了其中的開源解決方案。
項目 | 類型 | 許可證 |
---|---|---|
Bochs | 仿真 | LGPL |
QEMU | 仿真 | LGPL/GPL |
VMware | 徹底虛擬化 | 私有 |
z/VM | 徹底虛擬化 | 私有 |
Xen | 超虛擬化 | GPL |
UML | 超虛擬化 | GPL |
Linux-VServer | 操做系統級虛擬化 | GPL |
OpenVZ | 操做系統級虛擬化 | GPL |
有關其餘解決方案的信息,請參看 參考資料 部分。
Bochs 是一個 x86 計算機仿真器,它在不少平臺上(包括 x8六、PowerPC、Alpha、SPARC 和 MIPS)均可以移植和運行。使 Bochs 更爲有趣的是它不只能夠對處理器進行仿真,還能夠對整個計算機進行仿真,包括計算機的外圍設備,好比鍵盤、鼠標、視頻圖像硬件、網卡(NIC)等。
Bochs 能夠配置做爲一個老式的 Intel® 386 或其後繼處理器使用,例如 48六、Pentium、Pentium Pro 或 64 位處理器。它甚至還能夠對一些可選的圖形指令進行仿真,例如 MMX 和 3DNow。
使用 Bochs 仿真器,您能夠運行任何 Linux 上的 Linux 發行版、Linux 上的 Microsoft® Windows® 95/98/NT/2000(以及各類應用程序),甚至 Linux 上的 BSD(Berkeley Software Distribution)操做系統(FreeBSD、OpenBSD 等)。
QEMU 是另一個仿真器,它與 Bochs 很是相似,不過也有一些值得一提的區別。QEMU 支持兩種操做模式。第一種是 Full System Emulation(徹底系統仿真)模式。這種模式與 Bochs 很是相似,它能夠對一個具備處理器和外圍設備的完整我的計算機(PC)進行仿真。這種模式能夠仿真不少處理器架構,例如 x8六、x86_6四、ARM、SPARC、PowerPC 和 MIPS,其動態轉換的速度也比較理想。使用這種模式,您能夠在 Linux、Solaris 和 FreeBSD 上仿真 Windows 操做系統(包括 XP)和 Linux。不少其餘操做系統的組合也均可以獲得支持(更多信息請參看 參考資料 部分)。
QEMU 還能夠支持第二種模式,稱爲 User Mode Emulation(用戶模式仿真)。這種模式只能宿主於 Linux,在這種模式下,能夠啓動不一樣體系結構的二進制文件。例如,在 x86 平臺上運行的 Linux 系統上能夠執行爲 MIPS 體系架構編譯的二進制文件。這種模式支持的其餘體系結構還包括 ARM、SPARC 和 PowerPC,並且還有不少尚在開發之中。
VMware 是徹底虛擬化的一個商業解決方案。在客戶操做系統和裸硬件之間有一個 hypervisor 做爲抽象層使用。這個抽象層容許任何操做系統在硬件上運行,而不須要了解任何其餘客戶操做系統。
VMware 也會對可用的 I/O 硬件進行虛擬化,並將一些高性能的設備驅動程序加入到 hypervisor 中。
整個虛擬化後的環境都做爲一個文件保存,這意味着整個系統(包括客戶操做系統、VM 和虛擬硬件)能夠很容易地快速遷移到新宿主機器上進行負載均衡。
儘管 IBM System z™ 是一個新品牌,不過它實際上已經有很長的一段歷史,能夠一直追溯到 20 世紀 60 年代。System/360 在 1965 年就能夠支持使用虛擬機進行虛擬化。有趣的是,System z 保留了對以前的 System/360 產品線的向後兼容性。
z/VM® 是 System z 上的操做系統 hypervisor。其核心是 Control Program(CP),它爲客戶操做系統,包括 Linux,提供了物理資源的虛擬化(參見圖 5)。這樣,多個處理器和其餘資源就能夠在多個客戶操做系統上被虛擬化。
z/VM 也能夠爲想要相互通訊的客戶操做系統仿真一個客戶局域網(LAN)。仿真徹底是在 hypervisor 中進行的,所以至關安全。
Xen 是一個來自於 XenSource 的操做系統級超虛擬化的免費開源解決方案。回想一下在超虛擬化中,hypervisor 和操做系統會共同協做,雖然操做系統須要進行一些更改,但卻能夠帶來接近於原始系統的性能。
就像 Xen 須要進行協做(對客戶操做系統進行修改)同樣,只有那些修補過的操做系統才能夠經過 Xen 進行虛擬化。Linux 自己就是開源的,因此從 Linux 角度來看,這是一個很合理的折衷,由於最終能夠得到比徹底虛擬化更好的性能。可是從普遍支持的角度來看(例如對其餘非開源操做系統的支持),這顯然是一個缺點。
Windows 能夠在 Xen 上做爲一個客戶操做系統運行,可是它只能在運行 Intel Vanderpool 或 AMD Pacifica 的系統上使用。支持 Xen 的其餘操做系統包括 Minix、Plan 九、NetBSD、FreeBSD 和 OpenSolaris。
User-mode Linux(UML)容許 Linux 操做系統在其餘操做系統的用戶空間中運行。每一個客戶 Linux 操做系統都存在於宿主 Linux 操做系統中的一個進程中(參見圖 6)。這就容許 Linux 內核(使用本身的相關用戶空間)在單個 Linux 內核中運行。
在 2.6 版本的 Linux 內核中,UML 駐留於主內核樹內,但它必須提早啓用,而後再從新編譯才能使用。這些變化除了常見的虛擬化功能以外,還能夠提供設備的虛擬化。這樣一來,客戶操做系統就能夠共享可用的物理設備,例如塊設備(好比軟盤、CD-ROM 和文件系統)、控制檯、NIC 設備、聲音硬件等。
注意因爲客戶內核是在應用程序空間中運行的,所以它們必須爲這種用法而被特殊編譯(不過它們能夠是不一樣的內核版本)。這樣就產生了主機內核(硬件上的內核)和客戶內核(在主機內核的用戶空間中運行)。這些內核甚至能夠是嵌套的,這樣就容許一個客戶內核在另一個運行於主機內核的客戶內核上運行。
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,它能夠運行於不少平臺之上,包括 x8六、x86-6四、SPARC、MIPS、ARM 和 PowerPC。
OpenVZ 是另一個操做系統級的虛擬化解決方案,它與 Linux-VServer 相似,不過也有一些有趣的區別。OpenVZ 是一個支持虛擬化的內核(修改過的),能夠支持用戶空間隔離、VPS 和一組用戶管理工具。例如,您能夠簡單地從命令行建立一個新的 VPS:
$ vzctl create 42 --ostemplate fedora-core-4 Creating VPS private area VPS private area was created $ vzctl start 42 Starting VPS ... VPS is mounted
另外還可使用 vzlist
命令顯示目前建立的 VPS,該命令與標準 Linux ps
命令相似。
爲了對進程進行調度,OpenVZ 還包括了兩級 CPU 調度器。首先,調度器肯定哪一個 VPS 應該得到 CPU。在這個步驟完成以後,第二級調度器會根據給定的標準 Linux 優先級挑選進程來執行。
OpenVZ 還包括了所謂的 beancounters。beancounter 包括不少參數,這些參數爲給定的 VPS 定義了資源分配。這爲 VPS 提供了必定層次上的控制,定義了有多少內存可用,有多少進程間通訊(IPC)對象可用等。
OpenVZ 的一個特性是檢查點功能和將 VPS 從一個物理服務器遷移到其餘物理服務器上的能力。檢查點 意味着正在運行的 VPS 的狀態被凍結並存儲到一個文件中。而後能夠將這個文件遷移到一個新服務器上並加以還原以使 VPS 恢復運行。
OpenVZ 支持不少硬件體系結構,包括 x8六、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 內核中(2.6.20)。KVM 是一種徹底虛擬化解決方案,它有一個方面很是獨特:它將 Linux 內核轉換爲一個使用內核模塊的 hypervisor。這個模塊容許使用其餘客戶操做系統,而後在宿主 Linux 內核的用戶空間中運行(參見圖 7)。內核中的 KVM 經過 /dev/kvm
字符設備來公開虛擬化後的硬件。客戶操做系統使用爲 PC 硬件仿真修改過的 QEMU 進程與 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 很是相似,虛擬化爲性能、可移植性和靈活性提供了不少選項。這意味着您能夠選擇最適合於您本身應用程序的虛擬化方法。