1. 程式人生 > >Linux下虛擬化技術深入探討

Linux下虛擬化技術深入探討

虛擬化技術的方法, 架構和實現概覽

虛擬化技術的應用十分廣泛. 當前虛擬化技術主要關注於伺服器的虛擬化, 或在單個主機上寄存多個獨立的作業系統. 本文首先介紹虛擬化技術的原理, 然後討論多個虛擬化技術的實現方法. 另外介紹了一些其它的虛擬化技術, 比如Linux上作業系統級的虛擬化技術.

  虛擬化把事物從一種形式改變為另一種形式. 計算機的虛擬化使單個計算機看起來像多個計算機或完全不同的計算機.

  虛擬化技術也可以使多臺計算機看起來像一臺計算機. 這叫做伺服器聚合(server aggregation)或網格計算(grid computing).

  首先我們回顧一下虛擬化技術的歷史.

  虛擬化技術的歷史

虛擬化技術不是一個新的主題; 實際上, 它已有40年的歷史. 最早使用虛擬化技術的是IBM 7044計算機, 它是基於MIT(麻省理工學院)為IBM704計算機開發的分時系統CTSS(Compatible Time Sharing System), 和曼徹斯特大學的Atlas專案(世界最早的超級計算機之一), 首次使用了請求調頁和系統管理程式呼叫.

  硬體虛擬化

  IBM早在1960年就認識到虛擬化技術的重要性, 於是開發了型號為Model 67的System/360主機. Model 67主機通過虛擬機器監視器(VMM, Virtual Machine Monitor)虛擬所有的硬體介面. 在早期的計算中, 作業系統被稱做Supervisor. 能夠執行在其它作業系統之上的作業系統被稱做hypervisor(名稱首次出現在1970年).

  VMM直接執行在底層硬體上, 允許執行多個虛擬機器(VMs). 每一個VM(虛擬機器)執行自己的作業系統例項 -- 早期時候稱為CMS, 或會話監視系統(CMS, Conversational Monitor System). 然後VM繼續發展. 今天你能夠在System z9主機上發現VM, 它能夠向後相容, 甚至是System/360.

  處理器虛擬化

  另外一個早期使用的虛擬化技術, 模擬處理器, 也叫做P-code(or pseudo-code)機. P-code是一種機器語言, 執行在虛擬機器上而不是實際的硬體. 知名的P-code語言在1970年由加州大學聖地亞哥分校的Pascal系統專案組開發. 它可以把Pascal程式編譯成P-code程式碼, 然後在具有P-code功能的虛擬機器上執行. P-code程式具有高度可移植性, 能夠執行在任何具有P-code功能的虛擬機器上.

  1960年的BCPL語言(基本組合程式設計語言, Basic Combined Programming Language)也使用了同樣的概念, 它是C語言的前身. 編譯器首先把BCPL程式碼編譯成一箇中間機器程式碼: O-code. 然後, O-code被編譯成目標機器程式碼. P-code模型已被廣泛使用到各種編譯器當中, 從而為編譯器移植到新的主機架構提供了複雜性.(通過一箇中間語言分成前端和後端).

  Java虛擬機器(JVM)
Java虛擬機器也採用了P-code模型. 從而我們可以簡單通過移植JVM程式到新架構的機器上來廣泛釋出Java程式.

  指令虛擬化

  近來頻繁出現的虛擬化概念: 指令虛擬化, 也叫做二進位制翻譯. 在這個模型中, 虛擬指令被動態翻譯成底層硬體的物理指令. 程式執行後, 程式碼一段一段地被翻譯. 如果出現分支, 一套新的程式碼指令將被引入和翻譯. 這十分類似於快取操作, 指令塊從記憶體移動到本地的快速快取記憶體中執行.

  近來Transmeta公司設計的Crusoe中央處理器使用了該模型. 二進位制翻譯由Code Morphing專利技術實現. 類似的一個例項, 全虛擬技術通過使用動態生成程式碼掃描來發現和重定向特權指令(解決特殊處理指令集中的問題).

  虛擬化技術的型別

  現在不只存在一種虛擬化技術. 事實上有多種方法可以使用不同層次的抽象來實現同樣的結果. 本章介紹Linux上三種最常用虛擬化技術的優點和弱點. 業屆有時使用不同的術語來描述同一個虛擬化技術. 為了保持連續性, 下面使用的術語參考了其它的術語.

  虛擬化技術和遊戲

  一篇虛擬化技術的文章如果沒有提到複合式大型電玩模擬器(MAME)就不是一篇完整的文章. MAME, 就如名字一樣, 是一個能夠模擬以往arcade遊戲的機器模擬器(全部). 做一個補充, 整個機器是被虛擬的, 包括聲音和圖形還有控制硬體. MAME是一個非常棒的應用程式, 你也可以通過仔細閱讀原始碼來了解它是如何實現的.

  硬體模擬器

  無可否認, 最複雜的虛擬化技術是硬體模擬器. 在這個方法中, 首先在主機系統上建立硬體VM, 然後模擬硬體的功能, 如圖1顯示:

  圖1. 硬體模擬器: 使用VM模擬需要的硬體
  

  正如你可能猜到, 硬體模擬器的主要問題是速度極慢. 因為每一個指令在底層硬體都需模擬, 所以速度慢了100倍. 高保真模擬還包含了迴圈校驗, 用於模擬CPU的管道和快取行為, 實際速度會慢了1000倍.

  硬體模擬有自己的優點. 比如, 使用硬體模擬, 你能夠在基於ARM處理器的主機上模擬執行基於PowerPC未經任何修改的作業系統. 你甚至能在每個不同模擬處理器上執行多個虛擬機器.

  模擬器和開發

  硬體模擬器最有意思的一個應用是firmware(韌體)和硬體協作開發. firmware開發人員無需等待最新硬體的推出, 他們可以使用目標硬體的虛擬機器來驗證實際程式碼中的許多概念.

  全虛擬化

  全虛擬化(Full virtualization), 也稱為原始虛擬化技術, 是另一種虛擬化方法. 該模型使用虛擬機器協調客戶作業系統和原始硬體(見圖2). 這裡"協調"是一個關鍵詞, 因為VMM在客戶作業系統和裸硬體之間用於工作協調. 一些受保護的指令必須由Hypervisor(虛擬機器管理程式)來捕獲和處理. 因為作業系統是通過Hypervisor來分享底層硬體.

  圖2. 全虛擬化: 使用Hypervisor分享底層硬體
  

  全虛擬化的執行速度要快於硬體模擬, 但是效能方面不如裸機, 因為Hypervisor需要佔用一些資源. 全虛擬化最大的優點是作業系統沒有經過任何修改. 它的唯一限制是作業系統必須能夠支援底層硬體(比如, PowerPC).

  老機器上的Hypervisors
一些老的硬體如x86, 全虛擬化遇到了問題. 比如, 一些敏感的指令需要由VMM來處理(VMM不能設定陷阱). 因此, Hypervisors必須動態掃描和捕獲特權程式碼來處理問題.

半虛擬化

  半虛擬化(Paravirtualization)是另一種類似於全虛擬化的熱門技術. 它使用Hypervisor(虛擬機器管理程式)分享存取底層的硬體, 但是它的客戶作業系統集成了虛擬化方面的程式碼. 該方法無需重新編譯或引起陷阱, 因為作業系統自身能夠與虛擬程序進行很好的協作.

  圖3. 半虛擬化: 通過客戶作業系統分享程序
  

上面提到過, 半虛擬化需要客戶作業系統做一些修改(配合Hypervisor), 這是一個不足之處. 但是半虛擬化提供了與原始系統相近的效能. 與全虛擬化一樣, 半虛擬化可以同時能支援多個不同的作業系統.

  作業系統級的虛擬化

  最後一個我們需要了解的虛擬化技術是作業系統級的虛擬化(Operating system-level virtualization), 它使用不同於上面的虛擬化方法. 該技術在作業系統之上虛擬多個伺服器, 支援在單個作業系統上簡單隔離每一個虛擬伺服器(見圖4).

  圖4. 作業系統級的虛擬化: 隔離單個伺服器
  

  作業系統級的虛擬化需要修改作業系統核心, 它的優點是具有原始主機的效能.

  為什麼虛擬技術如此重要?

  在瞭解當今主流的linux虛擬化技術之前, 我們先來看虛擬化技術的優點.

  從商業角度來看, 使用虛擬化技術有非常多的原因. 不過大多是用於伺服器加固. 簡單來說, 如果你能夠在單個服務上虛擬多個系統, 這樣少數的幾臺計算機顯然能夠節省耗電, 空間, 冷卻和管理開支. 考慮到確定伺服器利用狀況的困難, 虛擬化技術支援動態遷移(Live Migration). 動態遷移允許作業系統能夠遷移到另一臺全新的伺服器上, 從而減少當前主機的負載.

  虛擬化技術對開發人員來說也非常重要. Linux核心佔用了一個單一的地址空間, 這意味核心或任何驅動程式錯誤都能導致整個作業系統停止工作. 而通過虛擬化你可以執行多個作業系統, 如果其中一個系統由於錯誤而宕機, Hypervisor和其它的作業系統不會受到任何影響. 這對除錯核心來說就如同除錯使用者空間程式一樣.

  Linux相關的虛擬化專案

表1顯示了幾個可能加入到Linux(核心)的虛擬化技術, 主要關注於開源.

表1. Linux相關的虛擬化專案

CODE: 專案      /        型別      /      許可證
Bochs              模擬器          LGPL
QEMU              模擬器          LGPL/GPL
VMware           全虛擬化        閉源
z/VM               全虛擬化        閉源
Xen                半虛擬化         GPL
UML               半虛擬化         GPL
Linux-VServer  作業系統級虛擬化  GPL
OpenVZ          作業系統級虛擬化  GPL

  更多其它的虛擬化技術, 請查閱參考資料欄目.

  Bochs(模擬器)

  Bochs是一個模擬x86 CPU的計算機模擬器, 它具有可移植性和可執行在多種平臺上, 如x86, PowerPC, Alpha, SPARC和MIPS. Bochs的優點是不僅能模擬處理器, 而且能模擬整臺計算機, 包括外設如鍵盤, 滑鼠, 視屏影象硬體, 網絡卡等.

  Bochs能被配置成一臺老的Intel 386計算機, 或更新的處理器如486, Pentium, Pentium Pro, 或64位處理器. 甚至能模擬圖形指令如MMX和3DNow.

  你也能夠通過Bochs模擬器在Linux系統上執行任何Linux發行版, 還有Microsoft® Windows® 95/98/NT/2000(和多種應用程式), 甚至是BSD作業系統(FreeBSD, OpenBSD,等).

庫級的虛擬化

這裡沒有討論另一個虛擬化技術, 它通過庫來模擬作業系統的一部分. 比如Wine(一部分為linux開發的win32 API)和LxRun(一部分為Solaris開發的Linux API).

QEMU(模擬器)

QEMU是另一個類似於Bochs的模擬器, 它有一些值得注意的地方. QEMU支援2個操作模式. 一個是全系統模擬模式. 該模式類似Bochs模擬整個計算機系統(包括處理器和外設). 而且能在合理的速度下使用動態翻譯模擬一些處理器架構如X86, X86_64, ARM, SPARC, PowerPC和MIPS. 你還可以在Linux, Solaris和FreeBSD系統上模擬Windows系統(包括XP)和Linux系統. QEMU支援其它的作業系統組合(更多資訊見參考資料欄目).

QEMU的第二個模式: 使用者模式模擬. 該模式能寄存在Linux上, 不同平臺的二進位制程式也能執行. 比如, 一個MIPS平臺上的二進位制程式能夠執行在x86平臺上的Linux系統. 其它支援的平臺包括ARM, SPARC和PowerPC, 而且還有更多正在開發的平臺.

VMware(全虛擬化)

VMware是一個商業級的全虛擬化技術. Hypervisor是客戶作業系統和硬體之間的抽象層. 該抽象層允許任何其它客戶作業系統執行在主機作業系統之上.

VMware也能虛擬I/O硬體, 增加了高效能裝置驅動到Hypervisor中.

整個虛擬(機)環境實際上是一個單獨的檔案, 這意味整個系統(包括客戶作業系統, 虛擬機器和虛擬硬體)可以簡單快速地整合到一個新的主機, 從而實現負載均衡.

z/VM(全虛擬化)

當IBM System z™是一個全新名稱的時候, 事實上可以追述到1960年. System/360在1965年使用虛擬機器方法實現了虛擬技術. 令人感興趣的是System z能夠與最老的System/360系列主機相容.

z/VM®是System z作業系統的Hypervisor. 核心程式是控制程式(CP), 向客戶機作業系統提供硬體資源虛擬, 包括Linux(見圖5). 允許在多個客戶作業系統上虛擬多個處理器和其它資源.

圖5. 使用z/VM的作業系統級虛擬化技術

z/VM可以為那些需要相互通訊的客戶作業系統虛擬一個客戶區域網(LAN). 整個客戶區域網位於Hypervisor中, 所以很安全.

Xen(半虛擬化)

Xen由XenSource開發, 一個開源免費的作業系統級準虛擬技術. 回顧一下半虛擬技術, Hypervisor和作業系統共同協作, 雖然作業系統需要做一些修改, 但是效能上比較接近於原始效能.

Xen需要與系統共同協作(客戶作業系統需要修改), 只有打過補丁的系統才能使用Xen. 從Linux角度來看, Linux本身是開源的, 結果是Xen的效能要好於全虛擬化技術. 但是從系統支援(比如支援其它非開源的作業系統)的角度來看, 這顯然是一個不足之處.

在Xen上可以執行Windows客戶機, 但需要Intel Vanderpool或AMD Pacifica處理器的支援. 其它支援的作業系統包括Minix, Plan 9, NetBSD, FreeBSD, 和OpenSolaris.

使用者模式Linux(半虛擬化)

使用者模式Linux(UML, User-Mode Linux)支援在linux系統的使用者空間執行其它Linux作業系統. 每一個客戶作業系統是主機Linux系統上的一個標準的程序(見圖6). UML允許多個Linux核心(有自己的使用者空間)執行在單個Linux核心之中.

圖6. 使用者模式Linux: Linux寄存

在Linux 2.6核心中, UML存在於主核心樹中, 但是必須開啟和重新編譯才能使用UML. 一些修改包括, 裝置虛擬, 允許客戶作業系統分享存在的物理裝置, 比如塊裝置(磁碟, CD-ROM, 和檔案系統), 控制檯, 網絡卡, 音效卡等.

注: 客戶作業系統核心執行在使用者空間模式, 核心必須專門編譯才能在客戶系統中使用(可與主機作業系統核心版本不同). 整個主機存在兩套核心, 一個是主機核心(直接位於物理硬體之上), 另一個是客戶核心(執行在主機核心的使用者空間之中). 這些核心甚至可以相互巢狀, 允許客戶機核心執行在另外一個客戶機核心之中.

Linux-VServer(作業系統級虛擬化)

Linux-VServer是作業系統級的虛擬化解決方案. Linux-VServer虛擬Linux核心, 可以有多個使用者空間環境, 也稱做虛擬專用伺服器(VPS), 各個VPS各自獨立執行. Linux-VServer是通過修改Linux核心來隔離使用者空間.

為了隔離每個單獨的使用者空間, 我們先了解上下文環境. 上下文是一個VPS程序的容器, 因此我們可以使用ps等工具來了解vps程序的狀況. 系統首次初始化後, 核心定義了一個預設的上下文, 管理端能夠檢視所有的上下文(所有正在執行的程序). 你會猜到, 核心和內部資料結構需做一些修改來支援虛擬化.

Linux-VServer使用chroot隔離每個VPS的root目錄. 我們知道chroot允許指定新的root目錄, 但需額外的功能(叫做chroot-Barrier)來限制VPS不會跨越到上級目錄. 在設定一個隔離的root目錄後, 每一個VPS有自己的使用者列表和root口令.

Linux 2.4和2.6核心支援Linux-VServer, 可執行在許多平臺上, 包括x86, x86-64, SPARC, MIPS, ARM和PowerPC.

OpenVZ(作業系統級虛擬化)

OpenVZ是一個類似於Linux-VServer的操作系級級虛擬化解決方案. 它有一些自己獨特的地方. OpenVZ是一個內嵌虛擬化的核心(修改過的), 它支援使用者空間隔離, 虛擬專用主機(VPS)和一套使用者管理工具. 比如, 你可以通過下面命令簡單建立一個新的VPS:

列表1. 從命令列建立一個VPS

vzctl create 42 --ostemplate fedora-core-4
Creating VPS private area 正在建立VPS專用區域
VPS private area was created VPS專用區域成功建立
vzctl start 42
Starting VPS ... 啟動VPS
VPS is mounted 載入VPS分割槽

你也可以使用vzlist命令列出所有已建立的VPS, 這有點類似於標準的Linux命令ps(檢視程序的狀態).

OpenVZ包含一個兩級的CPU排程器來排程程序. 首先, 排程器確定需要使用CPU的VPS. 然後第二級排程器根據程序的優先順序來執行vps程序.

OpenVZ支援beancounters. 一個beancounters包含了定義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)結構上支援Hypervisors. VT-x支援兩個新的操作. 一個是VMM(root), 另一個是客戶作業系統(非root). root方式具有最高許可權, 而非root方式是非特權的(甚至ring 0). 結構方面也支援自定義指令(使用vmm)終止VM(客戶作業系統)和儲存處理器狀態. 其它功能請查閱參考資源欄目.

AMD也正在開發硬體級的虛擬化技術, 代號為Pacifica. Pacifica維護了一個客戶作業系統的控制塊(通過特殊指令儲存執行狀態). VMRUN指令允許虛擬機器(和它相聯絡的客戶作業系統)執行直到VMM重新獲得控制權(可自定義). 可配置性允許VMM為每一個客戶機自定義許可權. Pacifica也能使用主機和客戶機記憶體管理單元(MMU)表來提高地址翻譯.

這些硬體虛擬化技術能夠應用到許多的虛擬化技術當中, 包括Xen, VMware, User-mode Linux, 和其它的.

Linux KVM(核心虛擬機器)

最近的Linux新聞經常報道Linux 2.6.20核心增加了KVM虛擬化技術. KVM是全虛擬化的解決方案, 它的特點是系統核心通過新增核心模組使核心自身成為一個Hypervisor(虛擬機器管理程式). 核心中的KVM模組通過/dev/kvm字串裝置顯示被虛擬的硬體. KVM使用修改過的QEMU程序做為客戶作業系統介面.

圖7. KVM的虛擬化

KVM模組向核心增加了一個新的執行模式: 客戶模式. 官方原始核心(vanilla kernel)支援核心和使用者模式. 客戶模式用於執行所有非I/O客戶程式碼, 普通使用者模式支援客戶I/O.

增加KVM到Linux核心是Linux發展的一個重要里程碑, 這也是第一個整合到Linux主線核心的虛擬化技術. KVM將包含於2.6.20核心數中, 現在你也可以通過核心模組方式在2.6.19核心使用kvm. 當執行在支援的硬體(需Intel VT和AMD SVM處理器)上, kvm支援Linux(32和64為)和Windows(32為)客戶機. 更多KVM資訊, 請查閱參考資源欄目

總結

虛擬化技術是一個新的而且重要的領域, 如果"新"包括了過去的40年. 在過去它已經使用於許多場合, 但是現在最主要的一個焦點是伺服器和作業系統的虛擬化. 比如像Linux, 虛擬化給效能, 可移植性和複雜性提供了許多選項. 這也意味者你能夠為你的應用程式和專案選擇最合適的虛擬化方法.

參考資源

學習

您可以參閱本文在 developerWorks 全球站點上的 英文原文 。

如果你不熟悉IBM系統, 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/架構的虛擬機器作業系統. z/VM提供全虛擬化和支援大多的作業系統, 包括Linux.

Xen是一個開源的半虛擬化解決方案, 需修改客戶機的作業系統, 通過與hypervisor的協作能獲得接近於原始系統的效能.

User-mode Linux是另外一個開源的半虛擬化解決方案. 每一個客戶作業系統是主機作業系統的一個標準程序.

coLinux, 或協作Linux, 是一個提供兩個作業系統共同分享底層硬體的虛擬化解決方案.

Linux-Vserver是一個linux上的作業系統級的虛擬解決方案, 每一個客戶伺服器都被安全的隔離開來.

OpenVZ是一個作業系統級的虛擬化解決方案, 支援檢查點和動態遷移.

Linux KVM是第一個整合到Linux主線核心的虛擬化技術. Linux核心在載入一個核心可載入模組(kvm)後, 核心自身成為了一個Hypervisor程式, 如果有合適的硬體支援(Intel VT或AMD SVM處理器), 系統可執行未修改過的linux和windows客戶機作業系統.

訂購免費的 SEK for Linux,這有兩張 DVD,包括最新的 IBM for Linux 的試用軟體,包括 DB2®、Lotus®、Rational®、Tivoli® 和 WebSphere®.

在您的下一個開發專案中採用 IBM 試用軟體,這可以從 developerWorks 上直接下載。