初識openstack之0——虛擬化及Xen和KVM介紹
1.CPU的工作機制
隨著雲計算的興起,虛擬化作為雲計算的組成部分也火了一把,但虛擬化並不是什麽新技術,早在上世紀60年代虛擬化技術就已經出現。X86的CPU架構有4個保護環,分為:環0--環3,環0只與內核通信,執行特權指令,而環3工作在用戶空間,環1、環2預留,每當用戶空間發起特權請求時,會立即激活內核空間,此時用戶與內核空間的切換稱為軟中斷,用戶空間的所有特權指令都必須通過系統調用的方式來完成
2.全虛擬化、半虛擬化和CPU輔助虛擬化
虛擬化按照實現方式分為:全虛擬化、半虛擬化和CPU輔助的虛擬化,其特點如下:
2.1 全虛擬化
在傳統架構下,應用程序會直接向環0上的內核發起系統調用,此時系統由用戶空間轉為內核空間的過程稱為軟中斷,當硬件執行完指令時會通知內核的過程稱為硬中斷。在全虛擬化架構下,Hypervisor運行在環0,Guest系統運行在環1,但它以為自己運行在環0,當Guest系統的應用向內核發起系統調用時會發生異常(特權指令無法在環1運行),Hypervisor會捕獲到這些異常,在異常裏面做翻譯,模擬,而後的特權指令會在環1和環0之間轉換,最後返回到客戶操作系統內,客戶操作系統認為自己的特權指令工作正常,繼續運行。硬中斷結果返回時先經過Hypervisor,再由Hypervisor通知Guest內核。
2.2 半虛擬化
與全虛擬化Guest內核以為自己運行在環0不同,半虛擬化通過修改Guest的內核,讓它明確知道自己運行在環1,所以當它要運行特權指令時,會將調用內核的請求改為調用環0的Hypervisor,這樣節省了Hypervisor捕獲和翻譯的過程,但由於要修改內核,所以對Windows系統的支持不好。
2.3 CPU輔助虛擬化
針對X86系列的CPU虛擬化,Intel從2006年,AMD從2007年開始,對CPU從硬件層面進行了擴展,創造了環-1,Hypervisor運行在環-1,Guest運行在環0,這樣當Guest系統中的應用發起系統調用時,還是直接向Guest內核發起請求,除了部分敏感指令(特權指令的子集)外,其余指令不在需要Hypervisor進行輔助,由於他不需要Guest修改內核,又比全虛擬化省去了捕獲翻譯的過程,所以成為現階段CPU虛擬化的主流技術。
3.類型1和類型2的虛擬化技術
類型1的虛擬化技術,又稱為裸金屬虛擬化,該技術的特點是Hypervisor直接運行在物理主機上,並且管理虛擬機的操作系統,代表產品為Xen。
類型2的虛擬化技術,又稱為可托管的虛擬化,他的特點是允許虛擬化技術運行在普通操作系統上,和普通的進程類似,代表產品為QEMU。KVM是一個比較特殊的實現方式,他通過啟用內核中的虛擬化庫將傳統操作系統轉化為類型1的虛擬化,但是它讓然用的是通用操作系統,該內核與其他虛擬操作系統一同爭用物理主機資源,所以KVM更像是類型2的虛擬化技術架構。
二、內存虛擬化
所有操作系統的內存都是以虛擬內存的方式提供,內存虛擬化很象現在的操作系統支持的虛擬內存方式,為什麽所有操作系統都是虛擬內存?原因就是應用程序在運行時需要一段連續的地址空間,如果如實按照應用程序要求的地址空間提供的話,內存中會出現很多碎片,所以內核采取虛擬內存的方式,將物理內存以4K為一個單位進行分頁,應用程序以為自己獲得的是一片連續的地址空間,實際上是若幹個內存頁組成,每個內存頁上都以雙向鏈表的方式標明自己上一個和下一個內存頁的位置。現在所有的 x86 CPU 都包括了一個稱為內存管理的模塊MMU(Memory Management Unit)和 TLB(Translation Lookaside Buffer),通過MMU和TLB來優化虛擬內存的性能,但當內存要進行虛擬化時由於MMU和TLB會被反復重置,所以MMU和TLB也要進行虛擬化。
三、I/O虛擬化的實現
1.模擬和虛擬
所謂虛擬指的是創建的虛擬機CPU類型必須和宿主機保持一致,而模擬則允許虛擬機CPU為各種類型
2.I/O虛擬化說明
CPU和內存本身就是通過分片與分頁的方式實現了虛擬化,所以在虛擬化中I/O的虛擬化實現相對要復雜,I/O主要指網絡與磁盤I/O,按照類型可以分為全虛擬化、半虛擬化和直通3種,以下以磁盤I/O舉例說明
2.1 全虛擬化
vm中的磁盤在host系統中是以一個文件的形式存在,全虛擬化需要先經過vm中磁盤的驅動,然後在經過host磁盤驅動最終完成數據寫入
2.2 半虛擬化
半虛擬化的vm因為知道自己是個虛擬機所以通過一個接口將數據寫入host的文件中,再通過host磁盤驅動最終寫入磁盤內
2.3 直通
而直通直接是將物理磁盤映射給vm,vm此時只有host磁盤的驅動
三、KVM和Xen的實現
1.Xen介紹
Xen是KVM出現前的一種類型1的虛擬化技術,支持全虛擬化和半虛擬化,Xen的Hypervisor必須要配合一個獨一無二的Domain0才能進行工作,所有的Xen虛擬環境都需要先運行Domain0,然後才能運行其他的虛擬客戶機。Domain0中不僅包含所有硬件設備的驅動,還可以通過它對其他虛擬機進行全生命周期的管理,整個Xen架構中,只有Domain0有權限訪問硬件I/O,其他的虛擬機DomainU(unprivilege)訪問硬件必須通過Domain0完。
2.KVM介紹
在2.6.2之後的內核版本中,KVM就以一個模塊的形式集成在裏面,當內核裝載了該模塊之後就變成了支持hypervisor的內核。但是KVM本身只能夠實現CPU和內存的虛擬化,KVM在I/O虛擬化方面,傳統或者默認的方式是使用用戶空間的QEMU純軟件的方式來模擬I/O設備,包括鍵盤、鼠標、顯示器,硬盤和網卡等,從這個角度看,原有的操作系統也有點Domain0的特征。
初識openstack之0——虛擬化及Xen和KVM介紹