簡述:在Linux 2.6內核中, UML存在于主內核樹中, 但是必須打開和重新編譯才能使用UML. 一些修改包括, 設備虛擬, 允許客戶操作系統(tǒng)分享存在的物理設備, 比如塊設備(磁盤, CD-ROM, 和文件系統(tǒng)), 控制臺, 網卡, 聲卡等.
虛擬化技術的應用十分廣泛. 當前虛擬化技術主要關注于服務器的虛擬化, 或在單個主機上寄存多個獨立的操作系統(tǒng). 本文首先介紹虛擬化技術的原理, 然后討論多個虛擬化技術的實現方法. 另外介紹了一些其它的虛擬化技術, 比如Linux上操作系統(tǒng)級的虛擬化技術.
虛擬化把事物從一種形式改變?yōu)榱硪环N形式. 計算機的虛擬化使單個計算機看起來像多個計算機或完全不同的計算機.
虛擬化技術也可以使多臺計算機看起來像一臺計算機. 這叫做服務器聚合(server aggregation)或網格計算(grid computing).
首先我們回顧一下虛擬化技術的歷史.
虛擬化技術的歷史
虛擬化技術不是一個新的主題; 實際上, 它已有40年的歷史. 最早使用虛擬化技術的是IBM 7044計算機, 它是基于MIT(麻省理工學院)為IBM704計算機開發(fā)的分時系統(tǒng)CTSS(Compatible Time Sharing System), 和曼徹斯特大學的Atlas項目(世界最早的超級計算機之一), 首次使用了請求調頁和系統(tǒng)管理程序調用.
硬件虛擬化
IBM早在1960年就認識到虛擬化技術的重要性, 于是開發(fā)了型號為Model 67的System/360主機. Model 67主機通過虛擬機監(jiān)視器(VMM, Virtual Machine Monitor)虛擬所有的硬件接口. 在早期的計算中, 操作系統(tǒng)被稱做Supervisor. 能夠運行在其它操作系統(tǒng)之上的操作系統(tǒng)被稱做hypervisor(名稱首次出現在1970年).
VMM直接運行在底層硬件上, 允許執(zhí)行多個虛擬機(VMs). 每一個VM(虛擬機)運行自己的操作系統(tǒng)實例 -- 早期時候稱為CMS, 或會話監(jiān)視系統(tǒng)(CMS, Conversational Monitor System). 然后VM繼續(xù)發(fā)展. 今天你能夠在System z9主機上發(fā)現VM, 它能夠向后兼容, 甚至是System/360.
處理器虛擬化
另外一個早期使用的虛擬化技術, 仿真處理器, 也叫做P-code(or pseudo-code)機. P-code是一種機器語言, 運行在虛擬機上而不是實際的硬件. 知名的P-code語言在1970年由加州大學圣地亞哥分校的Pascal系統(tǒng)項目組開發(fā). 它可以把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程序到新架構的機器上來廣泛發(fā)布Java程序.
指令虛擬化
近來頻繁出現的虛擬化概念: 指令虛擬化, 也叫做二進制翻譯. 在這個模型中, 虛擬指令被動態(tài)翻譯成底層硬件的物理指令. 程序執(zhí)行后, 代碼一段一段地被翻譯. 如果出現分支, 一套新的代碼指令將被引入和翻譯. 這十分類似于緩存操作, 指令塊從內存移動到本地的快速緩存內存中執(zhí)行.
近來Transmeta公司設計的Crusoe中央處理器使用了該模型. 二進制翻譯由Code Morphing專利技術實現. 類似的一個實例, 全虛擬技術通過使用動態(tài)生成代碼掃描來發(fā)現和重定向特權指令(解決特殊處理指令集中的問題).
虛擬化技術的類型
現在不只存在一種虛擬化技術. 事實上有多種方法可以使用不同層次的抽象來實現同樣的結果. 本章介紹Linux上三種最常用虛擬化技術的優(yōu)點和弱點. 業(yè)屆有時使用不同的術語來描述同一個虛擬化技術. 為了保持連續(xù)性, 下面使用的術語參考了其它的術語.
虛擬化技術和游戲
一篇虛擬化技術的文章如果沒有提到復合式大型電玩模擬器(MAME)就不是一篇完整的文章. MAME, 就如名字一樣, 是一個能夠模擬以往arcade游戲的機器模擬器(全部). 做一個補充, 整個機器是被虛擬的, 包括聲音和圖形還有控制硬件. MAME是一個非常棒的應用程序, 你也可以通過仔細閱讀源碼來了解它是如何實現的.
硬件模擬器
無可否認, 最復雜的虛擬化技術是硬件模擬器. 在這個方法中, 首先在主機系統(tǒng)上創(chuàng)建硬件VM, 然后模擬硬件的功能, 如圖1顯示:
圖1. 硬件模擬器: 使用VM模擬需要的硬件
正如你可能猜到, 硬件模擬器的主要問題是速度極慢. 因為每一個指令在底層硬件都需模擬, 所以速度慢了100倍. 高保真模擬還包含了循環(huán)校驗, 用于模擬CPU的管道和緩存行為, 實際速度會慢了1000倍.
硬件模擬有自己的優(yōu)點. 比如, 使用硬件模擬, 你能夠在基于ARM處理器的主機上模擬運行基于PowerPC未經任何修改的操作系統(tǒng). 你甚至能在每個不同模擬處理器上運行多個虛擬機.
模擬器和開發(fā)
硬件模擬器最有意思的一個應用是firmware(固件)和硬件協作開發(fā). firmware開發(fā)人員無需等待最新硬件的推出, 他們可以使用目標硬件的虛擬機來驗證實際代碼中的許多概念.
全虛擬化
全虛擬化(Full virtualization), 也稱為原始虛擬化技術, 是另一種虛擬化方法. 該模型使用虛擬機協調客戶操作系統(tǒng)和原始硬件(見圖2). 這里"協調"是一個關鍵詞, 因為VMM在客戶操作系統(tǒng)和裸硬件之間用于工作協調. 一些受保護的指令必須由Hypervisor(虛擬機管理程序)來捕獲和處理. 因為操作系統(tǒng)是通過Hypervisor來分享底層硬件.
圖2. 全虛擬化: 使用Hypervisor分享底層硬件
全虛擬化的運行速度要快于硬件模擬, 但是性能方面不如裸機, 因為Hypervisor需要占用一些資源. 全虛擬化最大的優(yōu)點是操作系統(tǒng)沒有經過任何修改. 它的唯一限制是操作系統(tǒng)必須能夠支持底層硬件(比如, PowerPC).
老機器上的Hypervisors
一些老的硬件如x86, 全虛擬化遇到了問題. 比如, 一些敏感的指令需要由VMM來處理(VMM不能設置陷阱). 因此, Hypervisors必須動態(tài)掃描和捕獲特權代碼來處理問題.
半虛擬化
半虛擬化(Paravirtualization)是另一種類似于全虛擬化的熱門技術. 它使用Hypervisor(虛擬機管理程序)分享存取底層的硬件, 但是它的客戶操作系統(tǒng)集成了虛擬化方面的代碼. 該方法無需重新編譯或引起陷阱, 因為操作系統(tǒng)自身能夠與虛擬進程進行很好的協作.
圖3. 半虛擬化: 通過客戶操作系統(tǒng)分享進程
上面提到過, 半虛擬化需要客戶操作系統(tǒng)做一些修改(配合Hypervisor), 這是一個不足之處. 但是半虛擬化提供了與原始系統(tǒng)相近的性能. 與全虛擬化一樣, 半虛擬化可以同時能支持多個不同的操作系統(tǒng).
操作系統(tǒng)級的虛擬化
最后一個我們需要了解的虛擬化技術是操作系統(tǒng)級的虛擬化(Operating system-level virtualization), 它使用不同于上面的虛擬化方法. 該技術在操作系統(tǒng)之上虛擬多個服務器, 支持在單個操作系統(tǒng)上簡單隔離每一個虛擬服務器(見圖4).
圖4. 操作系統(tǒng)級的虛擬化: 隔離單個服務器
操作系統(tǒng)級的虛擬化需要修改操作系統(tǒng)內核, 它的優(yōu)點是具有原始主機的性能.
為什么虛擬技術如此重要?
在了解當今主流的linux虛擬化技術之前, 我們先來看虛擬化技術的優(yōu)點.
從商業(yè)角度來看, 使用虛擬化技術有非常多的原因. 不過大多是用于服務器加固. 簡單來說, 如果你能夠在單個服務上虛擬多個系統(tǒng), 這樣少數的幾臺計算機顯然能夠節(jié)省耗電, 空間, 冷卻和管理開支. 考慮到確定服務器利用狀況的困難, 虛擬化技術支持動態(tài)遷移(Live Migration). 動態(tài)遷移允許操作系統(tǒng)能夠遷移到另一臺全新的服務器上, 從而減少當前主機的負載.
虛擬化技術對開發(fā)人員來說也非常重要. Linux內核占用了一個單一的地址空間, 這意味內核或任何驅動程序錯誤都能導致整個操作系統(tǒng)停止工作. 而通過虛擬化你可以運行多個操作系統(tǒng), 如果其中一個系統(tǒng)由于錯誤而宕機, Hypervisor和其它的操作系統(tǒng)不會受到任何影響. 這對調試內核來說就如同調試用戶空間程序一樣.
Linux相關的虛擬化項目
表1顯示了幾個可能加入到Linux(內核)的虛擬化技術, 主要關注于開源.
表1. Linux相關的虛擬化項目
CODE:
項目 / 類型 / 許可證
Bochs 模擬器 LGPL
QEMU 模擬器 LGPL/GPL
VMware 全虛擬化 閉源
z/VM 全虛擬化 閉源
Xen 半虛擬化 GPL
UML 半虛擬化 GPL
Linux-VServer 操作系統(tǒng)級虛擬化 GPL
OpenVZ 操作系統(tǒng)級虛擬化 GPL
更多其它的虛擬化技術, 請查閱參考資料欄目.
Bochs(模擬器)
Bochs是一個仿真x86 CPU的計算機模擬器, 它具有可移植性和可運行在多種平臺上, 如x86, PowerPC, Alpha, SPARC和MIPS. Bochs的優(yōu)點是不僅能模擬處理器, 而且能模擬整臺計算機, 包括外設如鍵盤, 鼠標, 視屏圖像硬件, 網卡等.
Bochs能被配置成一臺老的Intel 386計算機, 或更新的處理器如486, Pentium, Pentium Pro, 或64位處理器. 甚至能模擬圖形指令如MMX和3DNow.
你也能夠通過Bochs模擬器在Linux系統(tǒng)上運行任何Linux發(fā)行版, 還有Microsoft? Windows? 95/98/NT/2000(和多種應用程序), 甚至是BSD操作系統(tǒng)(FreeBSD, OpenBSD,等).
庫級的虛擬化
這里沒有討論另一個虛擬化技術, 它通過庫來模擬操作系統(tǒng)的一部分. 比如Wine(一部分為linux開發(fā)的win32 API)和LxRun(一部分為Solaris開發(fā)的Linux API).
QEMU(模擬器)
QEMU是另一個類似于Bochs的模擬器, 它有一些值得注意的地方. QEMU支持2個操作模式. 一個是全系統(tǒng)模擬模式. 該模式類似Bochs模擬整個計算機系統(tǒng)(包括處理器和外設). 而且能在合理的速度下使用動態(tài)翻譯模擬一些處理器架構如X86, X86_64, ARM, SPARC, PowerPC和MIPS. 你還可以在Linux, Solaris和FreeBSD系統(tǒng)上模擬Windows系統(tǒng)(包括XP)和Linux系統(tǒng). QEMU支持其它的操作系統(tǒng)組合(更多信息見參考資料欄目).
QEMU的第二個模式: 用戶模式模擬. 該模式能寄存在Linux上, 不同平臺的二進制程序也能運行. 比如, 一個MIPS平臺上的二進制程序能夠運行在x86平臺上的Linux系統(tǒng). 其它支持的平臺包括ARM, SPARC和PowerPC, 而且還有更多正在開發(fā)的平臺.
VMware(全虛擬化)
VMware是一個商業(yè)級的全虛擬化技術. Hypervisor是客戶操作系統(tǒng)和硬件之間的抽象層. 該抽象層允許任何其它客戶操作系統(tǒng)運行在主機操作系統(tǒng)之上.
VMware也能虛擬I/O硬件, 增加了高性能設備驅動到Hypervisor中.
整個虛擬(機)環(huán)境實際上是一個單獨的文件, 這意味整個系統(tǒng)(包括客戶操作系統(tǒng), 虛擬機和虛擬硬件)可以簡單快速地整合到一個新的主機, 從而實現負載均衡.
z/VM(全虛擬化)
當IBM System z?是一個全新名稱的時候, 事實上可以追述到1960年. System/360在1965年使用虛擬機方法實現了虛擬技術. 令人感興趣的是System z能夠與最老的System/360系列主機兼容.
z/VM?是System z操作系統(tǒng)的Hypervisor. 核心程序是控制程序(CP), 向客戶機操作系統(tǒng)提供硬件資源虛擬, 包括Linux(見圖5). 允許在多個客戶操作系統(tǒng)上虛擬多個處理器和其它資源.
圖5. 使用z/VM的操作系統(tǒng)級虛擬化技術
z/VM可以為那些需要相互通訊的客戶操作系統(tǒng)虛擬一個客戶局域網(LAN). 整個客戶局域網位于Hypervisor中, 所以很安全.
Xen(半虛擬化)
Xen由XenSource開發(fā), 一個開源免費的操作系統(tǒng)級準虛擬技術. 回顧一下半虛擬技術, Hypervisor和操作系統(tǒng)共同協作, 雖然操作系統(tǒng)需要做一些修改, 但是性能上比較接近于原始性能.
Xen需要與系統(tǒng)共同協作(客戶操作系統(tǒng)需要修改), 只有打過補丁的系統(tǒng)才能使用Xen. 從Linux角度來看, Linux本身是開源的, 結果是Xen的性能要好于全虛擬化技術. 但是從系統(tǒng)支持(比如支持其它非開源的操作系統(tǒng))的角度來看, 這顯然是一個不足之處.
在Xen上可以運行Windows客戶機, 但需要Intel Vanderpool或AMD Pacifica處理器的支持. 其它支持的操作系統(tǒng)包括Minix, Plan 9, NetBSD, FreeBSD, 和OpenSolaris.
用戶模式Linux(半虛擬化)
用戶模式Linux(UML, User-Mode Linux)支持在linux系統(tǒng)的用戶空間運行其它Linux操作系統(tǒng). 每一個客戶操作系統(tǒng)是主機Linux系統(tǒng)上的一個標準的進程(見圖6). UML允許多個Linux內核(有自己的用戶空間)運行在單個Linux內核之中.
圖6. 用戶模式Linux: Linux寄存
在Linux 2.6內核中, UML存在于主內核樹中, 但是必須打開和重新編譯才能使用UML. 一些修改包括, 設備虛擬, 允許客戶操作系統(tǒng)分享存在的物理設備, 比如塊設備(磁盤, CD-ROM, 和文件系統(tǒng)), 控制臺, 網卡, 聲卡等.
注: 客戶操作系統(tǒng)內核運行在用戶空間模式, 內核必須專門編譯才能在客戶系統(tǒng)中使用(可與主機操作系統(tǒng)內核版本不同). 整個主機存在兩套內核, 一個是主機內核(直接位于物理硬件之上), 另一個是客戶內核(運行在主機內核的用戶空間之中). 這些內核甚至可以相互嵌套, 允許客戶機內核運行在另外一個客戶機內核之中.
Linux-VServer(操作系統(tǒng)級虛擬化)
Linux-VServer是操作系統(tǒng)級的虛擬化解決方案. Linux-VServer虛擬Linux內核, 可以有多個用戶空間環(huán)境, 也稱做虛擬專用服務器(VPS), 各個VPS各自獨立運行. Linux-VServer是通過修改Linux內核來隔離用戶空間.
為了隔離每個單獨的用戶空間, 我們先了解上下文環(huán)境. 上下文是一個VPS進程的容器, 因此我們可以使用ps等工具來了解vps進程的狀況. 系統(tǒng)首次初始化后, 內核定義了一個缺省的上下文, 管理端能夠查看所有的上下文(所有正在執(zhí)行的進程). 你會猜到, 內核和內部數據結構需做一些修改來支持虛擬化.
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(操作系統(tǒng)級虛擬化)
OpenVZ是一個類似于Linux-VServer的操作系級級虛擬化解決方案. 它有一些自己獨特的地方. OpenVZ是一個內嵌虛擬化的內核(修改過的), 它支持用戶空間隔離, 虛擬專用主機(VPS)和一套用戶管理工具. 比如, 你可以通過下面命令簡單創(chuàng)建一個新的VPS:
列表1. 從命令行創(chuàng)建一個VPS
$ vzctl create 42 --ostemplate fedora-core-4
Creating VPS private area 正在創(chuàng)建VPS專用區(qū)域
VPS private area was created VPS專用區(qū)域成功創(chuàng)建
$ vzctl start 42
Starting VPS ... 啟動VPS
VPS is mounted 加載VPS分區(qū)
你也可以使用vzlist命令列出所有已創(chuàng)建的VPS, 這有點類似于標準的Linux命令ps(查看進程的狀態(tài)).
OpenVZ包含一個兩級的CPU調度器來調度進程. 首先, 調度器確定需要使用CPU的VPS. 然后第二級調度器根據進程的優(yōu)先級來執(zhí)行vps進程.
OpenVZ支持beancounters. 一個beancounters包含了定義vps資源屬性的許多參數. 這為vps提供了控制, 定義多少可有內存, 多少可用IPC資源, 等.
OpenVZ獨特的地方是能夠設置檢查點和vps遷移(從一臺服務器遷移到另一臺服務器). 檢查點能夠停止正在運行vps并保存當前狀態(tài)到一個文件. 該文件在遷移過程中可用于在新服務器上恢復運行VPS.
OpenVZ支持許多硬件結構, 包括x86, x86-64, 和PowerPC.
全虛擬化和半虛擬化的硬件支持
回顧一下IA-32(x86)體系結構上存在的一些問題. 某個特權指令不能夠引起陷阱, 可基于模式返回不同結果. 比如, x86的STR指令可以獲取安全狀態(tài), 但返回值是基于特別請求者的權限級別. 當試圖在不同級別虛擬不同操作系統(tǒng)的時候是一個問題. 比如, x86支持4環(huán)保護, 0級(最高權限)通常運行操作系統(tǒng), 1和2級支持操作系統(tǒng)服務, 3級(最低級別)支持應用程序. 不過硬件廠商已經認識到這些問題(和其它的問題), 而且開發(fā)了新的設計來支持和加速虛擬化技術.
Intel正在開發(fā)新的虛擬技術, 能在x86(VT-x)和Itanium(VT-i)結構上支持Hypervisors. VT-x支持兩個新的操作. 一個是VMM(root), 另一個是客戶操作系統(tǒng)(非root). root方式具有最高權限, 而非root方式是非特權的(甚至ring 0). 結構方面也支持自定義指令(使用vmm)終止VM(客戶操作系統(tǒng))和保存處理器狀態(tài). 其它功能請查閱參考資源欄目.
AMD也正在開發(fā)硬件級的虛擬化技術, 代號為Pacifica. Pacifica維護了一個客戶操作系統(tǒng)的控制塊(通過特殊指令保存執(zhí)行狀態(tài)). VMRUN指令允許虛擬機(和它相聯系的客戶操作系統(tǒng))運行直到VMM重新獲得控制權(可自定義). 可配置性允許VMM為每一個客戶機自定義權限. Pacifica也能使用主機和客戶機內存管理單元(MMU)表來提高地址翻譯.
這些硬件虛擬化技術能夠應用到許多的虛擬化技術當中, 包括Xen, VMware, User-mode Linux, 和其它的.
Linux KVM(內核虛擬機)
最近的Linux新聞經常報道Linux 2.6.20內核增加了KVM虛擬化技術. KVM是全虛擬化的解決方案, 它的特點是系統(tǒng)內核通過添加內核模塊使內核自身成為一個Hypervisor(虛擬機管理程序). 內核中的KVM模塊通過/dev/kvm字符串設備顯示被虛擬的硬件. KVM使用修改過的QEMU進程做為客戶操作系統(tǒng)接口.
圖7. KVM的虛擬化
KVM模塊向內核增加了一個新的執(zhí)行模式: 客戶模式. 官方原始內核(vanilla kernel)支持內核和用戶模式. 客戶模式用于執(zhí)行所有非I/O客戶代碼, 普通用戶模式支持客戶I/O.
增加KVM到Linux內核是Linux發(fā)展的一個重要里程碑, 這也是第一個整合到Linux主線內核的虛擬化技術. KVM將包含于2.6.20內核數中, 現在你也可以通過內核模塊方式在2.6.19內核使用kvm. 當運行在支持的硬件(需Intel VT和AMD SVM處理器)上, kvm支持Linux(32和64為)和Windows(32為)客戶機. 更多KVM信息, 請查閱參考資源欄目
總結
虛擬化技術是一個新的而且重要的領域, 如果"新"包括了過去的40年. 在過去它已經使用于許多場合, 但是現在最主要的一個焦點是服務器和操作系統(tǒng)的虛擬化. 比如像Linux, 虛擬化給性能, 可移植性和復雜性提供了許多選項. 這也意味者你能夠為你的應用程序和項目選擇最合適的虛擬化方法.
騰佑科技(m.mubashirfilms.com)成立于2009年,總部位于河南鄭州,是一家集互聯網基礎設施及軟硬件于一體化的高新技術企業(yè),具有IDC/ISP/ICP/云牌照、雙軟等資質,并擁有多個國家版權局認證。公司自成立以來,一直致力于發(fā)展互聯網IDC數據中心DataCenter、云計算Cloud、大數據BigDate、人工智能AI、內容加速CDN、互聯網安全、軟件定制開發(fā)等產品服務及行業(yè)客戶技術一體化智能解決方案;2018年成為百度智能云AI河南服務中心。
售前咨詢熱線:400-996-8756
備案提交:0371-89913068
售后客服:0371-89913000
搜索詞
熱門產品推薦