一、什么是虛擬化(Virtualization)
虛擬化說白了就是本來是一個完整的資源,切分或者說虛擬成多份,讓這多份資源都使用起來,物盡其用,減少了浪費,提高了利用率,省了錢。
虛擬化技術最早出現在 20 世紀 60 年代的 IBM 大型機系統,在70年代的 System 370 系列中逐漸流行起來.
在物理硬件之上安裝軟件:虛擬機監控器(Virtual Machine Monitor,VMM),並且用VMM來控制產生多個的虛擬機(Virtual Machine)實例,每個vm都可以運行獨立操作系統及應用軟件。
虛擬化是一個廣義的術語,對於不同的人來說可能意味着不同的東西,這要取決他們所處的環境。在計算機科學領域中,虛擬化代表着對計算資源的抽象,而不僅僅局限於虛擬機的概念。
比如對物理內存的抽象:產生了虛擬內存技術,使得應用程序認為其自身擁有連續可用的地址空間(Address Space),而實際上,應用程序的代碼和數據可能是被分隔成多個碎片頁或段),甚至被交換到磁盤、閃存等外部存儲器上,即使物理內存不足,應用程序也能順利執行。
二、為何要學習虛擬化
隨着近年多核系統、集群、網格甚至雲計算的廣泛部署,虛擬化技術在商業應用上的優勢日益體現,不僅降低了 IT 成本,而且還增強了系統安全性和可靠性,虛擬化的概念也逐漸深入到人們日常的工作與生活中。
網格(Grid),在信息學中,網格是一種用於集成或共享地理上分布的各種資源(包括計算機系統、存儲系統、通信系統、文件、數據庫、程序等),使之成為有機的整體,共同完成各種所需任務的機制。
虛擬化是雲計算的基礎,而我們學習虛擬化的目的之一是為雲平台提供雲主機,具體的:在一台物理機上產生多台虛擬機(每台vm按照有不同的操作系統),它們共享物理機的cpu,內存,IO硬件資源,但是邏輯上彼此隔離。
三、虛擬化技術的分類
在這里討論的虛擬化技術只針對 x86 平台(含 AMD 64),並假定虛擬機中運行的 Guest OS 也是為 x86 平台設計的。
1、虛擬化技術主要分以下幾個大類
- 平台虛擬化(Platform Virtualization),針對計算機和操作系統的虛擬化,即產生vm。
- 資源虛擬化(Resource Virtualization),針對特定的系統資源的虛擬化,比如內存虛擬化、存儲虛擬化、網絡資源虛擬化等。
- 應用程序虛擬化(Application Virtualization),包括仿真、模擬、解釋技術(java虛擬機jvm)等。
通常所說的虛擬化主要是指平台虛擬化技術,通過使用控制程序(Virtual Machine Monitor 或Hypervisor),來創建虛擬機vm。
- Guest OS(客戶機操作系統):虛擬機中運行的操作系統
- Host OS(主機操作系統):運行虛擬機監控器VMM的操作系統,需要注意的是:某些虛擬機監控器VMM可以脫離操作系統直接運行在硬件之上(如 VMWARE 的 ESX 產品)

三、平台虛擬化技術分類
這些分類的關鍵在於一定要記住:vm(虛擬機)是由vmm(虛擬機監視器)產生並運行的。
1、全虛擬化(Full Virtualization)
全虛擬化的核心就在全,‘全’指的是VMM為虛擬機模擬了完整的底層硬件,包括處理器、物理內存、時鍾、外設等。
優點:原本是為物理硬件設計的操作系統或其它系統軟件,完全不做任何修改就可以在虛擬機中運行。
缺點:(1)然而飛的再高最后也得落地,vm最后還是要與vmm打交道,對於全虛擬化來說, VMM 必須完全並且完整地把自己模擬成硬件,為vm提供全部硬件調用接口,
(2)必須模擬特權指令的執行過程,如下例所示
讓我們以x86 體系結構下對操作系統進程頁表切換的操作(mov pgtable)為例,來介紹VMM把自己完全模擬成硬件是怎么樣一種過程:
1.真實的硬件提供了一個特權 CR3 寄存器來實現該接口,操作系統只需執行 "mov pgtable,%%cr3"的 匯編指令即可。
2.VMM 必須按照1中所述,完全地模擬該接口執行的全部過程,但是如果硬件不提供虛擬化的特殊支持,那么這個模擬過程將會十分復雜:
a:一般而言VMM 必須運行在最高優先級來完全控制物理主機的系統,而 Guest OS 需要降級運行,因而不能執行特權操作(如進程頁表切換mov pgtable這種特權操作)。
b:當 Guest OS 執行前面的特權匯編指令(mov pgtable...)時,物理主機系統產生異常(General Protection Exception),執行控制權重新從 Guest OS 轉到 VMM 手中。--->飛的再高也得回到地面
c:VMM 先分配一個變量作為影子 CR3 寄存器交給 Guest OS。將 pgtable (進程表)代表的客戶機物理地址(Guest Physical Address)填入影子 CR3 寄存器--->讓Guest OS以為自己在操作真實的內存。
e:然后 VMM 將Guest Os需要操作的pgtable 翻譯成物理主機的物理地址(Host Physical Address)並填入物理主機的 CR3 寄存器,最后返回到 Guest OS中。隨后 VMM 還將處理復雜的 Guest OS 缺頁異常(Page Fault)。
該示例如下圖所示:

比較著名的全虛擬化 VMM 有 Microsoft Virtual PC、VMware Workstation、Sun Virtual Box、Parallels Desktop for Mac ,QEMU,KVM。
2、硬件輔助虛擬化(Hardware-Assisted Virtualization)
硬件輔助虛擬化主要是為了解決全虛擬化在提供接口的同時必須模擬特權指令的執行過程,是指借助硬件(主要是主機處理器)的支持來實現高效的全虛擬化。例如有了 Intel-VT 技術的支持,Guest OS 和 VMM 的執行環境自動地完全隔離開來,Guest OS 有自己的“全套寄存器”,可以直接運行在最高級別。因此在上面的例子中,Guest OS 能夠執行修改頁表的匯編指令。Intel-VT 和 AMD-V 是目前 x86 體系結構上可用的兩種硬件輔助虛擬化技術。

3、半虛擬化(Paravirtualization)
這是一種修改 Guest OS 部分訪問特權狀態的代碼以便直接與 VMM 交互的技術。在半虛擬化虛擬機中,部分硬件接口以軟件的形式提供給客戶機操作系統,這可以通過 Hypercall(VMM 提供給 Guest OS 的直接調用,與系統調用類似)的方式來提供。例如,Guest OS 把切換頁表的代碼修改為調用 Hypercall 來直接完成修改影子 CR3 寄存器和翻譯地址的工作。由於不需要產生額外的異常和模擬部分硬件執行流程,半虛擬化可以大幅度提高性能,比較著名的 VMM 有 Denali、Xen。

4、部分虛擬化(Partial Virtualization)
VMM 只模擬部分底層硬件,因此客戶機操作系統不做修改是無法在虛擬機中運行的,其它程序可能也需要進行修改。在歷史上,部分虛擬化是通往全虛擬化道路上的重要里程碑,最早出現在第一代的分時系統 CTSS 和 IBM M44/44X 實驗性的分頁系統中。
5、操作系統級虛擬化(Operating System Level Virtualization)
在傳統操作系統中,所有用戶的進程本質上是在同一個操作系統的實例中運行,因此內核或應用程序的缺陷可能影響到其它進程。操作系統級虛擬化是一種在服務器操作系統中使用的輕量級的虛擬化技術,內核通過創建多個虛擬的操作系統實例(內核和庫)來隔離不同的進程,不同實例中的進程完全不了解對方的存在。比較著名的有 Solaris Container,FreeBSD Jail 和 OpenVZ 等。
6、平台虛擬化總結
這種分類並不是絕對的,一個優秀的虛擬化軟件往往融合了多項技術。例如 VMware Workstation 是一個著名的全虛擬化的 VMM,但是它使用了一種被稱為動態二進制翻譯的技術把對特權狀態的訪問轉換成對影子狀態的操作,從而避免了低效的 Trap-And-Emulate 的處理方式,這與半虛擬化相似,只不過半虛擬化是靜態地修改程序代碼。對於這種超虛擬化而言,如果能利用硬件特性,那么虛擬機的管理將會大大簡化,同時還能保持較高的性能。
四、內存虛擬化
1、MMU(內存管理單元)
(1)概念:
MMU是Memory Management Unit的縮寫,中文名是內存管理單元,它是中央處理器(CPU)中用來管理虛擬存儲器、物理存儲器的控制線路,同時也負責虛擬地址映射為物理地址,以及提供硬件機制的內存訪問授權,多用戶多進程操作系統。
(2)歷史:
許多年以前,當人們還在使用DOS或是更古老的操作系統的時候,計算機的內存還非常小,一般都是以K為單位進行計算,相應的,當時的程序規模也不大,所以內存容量雖然小,但還是可以容納當時的程序。但隨着圖形界面的興起還有用戶需求的不斷增大,應用程序的規模也隨之膨脹起來,終於一個難題出現在程序員的面前,那就是應用程序太大以至於內存容納不下該程序,通常解決的辦法是把程序分割成許多稱為覆蓋塊(overlay)的片段。覆蓋塊0首先運行,結束時他將調用另一個覆蓋塊。雖然覆蓋塊的交換是由OS完成的,但是必須先由程序員把程序先進行分割,這是一個費時費力的工作,而且相當枯燥。人們必須找到更好的辦法從根本上解決這個問題。不久人們找到了一個辦法,這就是虛擬存儲器(virtual memory).虛擬存儲器的基本思想是程序,數據,堆棧的總的大小可以超過物理存儲器的大小,操作系統把當前使用的部分保留在內存中,而把其他未被使用的部分保存在磁盤上。比如對一個16MB的程序和一個內存只有4MB的機器,操作系統通過選擇,可以決定各個時刻將哪4M的內容保留在內存中,並在需要時在內存和磁盤間交換程序片段,這樣就可以把這個16M的程序運行在一個只具有4M內存機器上了。而這個16M的程序在運行前不必由程序員進行分割。
(3)MMU的功能是:
將線性地址映射為物理地址 現代的多用戶多進程操作系統,需要MMU,才能達到每個用戶進程都擁有自己獨立的地址空間的目標。使用MMU,操作系統划分出一段地址區域,在這塊地址區域中,每個進程看到的內容都不一定一樣。例如MICROSOFT WINDOWS操作系統將地址范圍4M-2G划分為用戶地址空間,進程A在地址0X400000(4M)映射了可執行文件,進程B同樣在地址0X400000(4M)映射了可執行文件,如果A進程讀地址0X400000,讀到的是A的可執行文件映射到RAM的內容,而進程B讀取地址0X400000時,則讀到的是B的可執行文件映射到RAM的內容。
2、 內存虛擬化圖解

上圖中的左半部分是正常情況下內存的使用情況,線性地址到物理地址的一個轉換,通常應用程序使用的內存地址是線性地址,需要通過MMU地址轉換的一個硬件來實現線性地址到物理地址的一個轉換。
上圖的右半部分是虛擬化情況下內存是如何實現線性地址到物理地址的轉換,虛擬機中的OS獲得是有Host OS分配的線性地址,Guest OS中的應用程序獲取的是相對於Guest os來說的線性地址,那么對於這個線性地址來說最終只能轉換成線性地址,無法轉換成正在的物理地址,虛擬化中就提供了一個虛擬的MMU直接將Guest OS中的線性地址直接轉換成真正的物理地址,但是這個虛擬的MMU畢竟是虛擬出來的沒有真實的硬件MMU性能好而且虛擬MMU的開發也很復雜,每一個Guest都要有一個MMU,這對內存消耗太大。對於這種技術我們稱作是影子頁表技術。
此后Intel開創了EPT(Extended Page Tables)技術,相對於影子頁表技術來說EPT技術降低了內存虛擬化的難度,EPT技術是直接在硬件上實現了Guest OS中的線性地址到Guest OS中的物理地址再到Host OS中的物理地址的兩次轉換。
五、IO虛擬化

1、最左邊IO虛擬化的使用的是仿真技術
我們將要着重研究的kvm虛擬化就引用了這種技術
仿真(emulation)是一個完全通過軟件程序來模擬硬件的技術。早期虛擬化都才采用這種方案來虛擬網絡設備。常見仿真軟件有QEMU、VMware WorkStation、VirtualBox。Emulation網
2、中間的IO虛擬化是Para-virtualization
Para-virtualization又稱半虛擬化,最早由Citrix的Xen提出使用。在半虛擬化模型中,物理硬件資源統一由 Hypervisor管理,由Hypervisor提供資源調用接口。虛擬子機通過特定的調用接口與Hypervisor通信,然后完整的對I/O資源進行控制操作.
3、最右邊的是直接IO
Hypervisor將一個PCI設備(可以是網卡、USB、光驅)直接分配給指定虛擬子機單獨訪問。為了安全和穩定性考慮,pass-through使用通常結合intel VT-D(AMD也有類似技術)來使用,通過iommu保證虛擬子機之間內存訪問不沖突。這種技術在VMware上叫VMDirectPath I/O,其他方案中沒有找到相關專門名詞。
六、網絡虛擬化
網絡虛擬化見neutron模塊。
