虛擬化說白了就是原本是一個完整的資源,切分或者說虛擬成多份,讓這多份資源都使用起來,物盡其用,減小了浪費,提升了利用率,省了錢。vue
虛擬化技術最先出如今 20 世紀 60 年代的 IBM 大型機系統,在70年代的 System 370 系列中逐漸流行起來.java
在物理硬件之上安裝軟件:虛擬機監控器(Virtual Machine Monitor,VMM),而且用VMM來控制產生多個的虛擬機(Virtual Machine)實例,每一個vm均可以運行獨立操做系統及應用軟件。 python
虛擬化是一個廣義的術語,對於不一樣的人來講可能意味着不一樣的東西,這要取決他們所處的環境。在計算機科學領域中,虛擬化表明着對計算資源的抽象,而不只僅侷限於虛擬機的概念。程序員
好比對物理內存的抽象:產生了虛擬內存技術,使得應用程序認爲其自身擁有連續可用的地址空間(Address Space),而實際上,應用程序的代碼和數據多是被分隔成多個碎片頁或段),甚至被交換到磁盤、閃存等外部存儲器上,即便物理內存不足,應用程序也能順利執行。數據庫
隨着近年多核系統、集羣、網格甚至雲計算的普遍部署,虛擬化技術在商業應用上的優點日益體現,不只下降了 IT 成本,並且還加強了系統安全性和可靠性,虛擬化的概念也逐漸深刻到人們平常的工做與生活中。安全
網格(Grid),在信息學中,網格是一種用於集成或共享地理上分佈的各類資源(包括計算機系統、存儲系統、通訊系統、文件、數據庫、程序等),使之成爲有機的總體,共同完成各類所需任務的機制。服務器
虛擬化是雲計算的基礎,而咱們學習虛擬化的目的之一是爲雲平臺提供雲主機,具體的:在一臺物理機上產生多臺虛擬機(每臺vm按照有不一樣的操做系統),它們共享物理機的cpu,內存,IO硬件資源,可是邏輯上彼此隔離。網絡
在這裏討論的虛擬化技術只針對 x86 平臺(含 AMD 64),並假定虛擬機中運行的 Guest OS 也是爲 x86 平臺設計的。 jvm
一般所說的虛擬化主要是指平臺虛擬化技術,經過使用控制程序(Virtual Machine Monitor 或Hypervisor),來建立虛擬機vm。性能
這些分類的關鍵在於必定要記住:vm(虛擬機)是由vmm(虛擬機監視器)產生並運行的。
全虛擬化的核心就在全,‘全’指的是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。
硬件輔助虛擬化主要是爲了解決全虛擬化在提供接口的同時必須模擬特權指令的執行過程,是指藉助硬件(主要是主機處理器)的支持來實現高效的全虛擬化。例若有了 Intel-VT 技術的支持,Guest OS 和 VMM 的執行環境自動地徹底隔離開來,Guest OS 有本身的「全套寄存器」,能夠直接運行在最高級別。所以在上面的例子中,Guest OS 可以執行修改頁表的彙編指令。Intel-VT 和 AMD-V 是目前 x86 體系結構上可用的兩種硬件輔助虛擬化技術。
這是一種修改 Guest OS 部分訪問特權狀態的代碼以便直接與 VMM 交互的技術。在半虛擬化虛擬機中,部分硬件接口以軟件的形式提供給客戶機操做系統,這能夠經過 Hypercall(VMM 提供給 Guest OS 的直接調用,與系統調用相似)的方式來提供。例如,Guest OS 把切換頁表的代碼修改成調用 Hypercall 來直接完成修改影子 CR3 寄存器和翻譯地址的工做。因爲不須要產生額外的異常和模擬部分硬件執行流程,半虛擬化能夠大幅度提升性能,比較著名的 VMM 有 Denali、Xen。
VMM 只模擬部分底層硬件,所以客戶機操做系統不作修改是沒法在虛擬機中運行的,其它程序可能也須要進行修改。在歷史上,部分虛擬化是通往全虛擬化道路上的重要里程碑,最先出如今第一代的分時系統 CTSS 和 IBM M44/44X 實驗性的分頁系統中。
在傳統操做系統中,全部用戶的進程本質上是在同一個操做系統的實例中運行,所以內核或應用程序的缺陷可能影響到其它進程。操做系統級虛擬化是一種在服務器操做系統中使用的輕量級的虛擬化技術,內核經過建立多個虛擬的操做系統實例(內核和庫)來隔離不一樣的進程,不一樣實例中的進程徹底不瞭解對方的存在。比較著名的有 Solaris Container,FreeBSD Jail 和 OpenVZ 等。
這種分類並非絕對的,一個優秀的虛擬化軟件每每融合了多項技術。例如 VMware Workstation 是一個著名的全虛擬化的 VMM,可是它使用了一種被稱爲動態二進制翻譯的技術把對特權狀態的訪問轉換成對影子狀態的操做,從而避免了低效的 Trap-And-Emulate 的處理方式,這與半虛擬化類似,只不過半虛擬化是靜態地修改程序代碼。對於這種超虛擬化而言,若是能利用硬件特性,那麼虛擬機的管理將會大大簡化,同時還能保持較高的性能。
MMU是Memory Management Unit的縮寫,中文名是內存管理單元,它是中央處理器(CPU)中用來管理虛擬存儲器、物理存儲器的控制線路,同時也負責虛擬地址映射爲物理地址,以及提供硬件機制的內存訪問受權,多用戶多進程操做系統。
許多年之前,當人們還在使用DOS或是更古老的操做系統的時候,計算機的內存還很是小,通常都是以K爲單位進行計算,相應的,當時的程序規模也不大,因此內存容量雖然小,但仍是能夠容納當時的程序。但隨着圖形界面的興起還有用戶需求的不斷增大,應用程序的規模也隨之膨脹起來,終於一個難題出如今程序員的面前,那就是應用程序太大以致於內存容納不下該程序,一般解決的辦法是把程序分割成許多稱爲覆蓋塊(overlay)的片斷。覆蓋塊0首先運行,結束時他將調用另外一個覆蓋塊。雖然覆蓋塊的交換是由OS完成的,可是必須先由程序員把程序先進行分割,這是一個費時費力的工做,並且至關枯燥。人們必須找到更好的辦法從根本上解決這個問題。不久人們找到了一個辦法,這就是虛擬存儲器(virtual memory).虛擬存儲器的基本思想是程序,數據,堆棧的總的大小能夠超過物理存儲器的大小,操做系統把當前使用的部分保留在內存中,而把其餘未被使用的部分保存在磁盤上。好比對一個16MB的程序和一個內存只有4MB的機器,操做系統經過選擇,能夠決定各個時刻將哪4M的內容保留在內存中,並在須要時在內存和磁盤間交換程序片斷,這樣就能夠把這個16M的程序運行在一個只具備4M內存機器上了。而這個16M的程序在運行前沒必要由程序員進行分割。
將線性地址映射爲物理地址 現代的多用戶多進程操做系統,須要MMU,才能達到每一個用戶進程都擁有本身獨立的地址空間的目標。使用MMU,操做系統劃分出一段地址區域,在這塊地址區域中,每一個進程看到的內容都不必定同樣。例如MICROSOFT WINDOWS操做系統將地址範圍4M-2G劃分爲用戶地址空間,進程A在地址0X400000(4M)映射了可執行文件,進程B一樣在地址0X400000(4M)映射了可執行文件,若是A進程讀地址0X400000,讀到的是A的可執行文件映射到RAM的內容,而進程B讀取地址0X400000時,則讀到的是B的可執行文件映射到RAM的內容。
上圖中的左半部分是正常狀況下內存的使用狀況,線性地址到物理地址的一個轉換,一般應用程序使用的內存地址是線性地址,須要經過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中的物理地址的兩次轉換。
咱們將要着重研究的kvm虛擬化就引用了這種技術
仿真(emulation)是一個徹底經過軟件程序來模擬硬件的技術。早期虛擬化都才採用這種方案來虛擬網絡設備。常見仿真軟件有QEMU、VMware WorkStation、VirtualBox。Emulation網
Para-virtualization又稱半虛擬化,最先由Citrix的Xen提出使用。在半虛擬化模型中,物理硬件資源統一由 Hypervisor管理,由Hypervisor提供資源調用接口。虛擬子機經過特定的調用接口與Hypervisor通訊,而後完整的對I/O資源進行控制操做.
Hypervisor將一個PCI設備(能夠是網卡、USB、光驅)直接分配給指定虛擬子機單獨訪問。爲了安全和穩定性考慮,pass-through使用一般結合intel VT-D(AMD也有相似技術)來使用,經過iommu保證虛擬子機之間內存訪問不衝突。這種技術在VMware上叫VMDirectPath I/O,其餘方案中沒有找到相關專門名詞。
網絡虛擬化見neutron模塊。