之前大致介紹了什麼是虛擬化,並以CPU的虛擬化為例進行簡要介紹,糾正一些人們對於虛擬化的誤解!那本本節就來說一說常見的虛擬化技術!

概述

上節提到,以筆者為例,平時在PC上使用比較多的虛擬化是Vmwear(一個桌面軟體,當然偶爾也會使用Virtual Box,後者是一個開源軟體功能依舊很強大),這類軟體可以在windows上安裝linux虛擬機(用戶學習linux系統,或者安裝hadoop集羣進行學習測試),且安裝完成的虛擬機就是一個文件夾,可以拷貝到任意其他PC電腦上使用,只要那臺電腦上也裝了Vmwear,等同於一個移動操作系統。但是這僅僅是我們個人在PC端使用的虛擬化軟體,如果在企業級伺服器上相應的工具又是什麼?Vmwear在伺服器端也推出了自己的虛擬化工具,叫做ESXI,打開後是一個文本界面,但是它並不是使用最廣泛的虛擬化技術,使用最廣泛的服務端虛擬化技術是KVM和Xen。KVM是Host OS 中的兩個內核模塊,且是使用做廣泛的開源的hyperviser。但是KVM出現的比較晚,KVM是依賴硬體輔助虛擬化技術實現的,是在06年硬體虛擬化技術出現後纔有的。而06年之前使用的是另一個開源的hyperviser,那就是XEN,國內的阿里和國外的AWS都是使用的XEN。Xen是劍橋實驗室開發的,對系統修改比較大。目前linux伺服器首選KVM(為什麼AWS和阿里雲沒有使用KVM而使用XEN,或許因為他們開始做雲計算的時候KVM還不成熟,無法商用)。下面主要以KVM和XEN這兩種典型的技術進行介紹。

一、XEN:

上一節中提到,X86不好做虛擬化的根本原因就是虛擬的操作系統中有些指令沒有辦法執行(特權指令)。KVM是基於應將輔助虛擬化技術解決的這個問題,但是XEN出現的的時候還沒有硬體輔助虛擬化技術,它是怎麼解決這個問題的呢?XEN的處理方法就是讓虛擬機的操作系統不要去用這些指令(簡單,暴力,我喜歡)。那虛擬機的操作系統不用這些指令,虛擬機怎麼工作呢?XEN給出的解決方案是,當虛擬機用到這些指令時不去調用CPU的指令而是調用xen的hyperviser,它幫你把完成這些指令相應的功能。而這樣需要付出的代價就是要改操作系統,把操作系統的內核給改了,讓操作系統在遇到這些指令的時候不要去調CPU的指令而是去調用XEN的hyperviser,所以XEN把這種調用叫做HyperCall(國內大多被翻譯成「超級調用」)。因此XEN裡面是跑不了widow的虛擬機的,因為沒有辦法修改windows的內核,但有支持XEN的linux版本。

1.1 XEN的使用

首先找臺伺服器過來,裝上linux,之後裝上XEN,裝上xen之後他會修改linux的內核,改完之後他會告訴你重啟這臺伺服器機器。而當你重啟這臺伺服器之後,裡面軟體的位置就發生了翻天覆地的變化,如下圖所示:

在重啟伺服器之前,我們是在伺服器硬體上 裝了linux的操作系統,然後在linux之上裝了Xen;本來物理伺服器上跑的是操作系統,但是裝完XEN並重啟之後,在伺服器的硬體之上跑的不在是linux操作系統而是XEN 的Hypervisor,而之前我們裝的linux作為Host OS 在其之上 ,即左上角的HOST OS,其本質上也就是一個虛機了。之後如果再創建虛機GUEST OS就會如圖Host OS的右邊,也稱之為Paravirtualized OS因為Para這個前綴願意是並列的意思 ,但因為也有半的意思,所以在某些文獻中被稱之為「半虛擬化」(算是一種英文直譯的後果吧)。

此時還涉及到一個問題就是外部設備怎樣供多個虛機使用?這是就要依靠右上角的那個Host OS即管理用的虛機稱之為Domain0,之後再啟動的虛機,即供用戶使用的虛機成為DomainU。也就是Domain0是做管理用的虛機,DomainU是用戶用的虛機。回到之前的問題,而外設的虛擬化怎麼實現?其實就是在Domain0 裡面跑物理的驅動通過Domain0將這個物理的設備虛擬化成多個設備供其他的虛機(DomainU)去使用,所以說Domain0和Hypervisor一起實現了外部設備的虛擬化。由此可見外部設備的虛擬化從來都不是HyperVisor自己可以搞定的,都要依賴其他的輔助協同去實現,對於KVM來說他依賴於qemu,對於XEN來說依賴於Domain0,另外VMware在服務端的虛擬化技術叫做ESXI,他的架構在本質上跟KVM是非常類似的。微軟的HyperVisor叫做Hyper_V跟Xen比較類似。

XEN虛擬化結構示意圖:

二、KVM

上一節我們提到,在安裝虛擬機時底層跑的是系統(我們PC機上的windows)我們稱為Host OS。相應的在linux伺服器端,原始裝的那個linux系統我們也稱為Host OS,在器之上我們安裝各種應用,JVM,JCC,Python等等。而KVM是Host OS中的兩個內核模塊,KVM自己主要完成指令集的虛擬化工作和硬體輔助虛擬化技術(就是晶元裡面的硬體輔助虛擬化技術,比如interl的NT-x AMD-V配合起來去完成計算虛擬化的功能),此外一臺計算機光有計算功能還是不夠的,一臺計算機還要有外部設備,還有內存的管理,而這樣一些功能並不在KVM裡面實現,而是在qemu裡面實現,所以我們也可以說KVM虛機指的是KVM和Qemu在一起實現的虛機。需要注意,每一個虛機在我們的Host OS裡面他都是一個進程,跟普通進程的地位是一樣的。正如上節提到的,虛擬化與模擬是不一樣的,模擬的方式是模擬一個CPU,而程序的指令集先在模擬器上翻譯一下,翻譯成底層硬體的指令集,在底層硬體上執行,當硬體CPU返回結果以後,他在將底層硬體返回的信息經過模擬器翻譯成上層軟體的指令集運行。而KVM和硬體輔助虛擬化技術結合起來可以使得指令直接在CPU上執行。

KVM虛擬化結構示意圖:

下一節將介紹虛擬機在使用中遇到的問題,並由此引出Container技術!

推薦閱讀:

相關文章