在上一期中,我們講到虛拟化Fusioncompute,它包含兩個部分CNA和VRM。而虛拟化開發的難點在CNA上,因為所有計算、存儲、網絡的虛拟化是在CNA上實作完成的。其實虛拟化也不是它自己一層層開發寫出來的,而是基于開源的虛拟化,進行二次開發而來的,以前是基于XEN 現在是基于KVM。
計算虛拟化的重要概念
虛拟化是指通過虛拟化技術将一台計算機虛拟為多台邏輯計算機。在一台計算機上同時運作多個邏輯計算機,每個邏輯計算機可運作不同的作業系統,并且應用程式都可以在互相獨立的空間内運作而互不影響,進而顯著提高計算機的工作效率。
這也是我們學習虛拟化最初的概念,在傳統實體機場景裡:底層是硬體Host Machine、中間是作業系統Host OS、最上層是應用程式;而在虛拟化場景裡,是在底層硬體之上多加了一個虛拟化層,也是虛拟化最核心的Hypervisor,在Hypervisor之上運作虛拟機,在虛拟機裡安裝作業系統,最終運作應用程式。

說明一下,如果大家以後看到VM是代表虛拟機(Virtual Machine),VMM是代表虛拟機螢幕(Virtual Machine Monitor),它是虛拟化開發最重點也是難度最大的地方。那它為什麼有難度呢?因為它要做很多事情。比如說,一台機器有128G記憶體,它要虛拟出164G記憶體來;還有底層是一個intel的網卡,它還能虛拟出多個網卡,配置設定給多個多個虛拟機等等,這些都是需要Hypervisor來實作。
計算虛拟化的類型
在CPU的架構裡,這裡先要了解一下CPU特權環這個概念,是指在CPU裡面存在4個邏輯的環,分别是ring0、ring1、ring2、ring3。在原來實體機的世界裡,以前做CPU的廠商也沒有意識到未來會有虛拟化的存在,是以當時CPU被分為4個邏輯環,隻有ring0可以與作業系統核心互動,ring3運作應用程式。但是在虛拟化的裡,又是另外一種世界了,虛拟機運作在ring3這一層,而虛拟機也有核心,在ring3這一層無法和虛拟機的核心互動,隻有ring0這層才可以和核心互動,是以這個時候會産生19條敏感指令集的問題,也就是說ring3這層沒有辦法把這19條指令進行翻譯和轉換,因為ring3沒法和虛拟機的核心進行互動,就會導緻虛拟機無法運作,也就意味着裝不了虛拟機。
那麼,現在為什麼又能安裝虛拟機了呢?
其實在原來就出現了兩種技術,一種是全虛拟化,另一種是半虛拟化,就是為了解決那19條敏感指令集的問題。
這怎麼說呢?
隻有虛拟化世界的老大,VMware在這一點上做的最好。它在當時90年代,2000年的時候就可以裝windows的作業系統了,而半虛拟化是裝不了windows的,隻能安裝Linux的作業系統。這是為什麼呢?
這是因為當時CPU的指令集不支援轉換敏感指令集,是以需要在作業系統核心中寫入一個系統調用程式Hypercall進行攔截和轉換 ,因為Windows不開源,是以無法寫入Hypercall,而Linux開源,支援寫入Hypercall,是以半虛拟化隻支援Linux系統。
那是怎麼做到的呢?
其實是ring3攔截後,把指令給了ring0,對于虛拟機而言,它以為它直接進行交換了,其實是ring3在中間做了轉換,模拟欺騙它說可以執行指令,但是這樣的話開銷特别大。但是vmware老強大了,自己可以攔截的,叫全虛拟化。隻是這樣來做轉換,性能特别低下。是以,後來在CPU裡加了一個特殊的指令集VT-X(VT-X是不是大家就熟悉一些啦)。
拿到一台機器,可以用lscpu這個指令來進行查詢,如果有VT-X,說明CPU是支援虛拟化的。
還可以用這個指令cat /proc/cpuinfo來查詢,flags這欄就是指令集,如果裡面有vmx(代表intel的)、svm(代表AMD的),就說明支援硬體虛拟化。因為在一些就版本沒有lscpu這個指令,是以可以用這條指令來查詢。
現在這樣是通過CPU自身來攔截處理和轉換,提升了效率,不用Hypervisor來攔截和轉換。
這種方式就是硬體輔助虛拟化。
XEN和KVM
在今天虛拟化的種類很多,商業化的虛拟化有VMware的,還有微軟的Hype-V,但是這些都不開源。雲時代不用昂貴的虛拟化,用開源的虛拟化。開源可以做二次開發,對于廠商而言,可以不用給虛拟化廠商付錢。
現在主流的開源的虛拟化主要有2種,分别是Xen和KVM。
從Xen開始說起,在2002年,Xen正式被開源,它是英國劍橋大學開發的。因為Xen開源,是以在各個系統中都可以使用,華為在Fusioncompute 6.1之前的版本,它用的虛拟化就是Xen,Fusioncompute 6.1之後的版本就改為KVM了。
而在2007年,紅帽釋出了第一個企業版的虛拟化,叫RHEL5.0(紅帽企業版Linux5.0)。但是在2008年,Xen被思傑citrix收購了,就是大家現在看到的Xen server。按理來說Xen是開源的,誰都可以用,但是被Xen收購後,再繼續使用就需要付費給思傑citrix。紅帽表示不想給思傑付錢,後來紅帽就不用XEN了,反而用KVM,在2008年紅帽收購了KVM。因為在繼續用Xen是幫别人做嫁衣,不是紅帽自己的。
當時2008亞馬遜做雲最好的,它的底層就是Xen,而後來阿裡在2008年成立雲計算的底層也是Xen,但是在2017年,亞馬遜把虛拟化遷到KVM,阿裡雲也一樣,華為是2018年把虛拟化遷到KVM上的。是以今天Xen的身影看到的就比較少了。
這些就是曆史故事了,下面再來講繼續技術。在rhel5.8裡可以看到安裝的時候有兩種選擇,Xen和KVM。
這裡也有一個故事
紅帽5.0用Xen,直到5.4支援KVM,但是紅帽的技術支援是7年,有些客戶剛買Xen的系統,又不願意改到KVM,就出現紅帽繼續支援Xen,直到7年有效期結束,是以當時紅帽支援兩種虛拟化Xen和KVM。如果客戶買5.4的,就推薦KVM,5.4之前的用xen,直到2014年,紅帽就再也不用支援xen了,之後紅帽釋出的RHEL6.0就隻有kvm了。但是Xen和KVM都隻能在Linux上運作,還有現在雲的世界底層也是Linux、不是windows,除了微軟。
那麼Xen和KVM有什麼差別呢?
第一點:先說Xen有什麼特點,在Linux系統中有兩個核心,一個是是标準核心,一個是Xen核心。運作業務用标準核心,運作虛拟化用xen核心。因為安裝一套核心,必須要維護一套全新的核心,标準核心的一些驅動,在Xen核心是用不了。而且核心版本一定要在同版本内編譯,才能使用,操作特别麻煩。
第二點:Domain 0。它也是和KVM最大的差別。在Xen核心,Hypervisor它在安裝是時候需要安裝Domain 0 ,需要預留CPU和記憶體。一個指令資料包請求先到實體機,再到Domain 0,由Domain 0在給到指定的VM,是以Domain 0的開銷特别大,也存在性能瓶頸。如果給Domain 0預留的資源不足,無法維持VM正常運作;如果配置設定過多,又存在資源浪費。
隻要安裝xen虛拟化,就出現一個特殊的虛拟機Domain 0。
而KVM不一樣,它不需要更新核心,而是直接用标準核心。
每一個虛拟化在核心中是一個程序。一旦程序啟動,标準核心有的,程序都可以使用。
不需要由Domain 0來處理,相對于來說更輕量一些,這就是KVM和Xen最大的差別。
總結:
Xen有兩個不好的地方,更新核心,要有Domain 0,而KVK直接用标準核心實作的,不用Domain 0。後來,KVM吐槽Xen,我們多輕量,Xen太重了;而Xen吐槽KVM就是,那家夥是個小毛孩子太年輕了,發展起來才幾年,我們Xen已經特别成熟了。
這些年KVM也逐漸成熟發展起來,彌補了缺點,成為行業的标準,像華為雲、阿裡雲等都是用KVM了。是以,現在不用學Xen,隻用學KVM了,但是這段曆史還是要知道的。