天天看點

linux 上的虛拟化技術

Linux上的虛拟化技術

轉自http://blog.zhaoke.com/45.html

趙珂, 2007-01-05  

linux 上的虛拟化技術

虛拟化技術的方法, 架構和實作概覽

級别: 中級

M. Tim Jones [[email protected]], 顧問工程師, Emulex

原文:  Virtual Linux

譯: 趙珂 cn.zhaoke.com

http://blog.zhaoke.com/45.html

2006年12月29日

虛拟化技術的應用十分廣泛. 目前虛拟化技術主要關注于伺服器的虛拟化, 或在單個主機上寄存多個獨立的作業系統. 本文首先介紹虛拟化技術的原理, 然後讨論多個虛拟化技術的實作方法. 另外介紹了一些其它的虛拟化技術, 比如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模拟需要的硬體

linux 上的虛拟化技術

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

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

模拟器和開發

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

全虛拟化

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

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

linux 上的虛拟化技術

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

老機器上的Hypervisors

一些老的硬體如x86, 全虛拟化遇到了問題. 比如, 一些敏感的指令需要由VMM來處理(VMM不能設定陷阱). 是以, Hypervisors必須動态掃描和捕獲特權代碼來處理問題.

半虛拟化

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

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

linux 上的虛拟化技術

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

作業系統級的虛拟化

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

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

linux 上的虛拟化技術

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

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

在了解當今主流的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的作業系統級虛拟化技術

linux 上的虛拟化技術

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 上的虛拟化技術

在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的虛拟化

linux 上的虛拟化技術

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 上直接下載下傳。

讨論

通過參與  developerWorks blogs   加入 developerWorks 社群。

關于作者

Tim Jones 是一名嵌入式軟體工程師,他是 GNU/Linux Application Programming、AI Application Programming 以及 BSD Sockets Programming from a Multilanguage Perspective 等書的作者。他的工程背景非常廣泛,從同步宇宙飛船的核心開發到嵌入式架構設計,再到網絡協定的開發。Tim 是 Emulex Corp. 的一名資深軟體工程師。

相關文章

KVM虛拟化常見問題

使用者友好的Linux虛拟技術: KVM

KVM: 基于核心的虛拟驅動

如何在具有Wifi網絡的筆記本上配置Xen客戶機

Linux核心2.6.20增加虛拟化解決方案KVM

備注

轉載請保持文章完整性, 歡迎到blog.zhaoke.com 網站與趙珂交流.

關鍵字:  linux ,   virtualization

繼續閱讀