虛擬化技術(-)

紫翼龍王夜發表於2015-03-18
虛擬化可以理解為將一臺物理硬體虛擬成多個虛擬硬體平臺。
虛擬機器OS看到的實體記憶體不是從0開始的,而每個核心所使用的實體記憶體必須是從0開始的地址空間,好分配記憶體地址;
我們將虛擬機器稱為guestos;
虛擬機器監控軟體起名叫:hypervisor;
I/O裝置虛擬化:將來自不同的包文進行封裝即可;
虛擬化使用軟體的方法重新定義劃分IT資源,可以實現IT資源的動態分配、靈活排程、跨域共享,提高IT資源利用率,使IT資源能夠真正成為社會基礎設施,服務於各行各業中靈活多變的應用需求。
最流行的虛擬化方法使用名為hypervisor的一種,在和底層硬體之間建立一個抽象層。的Virtual是代表該方法的兩個商用產品,而基於核心的(KVM)是面向系統的開源產品。
hypervisor可以捕獲指令,為指令訪問硬體控制器和外設充當中介。因而,完全幾乎能讓任何一款作業系統不用改動就能安裝到上,而它們不知道自己執行在虛擬化環境下。主要缺點是,hypervisor給處理器帶來開銷。
在完全虛擬化的環境下,hypervisor執行在裸硬體上,充當;而由hypervisor管理的虛擬伺服器執行作業系統(guest OS)。
也有自已的虛擬化產品,Z/VM。

我們可以虛擬化一個虛擬機器之後,但是這個虛擬機器什麼都不用做,再買一臺裝置,專門做iscsi。將硬碟掛載進來,對硬碟進行操作介面。這樣能提高物理磁碟io效能。
nat:意味著外面的主機看不到內部的機器,在三層轉發給虛擬機器;
bridge:意味著將這兩個虛擬網路卡繫結在物理網路卡裝置上,並且讓該物理裝置執行在混雜模式下,無論目標mac是不是自己都要接受;在二層轉發給虛擬機器。

X86的cpu:最內的環叫做ring環;也叫做環0;裡面執行的有系統呼叫等;
指令分為普通指令和特權指令;
特權指令裡面有一部分是敏感指令,可以觸發特權指令的執行;作業系統核心將特權指令和敏感指令都自己進行管理;

在虛擬化中,核心是虛擬機器的核心;x86cpu的某些敏感指令是不能進行虛擬的;當某個程式需要執行敏感指令的時候會將其交給虛擬機器的核心;
虛擬機器的核心只能執行在環3上的;單是每一個機器的核心都認為自己執行在環0上;這個時候就需要模擬記憶體;當其需要執行敏感指令的時候還是真實的物理機進行的;我們只需要將特權指令進行虛擬;這樣的話能夠保證本系統上,其它虛擬機器的安全性;guestos;


綜上所述:
1974年,Popek和Goldberg在一篇論文中定義了“經典虛擬化(Classical virtualization)”的基本需求,他們認為,一款真正意義上的VMM至少要符合三個方面的標準:
◇ 等價執行(Equivalient execution):除了資源的可用性及時間上的不同之外,程式在虛擬化環境中及真實環境中的執行是完全相同的;
◇ 效能(Performance):指令集中的大部分指令要能夠直接執行於CPU上;
◇ 安全(Safety):VMM要能夠完全控制系統資源;任何一臺虛擬機器都不能越過我們的hostos,而直接執行特權級命令;

1.1 x86平臺實現虛擬化技術的挑戰
x86處理器有4個特權級別,Ring 0 ~ Ring 3,只有執行在Ring 0 ~ 2 級時,處理器才可以訪問特權資源或執行特權指令;執行在 Ring 0級時,處理器可以執行所有的特權指令。x86平臺上的作業系統一般只使用Ring 0和Ring 3這兩個級別,其中,作業系統執行在Ring 0級,使用者程式執行在 Ring 3 級。
1.1.1 特權級壓縮(ring compression)
為了滿足上面所述的需求,VMM自身必須執行在Ring 0級,同時為了避免GuestOS控制系統資源,GuestOS不得不降低自身的執行級別而執行於Ring 3(Ring 1、2 不使用)。
此外,VMM使用分頁或段限制的方式保護實體記憶體的訪問,但是64位模式下段限制不起作用,而分頁又不區分Ring 0,1,2。為了統一和簡化VMM的設計,GuestOS只能和使用者程式一樣執行在 Ring 3。VMM必須監視GuestOS對GDT、IDT等特權資源的設定,防止GuestOS執行在Ring 0級,同時又要保護降級後的GuestOS不受Guest程式的主動攻擊或無意破壞。
1.1.2 特權級別名(Ring Alias)
設計上的原因,作業系統假設自己執行於ring 0,然而虛擬化環境中的GuestOS實際上執行於Ring 1或Ring 3,由此,VMM必須保證各GuestOS不能得知其正執行於虛擬機器中這一事實,以免其打破前面的“等價執行”標準。例如,x86處理器的特權級別存放在CS程式碼段暫存器內,GuestOS卻可以使用非特權PUSH指令將CS暫存器壓棧,然後POP出來檢查該值;又如,GuestOS在低特權級別時讀取特權暫存器GDT、LDT、IDT和TR時並不發生異常。這些行為都不同於GuestOS的正常期望。
1.1.3 地址空間壓縮(Address Space Compression)
地址空間壓縮是指VMM必須在GuestOS的地址空間中保留一段供自己使用,這是x86虛擬化技術面臨的另一個挑戰。VMM可以完全執行於自有的地址空間,也可以部分地執行於GuestOS的地址空間。前一種方式,需在VMM模式與GuestOS模式之間切換,這會帶來較大的開銷;此外,儘管執行於自己的地址空間,VMM仍需要在GuestOS的地址空間保留出一部分來儲存控制結構,如IDT和GDT。無論是哪一種方式,VMM必須保證自己用到地址空間不會受到GuestOS的訪問或修改。
1.1.4 非特權敏感指令
x86使用的敏感指令並不完全隸屬於特權指令集,VMM將無法正確捕獲此類指令並作出處理。例如,非特權指令SMSW在暫存器中儲存的機器狀態就能夠被GuestOS所讀取,這違反了經典虛擬化理論的要求。
1.1.5 靜默特權失敗(Silent Privilege Failures)
x86的某些特權指令在失敗時並不返回錯誤,因此,其錯誤將無法被VMM捕獲,這將導致其違反經典虛擬化信條中的“等價執行”法則。
1.1.6 中斷虛擬化(Interrupt Virtualization)
虛擬化環境中,遮蔽中斷及非遮蔽中斷的管理都應該由VMM進行;然而,GuestOS對特權資源的每次訪問都會觸發處理器異常,這必然會頻繁遮蔽或啟用中斷,如果這些請求均由VMM處理,勢必會極大影響整體系統效能。
1.2  X86平臺虛擬化
完整意義上的計算機由硬體平臺和軟體平臺共同組成。根據計算機體系結構理論,其硬體平臺包括CPU、記憶體和各種I/O裝置;而軟體平臺則包括BIOS、作業系統、執行時庫及各種應用程式等。對於主機虛擬化技術來講,其主要負責虛擬硬體平臺及BIOS,而作業系統、執行時庫及各種應用程式可以使用以往在物理平臺上各種現有技術及產品。

CPU引進了硬體虛擬化技術:
CPU: 
Intel VT-x:在硬體級別直接加了ring -1級別,從而有了特權ring -1級別;guest OS執行在環0上沒有問題,hostos上執行的是我們特權指令;而在環0上什麼指令都不放;cpu在硬體級別就能管理虛擬機器的特權指令了;
AMD AMD-V:

MMU: GUESTOS將VA轉換為PA,最終還要轉換為HA。

連續轉換兩次太麻煩了,intel的amdcpu又實現了mmu虛擬化,稱為shadow;直接將VA轉換為了HA;
INTEL的技術叫做EPT,AMD的技術叫做NPT;

最終要將MMU的轉換地址儲存都TLB中;可以給每個虛擬機器進行編號;每個編號打一個標籤,起的名字叫tag。這樣能夠提高TLB的命中率;
這都是新cpu才有的技術。
上面的虛擬化技術,我們稱為full 虛擬化技術。

可以把驅動程式做成系統呼叫,由虛擬機器的核心直接跟系統呼叫打交道,這樣就避免了hostos的其它模組再做處理了。這就是虛擬化的獨到之處。這種虛擬化技術,我們稱為半虛擬化技術。
半虛擬化的效能要高於全虛擬化技術。
cpu不支援虛擬化的技術稱為模擬虛擬化;
cpu支援的虛擬化技術我們稱為:HVM(Hypervisor call)(cpu輔助的虛擬化技術);

通常我們把這種提供系統呼叫的技術叫做:hypercall;明確說明這些系統呼叫是給虛擬機器使用的。windows不允許修改核心,那就不能在半虛擬化技術中執行。

pv ON HVM:只是使用了io的虛擬化技術;
還有一種技術叫做io的透傳技術;如下圖所示:

虛擬化技術:
有宿主機的vmm;
虛擬化模型如下圖所示:


xen這種xen不管理io裝置,是透過一臺管理機器進行管理;這種情況下xen是一種半虛擬化程式。
完全虛擬化與半虛擬化的區別是完全虛擬化的核心不需要進行修改即可。
QEMU就是個虛擬機器軟體,還可以跨越平臺進行虛擬;
QEMU模擬建立虛擬硬碟,各種格式都支援。
通常我們使用xen的時候會結合qemu一塊使用。xend/xm工具可以幫我們管理一個虛擬機器;基於xen的圖形化管理工具,比如說openstack;所謂的openstack就是個批次管理xen虛擬機器的工具;
其實除了xen之外還有不下數十種管理工具。

virsh透過管理工具,能夠幫助我們管理kvm、xen、qemu。

虛擬化技術之kvm
kvm:kernel-base  virtual machine
基於核心的虛擬機器。KVM是linux核心的一個模組。kvm能夠讓核心成為hypervisor。只不過這個虛擬機器還能夠kill掉;kvm只不過擴充套件了核心的功能,讓其成為一個hypervisior;所以在其之上
還需要執行一個作業系統。KVM使用的是完全虛擬化技術;
qemu對cpu的模擬仍然是在核心空間進行模擬的;而kvm使用的是核心模組,它比qemu模擬出來的效能更好。所以通常我們使用的是kvm+qemu。而且kvm需要跑在64位的平臺上面。
而kvm在核心2.6.20版本之後,就放入了核心裡面。

紅帽在6.0之後只支援kvm;
思傑:僅次於vmware,xen的商用是由思傑公司提供的;
windows的虛擬化技術起的名字叫做hyper-v。
kvm裡面引入另外一種技術:virtio virio說白了就是io技術的半虛擬化技術。同時kvm也支援透傳技術。

如果想在windows裡面跑linux的程式,可以使用cywin,使用linux環境跑hadoop。




來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30129545/viewspace-1465070/,如需轉載,請註明出處,否則將追究法律責任。

相關文章