伺服器虛擬化技術要追述到IBM大型機的虛擬化 z/VM,在z系列大型機(非虛擬化作業系統是z/OS)上實現伺服器虛擬化。基於z/VM可以執行上百個虛擬機器。後來在Power上的KVM技術是PowerKVM;以及AIX虛擬化PowerVM,支援vSCSI和NPIV兩種技術(虛擬出系統叫VIOS)。今天的內容改寫了CPU虛擬化、記憶體虛擬化、Intel硬體輔助技術、IO虛擬化和GPU虛擬化等,技術深度科普文章;請老司機們讓車,忽略今天的內容。
很多讀者可能認為伺服器虛擬化技術遭到了容器技術的衝擊,可能已經過時了,事實上在很多場景下,虛擬化技術並非容器所能夠替代的。所以作為要踏入雲端計算領域的初學者們,還是有必要深入瞭解伺服器虛擬化。下麵我們看看虛擬化發展歷程和外在因素和推動力。
分割槽技術使得虛擬化層為多個虛擬機器劃分伺服器資源的能力;使您能夠在一臺伺服器上執行多個應用程式,每個作業系統只能看到虛擬化層為其提供的虛擬硬體。
虛擬機器隔離讓虛擬機器是互相隔離,一個虛擬機器的崩潰或故障(例如,作業系統故障、應用程式崩潰、驅動程式故障等等)不會影響同一伺服器上的其它虛擬機器。
封裝意味著將整個虛擬機器(硬體配置、BIOS 配置、記憶體狀態、磁碟狀態、CPU 狀態)儲存在獨立於物理硬體的一小組檔案中。這樣,您只需複製幾個檔案就可以隨時隨地根據需要複製、儲存和移動虛擬機器。
CPU虛擬化發展
伺服器虛擬化按照虛擬化程度可分為全虛擬化、半虛擬化、硬體輔助虛擬化。
CPU虛擬化的條件和技術難點,CPU本身有不同執行級別,這些級別對應不同許可權。虛擬機器執行到這些敏感指令的時候,很有可能出現錯誤,將會影響到整個機器的穩定,所以不允許VM直接執行。那就需要虛擬化平臺解決這個問題。
全虛擬化: VMM在軟體堆疊中的位置是傳統意義上作業系統所處的位置,而作業系統的位置是傳統意義上應用程式所處的位置。每個Guest OS對特殊指令訪問通訊需要進行二進位制轉換,以便提供到物理資源(如處理器、記憶體、儲存、顯示卡和網絡卡等)的介面,模擬硬體環境。
半虛擬化: Guest OS的部分程式碼被改變,從而使Guest OS會將和特權指令相關的操作都轉換為發給VMM的Hypercall(超級呼叫),由VMM繼續進行處理並傳回結果。
硬體輔助虛擬化: 引入新的指令和執行樣式,使VMM和Guest OS分別執行在不同樣式(ROOT樣式和非ROOT樣式)下,且Guest OS執行在Ring 0下執行。使得Guest OS的核心指令可以直接下達到計算機系統硬體執行,而不需要經過VMM。
虛擬化軟體架構分類
伺服器虛擬化是雲端計算非常關鍵的技術之一,虛擬化的含義很廣泛,包括伺服器、儲存、網路以及資料中心虛擬化。其宗旨就是將任何一種形式的資源抽象成另一種形式的技術都是虛擬化。今天我們討論一下伺服器虛擬化架構的分類。
寄居虛擬化: 虛擬化管理軟體作為底層作業系統(Windows或Linux等)上的一個普通應用程式,然後透過其建立相應的虛擬機器,共享底層伺服器資源。
裸金屬虛擬化: Hypervisor是指直接執行於物理硬體之上的虛擬機器監控程式。它主要實現兩個基本功能:首先是識別、捕獲和響應虛擬機器所發出的CPU特權指令或保護指令;其次,它負責處理虛擬機器佇列和排程,並將物理硬體的處理結果傳回給相應的虛擬機器。
作業系統虛擬化: 沒有獨立的hypervisor層。相反,主機作業系統本身就負責在多個虛擬伺服器之間分配硬體資源,並且讓這些伺服器彼此獨立。一個明顯的區別是,如果使用作業系統層虛擬化,所有虛擬伺服器必須運行同一作業系統(不過每個實體有各自的應用程式和使用者賬戶),Virtuozzo/OpenVZ/Docker等等。
混合虛擬化: 混合虛擬化模型同寄居虛擬化一樣使用主機作業系統,但不是將管理程式放在主機作業系統之上,而是將一個核心級驅動器插入到主機作業系統核心。這個驅動器作為虛擬硬體管理器(VHM)協調虛擬機器和主機作業系統之間的硬體訪問。可以看到,混合虛擬化模型依賴於記憶體管理器和現有內核的CPU排程工具。就像裸金屬虛擬化和作業系統虛擬化架構,沒有冗餘的記憶體管理器和CPU排程工具使這個樣式的效能大大提高。
各種架構對比
裸金屬虛擬化架構與混合虛擬化架構將是未來虛擬化架構發展的趨勢,配合硬體輔助虛擬化可以達到接近物理機的執行效能。KVM、Hyper-V、VMware等主流伺服器虛擬化都支援硬體輔助虛擬化。
記憶體虛擬化
在虛擬環境裡,虛擬化管理程式就要模擬使得虛擬出來的記憶體仍符合客戶機OS對記憶體的假定和認識。在虛擬機器看來,物理記憶體要被多個客戶OS同時使用;解決物理記憶體分給多個系統使用,客戶機OS記憶體連續性問題。
要解決以上問題引入了一層新的客戶機物理地址空間來讓虛擬機器OS看到一個虛擬的物理地址,並由虛擬化管理程式負責轉化成物理地址給物理處理器執行。即給定一個虛擬機器,維護客戶機物理地址到宿主機物理地址之間的對映關係;截獲虛擬機器對客戶機物理地址的訪問,將其轉化為物理地址。
記憶體全虛擬化: 虛擬化管理程式為每個Guest都維護一個影子頁表,影子頁表維護虛擬地址(VA)到機器地址(MA)的對映關係。
記憶體半虛擬化技術: 當Guest OS建立一個新的頁表時,其會向VMM註冊該頁表,之後在Guest執行的時候,VMM將不斷地管理和維護這個表,使Guest上面的程式能直接訪問到合適的地址。
硬體輔助記憶體虛擬化: 在原有的頁表的基礎上,增加了一個EPT(擴充套件頁表)頁表,透過這個頁表能夠將Guest的物理地址直接翻譯為主機的物理地址。
I/O虛擬化技術
當虛擬化後,伺服器的乙太網埠被分割為多個後,網路、儲存以及伺服器之間的流量可能就不夠用了。當遇到I/O瓶頸時,CPU會空閑下來等待資料,計算效率會大大降低。所以虛擬化也必須擴充套件至I/O系統,在工作負載、儲存以及伺服器之間動態共享頻寬,能夠最大化地利用網路介面。
I/O虛擬化的標的是不僅讓虛擬機器訪問到它們所需要的I/O資源,而且要做好它們之間的隔離工作,更重要的是,減輕由於虛擬化所帶來的開銷。
全虛擬化: 透過模擬I/O裝置(磁碟和網絡卡等)來實現虛擬化。對Guest OS而言,它所能看到就是一組統一的I/O裝置,VMM截獲Guest OS對I/O裝置的訪問請求,然後透過軟體模擬真實的硬體。這種方式對Guest而言非常透明,無需考慮底層硬體的情況。比如Guest操作的是磁碟型別、物理介面等等。
半虛擬化: 透過前端、後端架構,將Guest的I/O請求透過一個環狀佇列傳遞到特權域(也被稱為Domain0)。因為這種方式的相關細節較多,所以會在後文進行深入分析。
硬體輔助虛擬化: 最具代表性莫過於Intel的VT-d/VT-c,AMD的IOMMU和PCI-SIG的IOV等。這種技術也需要相應網絡卡配合實現,目前常見的網絡卡分為普通網絡卡、VMDq直通和SR-IOV。
普通網絡卡採用Domin0網橋佇列。
VMDq透過VMM在伺服器的物理網絡卡中為每個虛機分配一個獨立的佇列,虛機出來的流量可直接經過軟體交換機傳送到指定佇列上,軟體交換機無需進行排序和路由操作,Hyper-V就是採用這種樣式。
SR-IOV透過建立不同虛擬功能(VF)的方式,給虛擬機器使用物理獨立網絡卡,實現虛擬機器直接跟硬體網絡卡通訊,不再經過軟體交換機,減少了虛擬化管理程式層的地址轉換。
Intel硬體對虛擬化支援
VT-x技術 為IA 32 處理器增加了VMX root operation 和 VMX non-root operation兩種操作樣式。VMM自己執行在 VMX root operation 樣式,GuestOS執行在VMXnon-root operation 樣式。兩種操作樣式都支援 Ring0-Ring 3特權執行級別,因此 VMM和 Guest OS 都可以自由選擇它們所期望的執行級別。允許虛擬機器直接執行某些指令,減少VMM負擔。VT-x指至強處理器的VT技術,VT-i指安騰處理器的VT技術。
VT-d(VT for Direct I/O)主要在晶片組中實現,允許虛擬機器直接訪問I/O裝置,以減少VMM和CPU的負擔。其核心思想就是讓虛擬機器能直接使用物理裝置,但是這會牽涉到I/O地址訪問和DMA的問題,而VT-d透過採用DMA重對映和I/O頁表來解決這兩個問題,從而讓虛擬機器能直接訪問物理裝置。
VT-c(VTfor Connectivity)主要在網絡卡上實現,包括兩個核心技術VMDq和VMDc。VMDq透過網絡卡上的特定硬體將不同虛擬機器的資料包預先分類,然後透過VMM分發給各虛擬機器,以此減少由VMM進行資料包分類的CPU開銷。VMDc允許虛擬機器直接訪問網絡卡裝置,Single Root I/O Virtualization(SR-IOV)是PCI-SIG規範,可以將一個PCIe裝置分配給多個虛擬機器來直接訪問。
可信執行技術(TXT)透過使用高階的模組晶片,可以有效確保使用者計算機免受各種安全威脅。主要是透過硬體內核和子系統來控制被訪問的計算機資源。使得計算機病毒、惡意程式碼、間諜軟體和其他安全威脅將不復存在。
GPU及GPU虛擬化技術
GPU直通將GPU裝置直通給虛擬機器;GPU共享則將GPU裝置直通給GPU server虛擬機器,GPU server可與GPU client共享其 GPU裝置;GPU虛擬化是指將GPU裝置可虛擬化為n個vGPU,對應的n個虛擬機器可同時直接使用該GPU裝置,支援虛擬化的GPU裝置可配置為直通或虛擬化型別。
GPU虛擬化透過VGX GPU硬體虛擬化功能,把一個物理GPU裝置虛擬為多個虛擬GPU裝置供虛擬機器使用,每個虛擬機器透過系結的vGPU可以直接訪問物理GPU的部分硬體資源,所有vGPU都能夠分時共享訪問物理GPU的3D圖形引擎和影片編解碼引擎,並擁有獨立的視訊記憶體。
GPU虛擬化功能支援將一個物理GPU裝置可同時供多個虛擬機器使用,而GPU直通中一個GPU裝置只能給一個虛擬機器使用。GPU虛擬化使同時使用同一GPU物理裝置的虛擬機器間互不影響,系統自動分配物理GPU裝置的處理能力給多個虛擬機器,而GPU共享是透過GPU server掛載GPU裝置,在主機上建立GPU Server與GPU client的高速通訊機制,使得GPU client可以共享GPU server的GPU裝置,GPU client是否享有GPU功能完全依賴於GPU server。