服務器虛擬化技術簡介


虛擬化與雲計算中提到雲計算最重要的就是服務器虛擬化調度(Scheduler),本文將簡單介紹服務器虛擬化原理。

服務器虛擬化是指將一台計算機(稱為物理機、物理服務器)通過hypervisor虛擬為多台邏輯計算機的技術,這些邏輯計算機又被稱為虛擬機(VM,Virtual Machine),每台虛擬機都擁有獨立的“硬件”。雖然你可以在虛擬機的操作系統中看到這些“硬件”,不過它們並不是真實存在的,而是通過hypervisor將物理機的硬件虛擬而來。虛擬機運行時,虛擬機硬件的工作實際是由物理機的硬件完成的。

hypervisor又被稱為虛擬機監視器(VMM,Virtual Machine Monitor),是實現物理機虛擬為虛擬機的操作系統或者軟件,它為虛擬機提供虛擬的硬件資源,負責管理和分配這些資源,並確保上層虛擬機之間的相互隔離。hypervisor有兩種類型:一種是操作系統,直接安裝在物理機上;另一種是應用程序,需要先在物理機上安裝操作系統,再在操作系統中安裝hypervisor。

服務器虛擬化的分類

服務器虛擬化的有多種划分方式,可以根據虛擬化架構划分為裸金屬/寄居,根據虛擬化層次硬件輔助虛擬化/軟件輔助虛擬化,根據虛擬化平台划分為全虛擬化/半虛擬化。

裸金屬/寄居

未虛擬化的x86服務器架構,自下而上是物理硬件(Hardware)、操作系統(OS),應用程序(APP)。這和我們個人計算機一樣,就是在計算機上裝操作系統,再在操作系統里面安裝應用程序。

 

未虛擬化的x86服務器

裸金屬

裸金屬(bare-metal)架構也叫bare-metal hypervisor、Ⅰ型,最有代表性就是VMware ESX(i)。

 VMware ESXi

ESXi是VMware的企業級服務器虛擬化技術,本身是一個操作系統,直接安裝的物理服務器上。使用ESXi需要先在物理服務器上安裝ESXi,然后在ESXi中創建各種虛擬硬件(相應虛擬硬件的集合,不包括操作系統,也可以稱為虛擬機),再在虛擬機上安裝操作系統,最后才能在這些操作系統中安裝應用程序。

Tips:早期VMware的企業級服務器虛擬化版本稱為ESX,后來升級版本稱為ESXi。

寄居

寄居(hosted)架構也叫hosted hypervisors、Ⅱ型,代表產品VMware workstation和VirtualBox。

 

Windows中使用VMware workstation實現服務器虛擬化

VMware workstation和VirtualBox通常用作個人學習、測試,與寄居架構的VMware ESXi最明顯的區別在於,ESXi是操作系統,直接安裝在物理硬件之上,而VMware workstation則是軟件,需要安裝在操作系統(一般是Windows,也支持Linux)中。

以Windows中安裝VMware workstation為例,先在計算機上安裝Windows,再在Windows上安裝workstations,再在workstations中創建虛擬機,最后在虛擬機中安裝操作系統,在操作系統中安裝軟件。

 

判斷虛擬化類型是裸金屬還是寄居架構,取決於虛擬化層,也就是hypervisor所處的位置。寄居架構將虛擬化層(hypervisor)以一個應用程序的方式安裝運行於操作系統之上,支持最為廣泛的各種硬件配置(只要HOST OS支持該硬件即可)。裸金屬架構將虛擬化層(hypervisor)直接安裝到干凈的x86服務器上,裸金屬架構相對於寄居架構效率更高(少了Host OS這一層),且具有更好的可擴展性、健壯性和性能。

企業級服務器虛擬化都是裸金屬架構(效率更高),像主流的企業級服務器虛擬化ESXi、KVM、Xen、Hyper-v都是裸金屬架構。

*有點特殊的裸金屬KVM

KVM關於裸金屬/寄居的划分有點模糊。

KVM

部署KVM,首先需要在物理服務器上安裝Linux系統,再在Linux中“安裝KVM”。通常所說的KVM實際上是KVM和qemu兩種技術的結合,qemu本身是一種完整的寄居架構軟件,采用二進制翻譯的方式虛擬化CPU,KVM則采用效率更高的硬件輔助虛擬化CPU。由於KVM只能虛擬化CPU、內存,其它硬件(網卡、硬盤)的虛擬化則是由qemu來負責。

qemu是寄居架構,通俗來講就是qemu是個工作在Linux上的軟件。而KVM則相當於“給Linux內核打了一個補丁”,將Linux部分內核轉換為hypervisor,Linux內核自然屬於操作系統,這樣看來KVM的hypervisor既有寄居(qemu)又有裸金屬(kvm),是一種比較特殊的裸金屬。

Tips:以CentOS系統部署KVM為例,僅簡單體驗KVM可以通過yum安裝。因為我們習慣了yum安裝各種軟件,這樣看起來KVM是yum安裝的“軟件”,應該屬於寄居架構,實際上多把KVM划為裸金屬架構。因為像升級操作系統,可以通過yum(yum install kernel),但升級操作系統不能認為是通過yum安裝kernel這個軟件,同理也不應該認為部署KVM是在操作系統中安裝了KVM這個軟件。

參考文章:https://www.cnblogs.com/echo1937/p/7138294.html

部署KVM:https://www.cnblogs.com/yogurtwu/p/9799526.html

*有點特殊的裸金屬的Hyper-v和Xen

把他們放在一起是因為他們都有一個非常相似的概念,Hyper-v叫做父分區、Xen叫做Domain 0 。Hyper-v是Windows Server的一個功能,Xen則是在原Linux上安裝新的Linux內核。沒有開啟Hyper-v的Windows Server和沒有部署Xen的Linux,就是普通的x86服務器結構。

部署虛擬化之后,兩者非常相似。同樣是物理硬件位於最底層,hypervisor則分別是Xen和Hyper-v。對於Xen來說原來的Linux將以新的Linux內核運行在Domain 0,對於Hyper-v來說,Windows Server運行在父分區,他們都相當各自的於第一台虛擬機。

部署Hyper-v:https://www.cnblogs.com/yogurtwu/p/9791845.html

部署Xen:https://www.cnblogs.com/yogurtwu/p/10255530.html

hypervisor為虛擬機提供虛擬的硬件資源,負責管理和分配這些資源,但是並不一定能夠直接控制物理硬件。例如Xen和hyper-v,一般結構圖將hypervisor位於最底層,但是最終直接控制物理硬件的驅動程序還是安裝在Domain 0、父分區中的操作系統上

Tips:KVM雖然和Xen一樣是安裝在Linux中,但是KVM沒有Domain 0的概念,在Linux部署KVM后,其hypervisor相當於Linux的一部分,可以說hypervisor和Linux是在同一層,而Xen則是hypervisor位於最底層,原來的Linux相當於一台虛擬機,原來的Linux(Domain0)和其它虛擬化(Domain U)位於同一層。

Xen原理:http://www.cnblogs.com/sddai/p/5931201.html

硬件輔助虛擬化/軟件輔助虛擬化

通常根據CPU虛擬化的方式將服務器虛擬化技術划分為硬件輔助虛擬化和軟件輔助虛擬化,軟件輔助虛擬化是通過hypervisor實現CPU虛擬化,硬件輔助虛擬化則是借助硬件(需要CPU、芯片組、BIOS、hypervisor都支持)實現CPU虛擬化。常見的硬件輔助虛擬化技術:intel vt-x、AMD-v,它們和各自生產的CPU綁定,intel CPU只能用intel vt-x,AMD CPU只能用AMD-v。

因為硬件輔助虛擬化效率更高,現在主流的企業級服務器虛擬化都是采用硬件輔助虛擬化技術(intel vt-x或AMD-v),KVM和Hyper-v僅支持硬件輔助虛擬化(不支持軟件輔助虛擬化),ESXi、Xen和VMware workstation是兩者都支持。 

Tips:現在不單是CPU有硬件輔助虛擬化,網卡和芯片組也有硬件輔助虛擬化。比如以Intel VT虛擬化技術就包括分別針對處理器、芯片組、網絡的IntelVT-x、IntelVT-d和IntelVT-c技術,以及顯卡虛擬化GVT,不過服務器虛擬化划分標准還是根據CPU虛擬化的方式決定的。

全虛擬化/半(准)虛擬化

全虛擬化和半虛擬化,直觀的體現就是半虛擬化使用定制的Gust OS,全虛擬化則不必,使用普通適用於x86的的操作系統即可,具體原因見下文。

Tips:在主流的4種服務器虛擬化技術中,Xen全半虛擬化都支持。半虛擬化使用定制的Gust OS,這給維護帶來極大不便,但是性能比較好。全虛擬化,最開始是使用軟件輔助虛擬化,虛擬化的損耗較大,性能較低。隨着技術發展,通過硬件輔助虛擬化實現的全虛擬化性能已經極佳了。

虛擬化原理簡介

用戶/內核空間

 

Windows和Linux都將內存分為內核空間和用戶空間,操作系統內核代碼運行在內核空間,應用程序代碼運行在用戶空間。

特權級

 

特權級是一種用來保護數據和阻止惡意行為的機制,x86計算機的CPU提供4個特權級:ring0~3,ring0權限最高,ring3權限最低。
ring0提供給操作系統內核(內核空間代碼)使用,可以使用所有CPU指令,可以直接操作硬件(如CPU、內存)。
ring3提供給應用程序(用戶空間代碼)使用的,只可以調用基本的CPU指令。
ring1、ring2被設計為運行驅動程序,但Windows、Linux將驅動程序運行在ring0,未使用這兩個特權級。 

Tips:CPU清除內存數據、設置時鍾等指令是非常危險的,如果用錯了會導致系統崩潰。通過特權級這一機制,區分內核代碼和應用程序代碼權限,保證操作系統正常運行。

指令類型

未虛擬化時,可以將CPU的指令分為特權指令和非特權指令。

特權指令

在多用戶、多任務的計算機系統中特權指令必不可少,它主要用於系統資源的分配和管理,包括改變系統工作方式,檢測用戶的訪問權限,修改虛擬存儲器管理的段表、頁表,完成任務的創建和切換等。
常見的特權指令有以下幾種:
(1)有關對I/O設備使用的指令 如啟動I/O設備指令、測試I/O設備工作狀態和控制I/O設備動作的指令等。
(2)有關訪問程序狀態的指令 如對程序狀態字(PSW)的指令等。
(3)存取特殊寄存器指令 如存取中斷寄存器、時鍾寄存器等指令。
(4)其他指令
非特權指令
非特權指令有的需要以ring0運行,有的可以任意ring運行。操作系統內核以ring0運行,可以使用所有指令;應用程序以ring3運行,所以不能使用特權指令和部分非特權指令。
 
Tips:特權指令必須以ring0運行,否則會產生異常,將控制權交還ring0,非特權指令有的需要以ring0運行,有的不需要。

虛擬化后,CPU的指令分為特權指令,敏感指令,普通指令。

 

Tips:敏感指令=特權指令+部分非特權指令,也就是說特權指令一定是敏感指令。

敏感指令

敏感指令是指操作特權資源的指令。

1.企圖訪問或修改虛擬機模式或機器狀態的指令。

2.企圖訪問或修改敏感寄存器或存儲單元,如時鍾寄存器、中斷寄存器等的指令。

3.企圖訪問存儲保護系統或內存、地址分配系統的指令。

4.所有I/O指令。

Tips:特權指令只有ring0才能執行,當非ring0執行時會產生異常,非特權指令有的也需要ring0才能運行,但是它們非ring0運行不會產生異常。

服務器虛擬化的關鍵技術

優先級壓縮

x86服務器虛擬化借鑒了其他平台的虛擬化技術,將hypervisor(也叫做VMM)運行在ring0,Gust OS運行在ring1(也有的運行在ring3),應用程序運行在ring3。

陷入和仿真 (trap-and-emulate)

 

由於Gust OS運行在ring1,不能執行特權指令,當執行特權指令的時候會產生異常,將異常自動交給hypervisor(ring 0)來處理,此時hypervisor會將這些特權指令模擬運行后,返回Gust OS。

Tips:但是x86服務器比較特殊,部分敏感指令是非特權指令,在ring 1運行不會產生異常,便不會被hypervisor捕獲。有兩種處理方案,二進制翻譯和hypercall,也是現在主流的軟件輔助虛擬化技術。

*二進制翻譯

屬於非特權指令的敏感指令也需要在ring 0運行,但是Gust OS運行在ring1,這部分指令就無法通過陷入和仿真實現,VMware后來提供了一種二進制翻譯技術來解決這個問題。

二進制翻譯(Binary Translation)是一種直接翻譯可執行二進制程序的技術,能夠把一種處理器上的二進制程序翻譯到另外一種處理器上執行。具體在服務器虛擬化中就是將需要運用非特權指令的敏感指令的二進制程序代碼翻譯成“虛擬特權指令”的二進制代碼或者是翻譯成運行在核心態(ring 0)中的特權指令二進制代碼,從而強制觸發異常。

*hypercall

對於這部分需要ring0運行的非特權指令,還有一種處理方式就是使用hypercall(超級調用)。通過修改Gust OS內核,將Gust OS內核中需要使用敏感指令的代碼修改為主動調用hypervisor模擬執行,然后hypervisor將運行結果返回Gust OS。

這種方式比陷入模擬+二進制翻譯效率高,但是由於需要修改Gust OS內核,所以一般都是使用定制的Gust  OS,維護不太方便。 

Tips:陷入和模擬,二進制翻譯這種不需要修改Gust OS的方式,稱為全虛擬化,hypercall需要修改Gust OS(或使用定制的OS),稱為半虛擬化。主流服務器虛擬化中,Xen兩種都支持,kvm、hyper-v、esxi均為全虛擬化。

 

硬件輔助虛擬化

二進制翻譯、hypercall處理敏感指令的方式都是依靠軟件來實現(所以叫做軟件虛擬化),各有局限性,intel在2005年開始提供硬件輔助虛擬化(intel VT-x)解決敏感指令虛擬化這一難題。

intel VT-x提供了2 個運行環境:根(Root)環境和非根(Non-root)環境。根環境專門為VMM准備,很像原來沒有VT-x 的x86,只是多了對VT-x 支持的幾條指令。非根環境作為一個受限環境用來運行多個虛擬機。

如上圖所示,根操作模式與非根操作模式都有相應的ring 0至ring 3。VMM運行在根模式的ring 0,GuestOS的內核運行在非根模式的ring 0,GuestOS的應用程序運行在非根模式的ring 3。運行環境之間相互轉化,從根環境到非根環境叫VMEntry;從非根環境到根環境叫VMExit。VT-x定義了VMEntry操作,使CPU由根模式切換到非根模式,運行客戶機操作系統指令。若在非根模式執行了敏感指令或發生了中斷等,會執行VMExit操作,切換回根模式運行VMM。

根模式與非根模式之問的相互轉換是通過VMX操作實現的。VMM 可以通過VMXON 和VMXOFF打開或關閉VT-x。如下圖所示:

VMX操作模式流程:

1)、VMM執行VMXON指令進入VMX操作模式。

2)、VMM可執行VMLAUNCH指令或VMRESUME指令產生VM Entry操作,進入到Guest OS,此時CPU處於非根模式。

3)、Guest OS執行特權指令等情況導致VMExit的發生,此時將陷入VMM,CPU切換為根模式。VMM根據VMExit的原因作出相應處理,處理完成后將轉到2),繼續運行GuestOS。

4)、VMM可決定是否退出VMX操作模式,通過執行VMXOFF指令來完成。

 

硬件輔助虛擬化部分節選自:https://www.cnblogs.com/echo1937/p/7218201.html

軟件輔助虛擬化參考文章:https://www.cnblogs.com/echo1937/p/7222606.htmlhttps://www.cnblogs.com/echo1937/p/7227385.html

硬件服務虛擬化參考文章:https://www.cnblogs.com/echo1937/p/7218201.html, 

參考文章: https://baijiahao.baidu.com/s?id=1588195141957451187&wfr=spider&for=pc

內存、I/O、網絡虛擬化

參考:https://blog.csdn.net/sdulibh/article/details/38397377,涉及EPT、IOMMU等技術。

小結

當前(2018)服務器虛擬化類型的概念已經很淡了,主流的企業級服務器虛擬化技術(ESXi、KVM、Hyper-v、Xen)都是裸金屬架構,雖然Xen和ESXi支持軟件輔助虛擬化,但一般情況下都會使用硬件虛擬化,至於KVM和Hyper-v更是只支持硬件虛擬化。僅有Xen還支持半虛擬化,但是Xen是使用率現在已經很低了。

各廠商服務器虛擬化類型已經趨於一致(裸金屬、硬件輔助、全虛擬化),所以在類型方面也不必過多糾結,所以在選擇服務器虛擬化技術的時候應該更多關注各種服務器虛擬化技術的性能、穩定性、成熟性等等。

 

附一張2017年5月企業級服務器虛擬化市場占有率的圖片,VMware使用的肯定是ESXi,微軟則是Hyper-v,華為、新華三都是基於開源的KVM二次開發的產品。

 

參考文章:http://virtual.51cto.com/art/201803/569228.htm

參考文章:https://blog.csdn.net/flyforfreedom2008/article/details/45113635

參考文章:http://www.ctiforum.com/forum/2012/02/forum12_0228.htm?2


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM