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和其它的操作系統不會受到任何影響. 這對調試內核來說就如同調試用戶空間程序一樣.
























