Linux Virtualiztiondocker
首先計算機虛擬化技術是多種技術的綜合實現,它包括硬件平臺、操做系統、存儲及網絡等。
簡單來講,虛擬化技術就是在單臺主機上虛擬多個虛假主機,並能夠在這些虛擬機上運行不一樣的操做系統平臺。虛擬化技術的出現能夠節約大量的硬件資源與能源資源消耗,下降資金成本,虛擬化如今已是每一個企業必有的項目。目前所提供的比較成熟的虛擬化解決方案主要有VMware、Xen、KVM和Kyper-V等。虛擬化技術是經過Hypervsion動態模擬於分配計算機硬件資源給虛擬機操做系統Guest OS,因爲Hypervsion能夠模擬多個硬件資源給多個Guest OS,因此對於Guest OS來講,它們就像是運行在獨立、真實的硬件資源上同樣。後端
虛擬化技術的類型有主機虛擬化,容器虛擬化,系統庫虛擬化和應用程序級虛擬化;
主機虛擬化類型分爲Type-I和Type-II兩種,Type-I物理硬件上直接運行的不是操做系統而是一個專門的虛擬化管理器(VMM,Hypervisor),在此基礎上全部操做系統都是運行於虛擬機實例之中;Type-II是於硬件級別上運行一個OS,一般稱爲「HOST OS」,就是宿主機的操做系統;然後在這個宿主機操做系統上安裝並運行一個虛擬化管理器(VMM,Hypervisor),在VMM上再建立並安裝虛擬機和對應的OS,一般稱爲「Guest OS」,即虛擬機操做系統; 主機虛擬化所用到的主要技術有CPU虛擬化、內存虛擬化、和IO虛擬化。服務器
按照虛擬化程度可分爲全虛擬化、半虛擬化、硬件輔助虛擬化。
CPU全虛擬化技術主要採用優先級壓縮技術(Ring Compression)和 二進制代碼翻譯技術(Binary Translation)。優先級壓縮技術讓VMM和Guest 運行在不一樣的特權級下
CPU半虛擬化技術主要採用Hypercall 技術。Guest OS 的部分代碼被改變,從而使Guest OS會將和特權指令相關的操做都轉換爲發給VMM的Hypercall(超級調用),由VMM繼續進行處理。而Hypercall支持的批處理和異步這兩種優化方式,使得經過Hypercall 能獲得近似於物理機的速度
CPU硬件輔助虛擬化技術
目前主要有Intel 的VT-x和AMD的AMD-V這兩種技術。其核心思想都是經過引入新的指令和運行模式,使VMM和Guest OS分別運行在不一樣模式(ROOT 模式和非ROOT模式)下,且Guest OS 運行在Ring 0 下。一般狀況下,Guest OS 的核心指令能夠直接下達到計算機系統硬件執行,而不須要通過VMM。當Guest OS執行到特殊指令的時候,系統會切換到VMM,讓VMM來處理特殊指令。CPU的虛擬化技術能夠單CPU模擬多CPU並行,容許一個平臺同時運行多個操做系統,而且應用程序均可以在相互獨立的空間內運行而互不影響,從而顯著提升計算機的工做效率。網絡
內存虛擬化,KVM 經過內存虛擬化共享物理系統內存,動態分配給虛擬機,爲了在一臺機器上運行多個虛擬機,KVM 須要實現 VA(虛擬內存) -> PA(物理內存) -> MA(機器內存)直接的地址轉換。虛機 OS 控制虛擬地址到客戶內存物理地址的映射 (VA -> PA),可是虛機 OS 不能直接訪問實際機器內存,所以 KVM 須要負責映射客戶物理內存到實際機器內存 (PA -> MA)。
內存全虛擬化技術經過使用影子頁表(Shadow Page Table)實現虛擬化。VMM 爲每一個Guest 都維護一個影子頁表,影子頁表維護虛擬地址(VA)到機器地址(MA)的映射關係。而Guest頁表維護VA到客戶機物理地址(GPA)的映射關係。當VMM捕獲到Guest 頁表的修改後,VMM 會查找負責GPA 到MA 映射的P2M 頁表或者哈希函數,找到與該GPA對應的MA,再將MA填充到真正在硬件上起做用的影子頁表,從而造成 VA 到 MA 的映射關係。而 Guest 的頁表則無需變更。
內存半虛擬化技術經過使用頁表寫入法實現虛擬化。Guest OS 在建立一個新的頁表時,會向VMM註冊該頁表。以後在 Guest 運行的時候,VMM 將不斷的管理和維護這個表,使Guest 上面的程序能直接訪問到合適的地址。
內存硬件輔助虛擬化技術經過擴展頁表EPT(extended page table)實現虛擬化。
EPT經過使用硬件虛擬化技術,使其能在原有的頁表的基礎上,增長一個EPT頁表,用於記錄GPA到MA的映射關係。VMM預先把EPT頁表設置到CPU中。Guest 修改Guest 頁表,無需VMM干預。地址轉換時,CPU 自動查找兩張頁表完成 Guest 虛擬地址到機器地址的轉換,從而下降整個內存虛擬化所需的開銷。架構
IO虛擬化:服務器單個千兆以太網端口確定可以支持單個應用,可是當被分割爲10個、15個或者更多的服務器負載時(這其中包括網絡、存儲以及服務器之間的流量)可能就不夠用了。當遇到I/O瓶頸時,CPU會空閒下來等待數據,計算效率會大大下降--I/O瓶頸最終會戰勝虛擬化所帶來的資源使用效率的提高。故虛擬化也必須擴展至I/O系統,在工做負載、存儲以及服務器之間動態共享帶寬,可以最大化地利用網絡接口。經過緩解服務器I/O潛在的性能瓶頸,服務器可以承載更多的工做負載並提高其性能。
常見的IO虛擬化主要有三種方案:基於軟件模擬的方案,這種方案裏, 中斷、DMA的訪問都是經過軟件實現的,優勢是能夠模擬任何硬件的模型,缺點是性能不會太好;半虛擬化技術,主要是爲了解決軟件模擬性能問題,好比串口對性能要求不高能夠採用軟件模擬,可是磁盤設備、網卡設備對性能要求高,主流方案是採用半虛擬化技術,先後端相互感知,經過Shared Memory控制請求的傳輸,兩個設備之間的通知也是基於快速消息傳遞,性能很高;設備直通模式,好比PCIE的直通、網卡SROV直通,對性能更高的能夠採用此模式,能夠達到和物理機上直接使用接近的性能,可是設備和虛擬機的耦合會對管理形成影響異步
Linux目前流行的開源虛擬化技術解決方案:主機虛擬化:Type-I:Xen;Type-II:kvm,virtualbox。容器級虛擬化:lxc(Linux Container),docker,libcontainer,openvz(VMS)等等 Xen(半虛擬化)
Xen由XenSource開發, 一個開源免費的操做系統級準虛擬技術. 回顧一下半虛擬技術, Hypervisor和操做系統共同協做, 雖然操做系統須要作一些修改, 可是性能上比較接近於原始性能.
Xen須要與系統共同協做(客戶操做系統須要修改), 只有打過補丁的系統才能使用Xen. 從Linux角度來看, Linux自己是開源的, 結果是Xen的性能要好於全虛擬化技術. 可是從系統支持(好比支持其它非開源的操做系統)的角度來看, 這顯然是一個不足之處.
在Xen上能夠運行Windows客戶機, 但須要Intel Vanderpool或AMD Pacifica處理器的支持. 其它支持的操做系統包括Minix, Plan 9, NetBSD, FreeBSD, 和OpenSolaris.ide
KVM虛擬化技術
KVM是基於x86架構上Linux操做系統的全虛擬化解決方案,kvm就工做在內核環境之中,因此它的執行效率很高,它須要Intel VT-x和AMD AMD-v的技術支持。
KVM的組件:
兩類組件:
/dev/kvm:工做爲Hypervisor,在用戶空間中能夠經過ioctl()系統調用與內核中的kvm模塊進行交互,從而完成虛擬機的建立、刪除、啓動、中止等各類管理功能;
qemu-kvm進程:工做於用戶空間,用於實現IO設備的模擬,也是kvm進行各類IO訪問的加速器;
kvm模塊被裝載至內核,系統的運行模式:
Hypervisor模式:裝載了kvm模塊的原操做系統內核,將運行爲Hypervisor模式;
用戶模式:Host OS的原用戶模式,用於代Guest OS發送IO請求;
內核模式:Guest OS執行IO類的操做或其餘特殊指令操做時的工做模式;也被稱爲"Guest-Kernel"模式;
來賓模式:Guest OS的用戶模式,用於全部的非IO類請求;函數