官术网_书友最值得收藏!

2.2 虛擬化技術(shù)介紹

Nova計(jì)算服務(wù)組件通過API服務(wù)器控制虛擬機(jī)管理程序?;陬A(yù)算控制、資源限制、支持特性和所需技術(shù)要求等因素,我們需要選擇一個(gè)最佳的虛擬化技術(shù)。根據(jù)目前OpenStack的發(fā)展情況,大部分Nova計(jì)算服務(wù)組件采用的是KVM和Xen虛擬化技術(shù)。

Nova計(jì)算服務(wù)組件具備一個(gè)抽象層,其允許在部署時(shí)選擇一種虛擬化技術(shù)?,F(xiàn)實(shí)情況是,每種虛擬化技術(shù)的支持和特性是不同的,測(cè)試完整度也不相同,并非全部支持相同的特性。以下從測(cè)試完整度和功能多樣性兩方面詳細(xì)闡述每種虛擬化技術(shù)所支持的特性。

1.測(cè)試特性

1)虛擬化技術(shù)一測(cè)試范圍

● 測(cè)試范圍:

? 單元模塊化測(cè)試。

? 功能性測(cè)試。

● 虛擬化技術(shù)一:QEMU/KVM。

2)虛擬化技術(shù)二測(cè)試范圍

● 測(cè)試范圍:

? 單元模塊化測(cè)試。

? 外部組織進(jìn)行功能性測(cè)試。

● 虛擬化技術(shù)二:

? Hyper-V.

? VMware.

? XenServer.

? 基于Libvirt的Xen。

3)虛擬化技術(shù)三測(cè)試范圍

截至Icehouse版本,該組中的虛擬化技術(shù)已經(jīng)過期,不再更新。這些都沒有經(jīng)過充分的測(cè)試,使用它們存在一定的風(fēng)險(xiǎn)。

● 測(cè)試范圍:

? 單元模塊化不完全測(cè)試。

? 未公開的功能性測(cè)試。

● 虛擬化技術(shù)三:

? Baremetal(裸金屬)。

? Docker(容器技術(shù))。

? 基于Libvirt的LXC。

2.虛擬化技術(shù)支持功能特性

以下基于虛擬化技術(shù)支持特性幫助用戶選擇合適的方案:

● 從OpenStack發(fā)展軌跡觀察,KVM是最通用的虛擬化技術(shù),在社區(qū)中可以找到許多錯(cuò)誤的解決方案。KVM和QEMU支持OpenStack的所有特性。

● 由于Microsoft Hyper-V是免費(fèi)的,因而得到很多支持。VMware ESXi由于部分免費(fèi),也得到一些支持,但是沒有vCenter和企業(yè)級(jí)License,一些API的使用是受限的。

● Xen技術(shù)分類較多,包含以下幾種。

? XenServer:開源,但是有Citrix的商業(yè)支持。

? Xen Cloud Platform(XCP):開源版本,等同于XenServer。XenServer支持的特性,XCP全部支持。

? XenAPI:管理XenServer和XCP的API程序。

? XAPI:XenServer和XCP的主守護(hù)進(jìn)程,與XenAPI直接通信。

? 基于Libvirt的Xen:Xen虛擬化技術(shù)使用Libvirt驅(qū)動(dòng)。

通過XenAPI,Nova計(jì)算服務(wù)組件支持XenServer和XCP兩種虛擬化技術(shù)。但是這并不意味著支持所有基于Xen的平臺(tái),如運(yùn)行SUSE和RHEL的平臺(tái),它們都是基于Libvirt虛擬化層的Xen虛擬化技術(shù)。

● 對(duì)于Baremetal而言,技術(shù)已經(jīng)過期,不再更新,Baremetal驅(qū)動(dòng)也不再更新。新的特性會(huì)被更新到Ironic中,由Ironic代替Baremetal。

下面對(duì)目前主流的兩種虛擬化技術(shù)KVM和Xen進(jìn)行詳細(xì)介紹。

2.2.1 KVM虛擬化技術(shù)

KVM(Kernel-based Virtual Machine)是基于x86硬件虛擬化擴(kuò)展(Intel VT或AMD-V)的全虛擬化解決方案,它包含一個(gè)可加載的內(nèi)核模塊kvm.ko,提供核心的虛擬化基礎(chǔ)架構(gòu),還有一個(gè)處理器特定模塊kvm-intel.ko或kvm-amd.ko。

注意:

全虛擬化解決方案:虛擬機(jī)與底層硬件之間由一個(gè)虛擬化邏輯層Hypervisor來完全模擬底層硬件,上層虛擬機(jī)完全感知不到運(yùn)行在虛擬硬件上。優(yōu)點(diǎn)是虛擬機(jī)操作系統(tǒng)內(nèi)核不需要進(jìn)行特殊配置,部署便捷、靈活、兼容性好。缺點(diǎn)是虛擬機(jī)操作系統(tǒng)的內(nèi)核不能直接管理底層硬件,內(nèi)核通過Hypervisor管理底層硬件,有轉(zhuǎn)換性能開銷。

半虛擬化解決方案:虛擬機(jī)操作系統(tǒng)內(nèi)核需要經(jīng)過修改,與宿主機(jī)操作系統(tǒng)內(nèi)核共享底層硬件實(shí)現(xiàn)。優(yōu)點(diǎn)是半虛擬化的虛擬機(jī)操作系統(tǒng)內(nèi)核能夠直接管理底層硬件,性能表現(xiàn)比全虛擬化技術(shù)更好。缺點(diǎn)是虛擬機(jī)操作系統(tǒng)內(nèi)核需要事先進(jìn)行修改,部署的便捷性、靈活性和兼容性差。

KVM允許在一臺(tái)主機(jī)節(jié)點(diǎn)上運(yùn)行多個(gè)未經(jīng)改動(dòng)的虛擬鏡像,包括Windows和Linux。每臺(tái)虛擬機(jī)都有獨(dú)立的虛擬硬件,包括網(wǎng)卡、磁盤等。

KVM是一個(gè)開源項(xiàng)目,其核心組件包含在Linux更新主線中(從Linux內(nèi)核2.6.20版本開始),用戶空間組件包含在QEMU更新主線中(從QEMU 1.3版本開始)。

KVM是在CPU硬件支持基礎(chǔ)之上的虛擬化技術(shù),同Hyper-V、Xen一樣依賴此項(xiàng)技術(shù)。沒有CPU硬件虛擬化的支持,KVM是無法工作的。

KVM是Linux的一個(gè)模塊,可以用modprobe加載KVM模塊。只有在加載模塊后,才能進(jìn)一步通過其他工具創(chuàng)建虛擬機(jī)。但僅有KVM模塊是遠(yuǎn)遠(yuǎn)不夠的,因?yàn)橛脩魺o法直接控制內(nèi)核模塊去做事情,必須有一個(gè)用戶空間的工具才行,這個(gè)用戶空間的工具就是開源虛擬化軟件QEMU。QEMU也是一個(gè)虛擬化軟件,其特點(diǎn)是可虛擬不同的硬件,比如在x86的CPU上可虛擬一個(gè)安騰的CPU,并可利用它編譯出可運(yùn)行在安騰上的程序。KVM使用了QEMU的一部分,并稍加改造,就變成了可控制KVM的用戶空間工具。仔細(xì)觀察,發(fā)現(xiàn)官方提供的KVM下載有兩大部分三個(gè)文件,分別是KVM模塊、QEMU工具及二者的合集。也就是說,可以只升級(jí)KVM模塊,也可以只升級(jí)QEMU工具。

一個(gè)普通的Linux進(jìn)程有兩種運(yùn)行模式:內(nèi)核模式和用戶模式。但KVM擁有3種模式,分別是內(nèi)核模式、用戶模式和客戶模式。在KVM模型中,每個(gè)虛擬主機(jī)都是由Linux調(diào)度程序管理的標(biāo)準(zhǔn)進(jìn)程,該進(jìn)程調(diào)用KVM用戶模式,執(zhí)行應(yīng)用程序。對(duì)于應(yīng)用程序而言,用戶模式是默認(rèn)模式,當(dāng)需要一些來自內(nèi)核的服務(wù)時(shí)便切換到內(nèi)核模式,如在磁盤上寫入數(shù)據(jù)時(shí)。客戶模式進(jìn)程運(yùn)行在虛擬機(jī)內(nèi),擁有自己的內(nèi)核和用戶空間變量,在客戶模式下可以使用正常的kill和ps命令,KVM虛擬機(jī)表現(xiàn)為一個(gè)正常的進(jìn)程,可以像其他進(jìn)程一樣被殺掉。KVM利用硬件虛擬技術(shù)模擬處理器的形態(tài),虛擬機(jī)的內(nèi)存管理由內(nèi)核直接處理。內(nèi)核模式在需要的時(shí)候,向QEMU進(jìn)程發(fā)送信號(hào)處理大部分的硬件仿真。KVM管理CPU和內(nèi)存的訪問調(diào)用,QEMU仿真硬件資源(如硬盤、網(wǎng)卡、聲卡等)。當(dāng)QEMU單獨(dú)運(yùn)行時(shí),也可以同時(shí)模擬CPU和硬件。

KVM的API是通過/dev/kvm設(shè)備訪問的,/dev/kvm是一個(gè)標(biāo)準(zhǔn)的字符設(shè)備,可以使用常用的open、close、ioctl接口操作,但是在KVM的實(shí)現(xiàn)中,沒有提供read和write接口,所有對(duì)KVM的操作都是通過ioctl接口操作的。KVM提供給上層的API功能可分為3種類型。

(1)system指令:針對(duì)虛擬化系統(tǒng)的全局性參數(shù)進(jìn)行設(shè)置和控制,包括全局性的參數(shù)設(shè)置和虛擬機(jī)創(chuàng)建等工作,主要指令如下表所示。

其中,KVM_CREATE_VM比較重要,用于創(chuàng)建虛擬機(jī),并返回一個(gè)代表該虛擬機(jī)的文件描述符(fd)。新創(chuàng)建的虛擬機(jī)沒有虛擬CPU,也沒有內(nèi)存等資源,需要對(duì)新創(chuàng)建虛擬機(jī)時(shí)返回的文件描述符使用ioctl指令進(jìn)行下一步的配置,生成虛擬CPU和內(nèi)存等資源。

(2)VM指令:針對(duì)虛擬機(jī)進(jìn)行控制,大部分需要針對(duì)從KVM_CREATE_VM中返回的文件描述符(fd)進(jìn)行操作,包括配置內(nèi)存、配置虛擬CPU、運(yùn)行虛擬主機(jī)等,主要指令如下表所示。

續(xù)表

KVM_CREATE_VCPU和KVM_RUN是VM ioctl指令中兩種重要的指令,通過KVM_CREATE_VCPU為虛擬機(jī)創(chuàng)建虛擬CPU,并獲得對(duì)應(yīng)的fd文件描述符后,可以對(duì)其調(diào)用KVM_RUN,以啟動(dòng)該虛擬機(jī)(或稱為調(diào)度虛擬CPU)。

KVM_RUN結(jié)構(gòu)體定義在include/linux/kvm.h中,可以通過該結(jié)構(gòu)體了解KVM的內(nèi)部運(yùn)行狀態(tài)。

(3)VCPU指令:針對(duì)具體的虛擬CPU進(jìn)行參數(shù)設(shè)置,包括寄存器讀/寫、中斷設(shè)置、內(nèi)存設(shè)置、時(shí)鐘管理、調(diào)試開關(guān)等。KVM虛擬機(jī)運(yùn)行時(shí)也可以進(jìn)行相關(guān)設(shè)置。主要指令如下。

● 寄存器控制方面的主要指令如下表所示。

續(xù)表

● 中斷和事件管理方面的主要指令如下表所示。

● 內(nèi)存管理方面的主要指令如下表所示。

● 其他方面的主要指令包括CPUID設(shè)置、調(diào)試接口等。

對(duì)于KVM的操作都是從打開/dev/kvm設(shè)備文件開始的,打開后,會(huì)獲得相應(yīng)的文件描述符(fd),然后通過ioctl系統(tǒng)指令對(duì)該fd進(jìn)行進(jìn)一步的操作,如通過KVM_CREATE_VM指令可以創(chuàng)建一個(gè)虛擬機(jī)并返回虛擬機(jī)對(duì)應(yīng)的文件描述符,接著根據(jù)該描述符來進(jìn)一步控制虛擬機(jī)的行為,如通過KVM_CREATE_VCPU指令來為該虛擬機(jī)創(chuàng)建VCPU。下面通過圖示介紹KVM的初始化過程。

1.加載模塊

加載KVM和SVM或VMX。成功加載后,生成/dev/kvm文件供用戶空間訪問,如下圖所示。

2.調(diào)用/dev/kvm

/dev/kvm既不可讀也不可寫。

/dev/kvm擁有ioctl接口,如下圖所示。

3.調(diào)用kvm ioctl()

調(diào)用KVM_GET_API_VERSION進(jìn)行版本檢查。

調(diào)用KVM_CREATE_VM創(chuàng)建一個(gè)虛擬主機(jī),并返回一個(gè)kvm-vm文件描述符,如下圖所示。

4.調(diào)用kvm和kvm-vm ioctl()

在kvm文件描述符上調(diào)用KVM_CHECK_EXTENSIONS(檢查擴(kuò)展支持情況)。

在kvm-vm文件描述符上調(diào)用KVM_SET_TSS_ADDR(在Intel架構(gòu)中初始化TSS內(nèi)存區(qū)域)設(shè)置TSS地址,如下圖所示。

5.調(diào)用kvm和kvm-vm ioctl()

在kvm文件描述符上調(diào)用KVM_CHECK_EXTENSIONS(檢查擴(kuò)展支持情況)。

在kvm-vm文件描述符上設(shè)置KVM_SET_MEMORY_REGION(修改虛擬CPU的內(nèi)存區(qū)域),如下圖所示。

6.調(diào)用kvm和kvm-vm ioctl()

在kvm文件描述符上調(diào)用KVM_CHECK_EXTENSIONS(檢查擴(kuò)展支持情況)。

在kvm-vm文件描述符上調(diào)用KVM_CREATE_IRQCHIP(創(chuàng)建虛擬APIC并將虛擬CPU關(guān)聯(lián)到APIC)設(shè)置irqchip,如下圖所示。

7.創(chuàng)建虛擬CPU

在kvm文件描述符上調(diào)用KVM_CREATE_VCPU。

執(zhí)行后,返回kvm-vcpu文件描述符,如下圖所示。

KVM/QEMU的內(nèi)存管理非常有趣,因?yàn)镵VM/QEMU運(yùn)行就像Linux系統(tǒng)中的一個(gè)程序運(yùn)行,所以它分配內(nèi)存是調(diào)用malloc()和mmap()函數(shù)進(jìn)行的。當(dāng)一個(gè)虛擬機(jī)申請(qǐng)1GB的物理內(nèi)存時(shí),KVM/QEMU會(huì)執(zhí)行malloc(1<<30)操作,從宿主機(jī)上分配1GB的虛擬地址空間。所以它只調(diào)用malloc()函數(shù),并沒有進(jìn)行實(shí)際的物理內(nèi)存分配;而是當(dāng)虛擬機(jī)第一次啟動(dòng)需要訪問內(nèi)存時(shí),才會(huì)給虛擬機(jī)分配真正的物理內(nèi)存。虛擬機(jī)操作系統(tǒng)啟動(dòng)運(yùn)行,它可以識(shí)別通過malloc()函數(shù)分配的物理內(nèi)存,接下來操作系統(tǒng)Kernel開始訪問已識(shí)別的物理內(nèi)存地址,這時(shí)KVM/QEMU進(jìn)程會(huì)訪問已識(shí)別的第一個(gè)內(nèi)存頁。

KVM/QEMU虛擬機(jī)的任何內(nèi)存變動(dòng)都會(huì)關(guān)聯(lián)底層宿主機(jī)的變化,宿主機(jī)會(huì)確認(rèn)該虛擬機(jī)變化在其整個(gè)內(nèi)存分頁表中是否有效、可用,不允許其訪問任何不屬于它的內(nèi)存頁。此內(nèi)存運(yùn)行訪問機(jī)制有兩種。

● 第一種是影子分頁表技術(shù)。虛擬機(jī)所使用的內(nèi)存分頁表與實(shí)際的內(nèi)存分頁表是獨(dú)立的,不是同一張分頁表。當(dāng)虛擬機(jī)修改自己的內(nèi)存分頁表時(shí),宿主機(jī)會(huì)檢測(cè)到有修改動(dòng)作發(fā)生,然后進(jìn)行確認(rèn),之后才會(huì)修改真正的分區(qū)表,使由虛擬機(jī)發(fā)起的修改操作生效。虛擬機(jī)不能直接訪問真正的內(nèi)存分頁表,而是訪問影子分頁表。這是一種非常普通的虛擬化內(nèi)存技術(shù)。

● 第二種是VMX/AMD-V擴(kuò)展技術(shù)。VMX/AMD-V擴(kuò)展技術(shù)允許底層宿主機(jī)始終監(jiān)控,以此獲得虛擬機(jī)修改真正內(nèi)存分頁表的信息。這種內(nèi)存運(yùn)行訪問機(jī)制實(shí)際且有效,但是它對(duì)性能有一些影響,完成一次訪問最高可能消耗25頁內(nèi)存,代價(jià)非常大。造成這種問題的原因是每次內(nèi)存訪問需要兩次操作才能完成,包括虛擬機(jī)內(nèi)存分頁表訪問和宿主機(jī)內(nèi)存分頁表訪問。當(dāng)然,宿主機(jī)運(yùn)行和維護(hù)影子分頁表也需要消耗大量資源。

AMD和Intel廠商為了解決這些性能損耗問題,開發(fā)了兩種全新的技術(shù)EPT和NPT。這兩種技術(shù)很相似,都使硬件重新識(shí)別架構(gòu),快速地將虛擬機(jī)內(nèi)存變化直接傳遞給宿主機(jī)的物理內(nèi)存,而不用再去訪問宿主機(jī)內(nèi)存分頁表,減少一次操作,效率更高。

但由此帶來的問題就是宿主機(jī)的內(nèi)存分頁表像進(jìn)程隔離一樣會(huì)被強(qiáng)制執(zhí)行,當(dāng)一個(gè)內(nèi)存頁在宿主機(jī)內(nèi)標(biāo)記為沒有被分配時(shí),實(shí)際上該內(nèi)存頁可能已經(jīng)被虛擬機(jī)占有了,所以必須與EPT/NPT共同協(xié)商處理這個(gè)變化。

為了解決該問題,可以在軟件層面通過調(diào)用mmu_notifiers()函數(shù)解決此問題,因?yàn)镵VM/QEMU的內(nèi)存本來就是正常的物理內(nèi)存,Kernel可以像交換、替換和釋放正常的物理內(nèi)存一樣處理這些內(nèi)存頁。

在虛擬機(jī)釋放內(nèi)存頁給宿主機(jī)前,需要等待宿主機(jī)的通知。當(dāng)KVM/QEMU虛擬主機(jī)在影子分頁表或EPT/NPT中刪除該內(nèi)存頁后,宿主機(jī)便可以自由地使用該內(nèi)存頁。

關(guān)于內(nèi)存的申請(qǐng)與回收,可以總結(jié)為以下幾個(gè)步驟。

(1)內(nèi)存申請(qǐng)。

①Q(mào)EMU調(diào)用malloc()函數(shù)為虛擬機(jī)分配虛擬內(nèi)存頁,但是此時(shí)并沒有申請(qǐng)真正的物理內(nèi)存。

②虛擬機(jī)開始訪問該虛擬內(nèi)存頁,并且認(rèn)為該虛擬內(nèi)存頁是真正的物理內(nèi)存頁,但是由于該內(nèi)存頁沒有被真正分配,所以開始向宿主機(jī)申請(qǐng)。

③宿主機(jī)內(nèi)核發(fā)現(xiàn)有一個(gè)內(nèi)存頁錯(cuò)誤,便會(huì)在已經(jīng)被分配的malloc()'d區(qū)域調(diào)用do_page_fault()函數(shù)。如果一切順利,沒有打斷,則宿主機(jī)開始響應(yīng)虛擬機(jī)的操作。

④宿主機(jī)內(nèi)核創(chuàng)建pte_t,使malloc()'d虛擬地址連接到真正的物理內(nèi)存地址,生成rmap,并把它們放到LRU中。

⑤此時(shí),mmu_notifier_change_pte()被調(diào)用,其允許KVM為該內(nèi)存頁創(chuàng)建NPT/EPT。

⑥宿主機(jī)從該錯(cuò)誤的內(nèi)存頁中返回標(biāo)識(shí),虛擬機(jī)得到內(nèi)存后執(zhí)行操作恢復(fù)。

(2)內(nèi)存回收。

①宿主機(jī)內(nèi)核利用rmap結(jié)構(gòu)尋找到需回收的內(nèi)存頁被映射到哪個(gè)VMA(vm_area_struct)。

②宿主機(jī)內(nèi)核查找該VMA所關(guān)聯(lián)的mm_struct,并遍歷宿主機(jī)的內(nèi)存分頁表,查找到該內(nèi)存頁在物理硬件上的位置。

③宿主機(jī)內(nèi)核替換出該內(nèi)存頁并清空pte_t。

④宿主機(jī)內(nèi)核接著調(diào)用mmu_notifier invalidate_page()函數(shù),在NPT/EPT中查找到該頁并刪除。

⑤現(xiàn)在,該頁已經(jīng)被釋放,任何需要該頁的訪問都可以向宿主機(jī)申請(qǐng)(此時(shí),可以轉(zhuǎn)換到內(nèi)存申請(qǐng)的第二步)。

2.2.2 Xen虛擬化技術(shù)

Xen是一種開源的、屬于類型1(裸金屬虛擬化,Baremetal Hypervisor)的虛擬化技術(shù),它使多個(gè)同樣操作系統(tǒng)或不同操作系統(tǒng)的虛擬機(jī)運(yùn)行在同一個(gè)物理主機(jī)節(jié)點(diǎn)上成為可能并實(shí)現(xiàn)。Xen是唯一的屬于類型1(裸金屬虛擬化,Baremetal Hypervisor)并且開源的虛擬化技術(shù),它被作為商業(yè)應(yīng)用或開源應(yīng)用的基礎(chǔ)而加以使用,如服務(wù)器虛擬化、Infrastructure as a Service(IaaS)、桌面虛擬化、安全應(yīng)用、嵌入式和硬件設(shè)備等。由于它性能穩(wěn)定,因而被廣泛用于云計(jì)算生產(chǎn)環(huán)境。

以下是Xen虛擬化技術(shù)的一些關(guān)鍵特性。

● 輕便小型的設(shè)計(jì)(核心代碼有1MB左右)。它使用了微小內(nèi)核設(shè)計(jì),占用極少內(nèi)存,加上有限的接口設(shè)計(jì),使得它比其他虛擬化技術(shù)更健壯、更安全。

● 操作系統(tǒng)無關(guān)性。Domain0一般安裝在Linux操作系統(tǒng)中,也可以使用其他操作系統(tǒng)代替,如NetBSD和OpenSolaris等。

● 驅(qū)動(dòng)分離。Xen虛擬化技術(shù)允許主要的硬件設(shè)備驅(qū)動(dòng)運(yùn)行于虛擬機(jī)內(nèi)部,當(dāng)驅(qū)動(dòng)出現(xiàn)crash(宕機(jī))或者報(bào)錯(cuò)時(shí),包含該驅(qū)動(dòng)的虛擬機(jī)可以重啟,該驅(qū)動(dòng)也可以重啟,這樣不會(huì)影響其他的虛擬機(jī)。

● 半虛擬化技術(shù)。運(yùn)行在半虛擬化技術(shù)上的虛擬機(jī)已經(jīng)經(jīng)過優(yōu)化,它們可以運(yùn)行得更加流暢,比運(yùn)行在需要硬件擴(kuò)展支持的全虛擬化管理程序(HVM)上的虛擬機(jī)更快。當(dāng)然,Xen可以運(yùn)行在不支持硬件擴(kuò)展的硬件平臺(tái)上。

Xen虛擬化技術(shù)架構(gòu)包含3個(gè)關(guān)鍵點(diǎn),掌握這3個(gè)關(guān)鍵點(diǎn)對(duì)于用戶理解和做出正確的選擇至關(guān)重要。

● 類型:Xen虛擬機(jī)技術(shù)支持半虛擬化(Para-Virtualization,PV)和全虛擬化(Hardware-assisted Virtualization,HVM)兩種類型。

● Domain0:Xen虛擬化架構(gòu)中包含一個(gè)特殊的域Domain0,其包括硬件設(shè)備驅(qū)動(dòng)和控制虛擬機(jī)的Toolstack。

● Toolstacks:其涵蓋各種不同的Toolstack。

注意:

類型1(裸金屬虛擬化,Baremetal Hypervisor):該類型的虛擬化技術(shù)直接運(yùn)行在物理主機(jī)節(jié)點(diǎn)硬件設(shè)備上,并且管理虛擬機(jī)操作系統(tǒng),如下圖所示。第一個(gè)此類型的虛擬化技術(shù)是在1960年由IBM發(fā)布的,它包括一個(gè)測(cè)試軟件SIMMON和CP/CMS操作系統(tǒng)(IBM的z/VM操作系統(tǒng)的前身)。目前比較流行的產(chǎn)品或技術(shù)包括Oracle VM Server for SPARC、Oracle VM Server for x86、Citrix XenServer、Microsoft Hyper-V和VMware ESX/ESXi。

類型2(可托管的虛擬化,Hosted Hypervisor):該類型的虛擬化技術(shù)允許運(yùn)行在普通的操作系統(tǒng)上,和普通的計(jì)算機(jī)程序類似,如下圖所示。一個(gè)運(yùn)行的虛擬機(jī)作為一個(gè)進(jìn)程存在于物理主機(jī)節(jié)點(diǎn)的操作系統(tǒng)中。目前比較流行的產(chǎn)品或技術(shù)包括VMware Workstation、VMware Player、VirtualBox和QEMU。

盡管對(duì)虛擬化技術(shù)的架構(gòu)進(jìn)行了分類,并且劃分了類型1和類型2,但是在實(shí)際運(yùn)用和當(dāng)今IT技術(shù)發(fā)展中,它們彼此之間并沒有如此嚴(yán)格的分類。Linux的Kernel-based Virtual Machine(KVM)和FreeBSD的BHyVe是基于內(nèi)核的虛擬化技術(shù),利用該基于內(nèi)核的虛擬化技術(shù)將傳統(tǒng)的操作系統(tǒng)轉(zhuǎn)化成類型1的虛擬化管理程序,與此同時(shí),Linux發(fā)行版和FreeBSD仍然是通用的操作系統(tǒng),與其他應(yīng)用一起競(jìng)相爭(zhēng)奪虛擬機(jī)操作系統(tǒng)可以使用的資源。所以據(jù)此分析,KVM和BHyVe虛擬化技術(shù)屬于類型2的虛擬化技術(shù)架構(gòu)。

1.Xen架構(gòu)

Xen虛擬化管理程序直接運(yùn)行在硬件之上,處理各種CPU、內(nèi)存和中斷請(qǐng)求。在包含虛擬化管理程序的操作系統(tǒng)啟動(dòng)過程中,BootLoader加載完成并退出后,加載的第一個(gè)程序就是Xen,在其上運(yùn)行著虛擬機(jī)。運(yùn)行的虛擬機(jī)叫作Domain(域)或客戶機(jī)(Guest),其中有一個(gè)特殊的Domain叫作Domain0,其包含了所有硬件設(shè)備的驅(qū)動(dòng)。Domain0還包含了控制棧(Toolstack),用于虛擬機(jī)創(chuàng)建、刪除和配置等。下圖是Xen虛擬化管理程序的架構(gòu)。

在Xen架構(gòu)中包含以下幾個(gè)重點(diǎn)。

● Xen虛擬化管理程序是一個(gè)極小的軟件程序,包含大概15萬行代碼。Xen虛擬化管理程序本身沒有I/O功能虛擬化,如網(wǎng)絡(luò)和存儲(chǔ)等。

● 虛擬機(jī)是一個(gè)虛擬化的環(huán)境,每個(gè)虛擬機(jī)都運(yùn)行著自己的操作系統(tǒng)和應(yīng)用程序。Xen支持兩種虛擬化模式:半虛擬化和全虛擬化。在同一個(gè)虛擬化管理程序上可以同時(shí)并行使用這兩種虛擬化模式,也可以串行在全虛擬化模式上使用半虛擬化模式,以此保證半虛擬化和全虛擬化的連續(xù)性。虛擬機(jī)與硬件之間是完全隔離的,它們沒有任何權(quán)限可以訪問底層的硬件和I/O設(shè)備等,因此它們也被叫作DomainU(Unprivileged Domain)。

● Domain0是一個(gè)特殊的虛擬機(jī),其具備特殊的、足夠的權(quán)限直接訪問底層的硬件設(shè)備,處理所有底層的I/O設(shè)備請(qǐng)求,并與其他虛擬機(jī)(DomainU)進(jìn)行交互通信。Domain0對(duì)外部開放一個(gè)接口,使用戶可以控制整個(gè)系統(tǒng)。沒有Domain0,Xen虛擬化管理程序是無法使用的,它是整個(gè)系統(tǒng)啟動(dòng)后加載的第一個(gè)虛擬機(jī)。

● Toolstack包含在Domain0中,也叫作控制棧,其允許用戶管理虛擬機(jī),包括虛擬機(jī)創(chuàng)建、刪除和配置等。

● 終端是Toolstack對(duì)外部開放的一個(gè)接口,用戶可以通過命令行或/和圖形化界面控制整個(gè)系統(tǒng),OpenStack和CloudStack中的編排服務(wù)也被支持。

● Domain0要求一個(gè)支持Xen虛擬化管理程序的內(nèi)核,半虛擬化的虛擬機(jī)(DomainU)要求一個(gè)支持半虛擬化的內(nèi)核。比較新的Linux操作系統(tǒng)都支持Xen虛擬化管理程序,并且也包含支持虛擬化和Toolstack的軟件包。

2.虛擬機(jī)類型

下圖是Xen虛擬化管理程序支持虛擬化模式的變化。

1)半虛擬化(PV)

半虛擬化是由Xen虛擬化管理程序引入的一個(gè)輕量級(jí)、高效的虛擬化模式,之后被其他虛擬化平臺(tái)所采用。半虛擬化不要求物理主機(jī)節(jié)點(diǎn)CPU具備擴(kuò)展特性,但是其需要支持半虛擬化的內(nèi)核和驅(qū)動(dòng),因此,虛擬機(jī)能夠感知到虛擬化管理程序;同時(shí),因?yàn)闆]有硬件仿真,所以運(yùn)行非常高效。支持半虛擬化的內(nèi)核包括Linux、FreeBSD、NetBSD和OpenSolaris。Linux內(nèi)核從2.6.24版本開始,使用Linux pvops framework的內(nèi)核都支持半虛擬化,這也就意味著除了比較老的版本外,幾乎所有的Linux內(nèi)核都支持半虛擬化。下圖是半虛擬化模式在Xen虛擬化管理程序中的性能表現(xiàn)。

2)全虛擬化(HVM)

全虛擬化需要物理主機(jī)節(jié)點(diǎn)CPU擴(kuò)展特性的支持,為此,Intel和AMD廠商提供了Intel VT和AMD-V技術(shù)。Xen虛擬化管理程序使用QEMU仿真硬件設(shè)備,包括BIOS、IDE磁盤控制器、VGA圖形適配器、USB控制器和網(wǎng)絡(luò)適配器等。硬件的擴(kuò)展特性提高了仿真性能。同時(shí),全虛擬化模式下的虛擬機(jī)不再需要特殊內(nèi)核的支持,這也就意味著Windows操作系統(tǒng)在基于Xen全虛擬化的平臺(tái)上也是被支持的。一般情況下,半虛擬化的虛擬機(jī)比全虛擬化的虛擬機(jī)性能表現(xiàn)更好,因?yàn)槿摂M化的虛擬機(jī)需要硬件仿真,會(huì)消耗一部分性能。

在某些情況下,可以使用半虛擬化驅(qū)動(dòng)加速全虛擬化虛擬機(jī)的I/O性能。在Windows虛擬機(jī)中,需要安裝合適的半虛擬化驅(qū)動(dòng)。具體信息可以參照以下鏈接。

● Xen半虛擬化驅(qū)動(dòng)列表:http://xenproject.org/downloads/windows-pv-drivers.html。

● 第三方GPL半虛擬化驅(qū)動(dòng)列表:http://wiki.xensource.com/wiki/Xen_Windows_GplPv。

● Windows半虛擬化驅(qū)動(dòng)列表:http://wiki.xensource.com/wiki/Category:Windows_PV_Drivers。

在Xen虛擬化支持的操作系統(tǒng)中,在選擇全虛擬化模式運(yùn)行操作系統(tǒng)時(shí),其已安裝的半虛擬化或全虛擬化驅(qū)動(dòng)可以自動(dòng)被使用。下圖展示了全虛擬化模式和含有半虛擬化驅(qū)動(dòng)的全虛擬化模式之間的區(qū)別。

3)全虛擬化模式+半虛擬化驅(qū)動(dòng)(PVHVM)

全虛擬化模式下的虛擬機(jī)可以使用指定的半虛擬化驅(qū)動(dòng),以此達(dá)到增強(qiáng)系統(tǒng)性能的目的。這些驅(qū)動(dòng)是為全虛擬化環(huán)境而優(yōu)化的半虛擬化驅(qū)動(dòng),繞過磁盤和網(wǎng)絡(luò)的模擬仿真,從而在全虛擬化模式下獲得更好的性能。這也就意味著在使用一些虛擬機(jī)操作系統(tǒng)時(shí)會(huì)獲得更好的性能,如Windows等。

基于Xen虛擬化管理程序的半虛擬化虛擬機(jī)可以自動(dòng)使用半虛擬化驅(qū)動(dòng),全虛擬化模式下使用的半虛擬化驅(qū)動(dòng)僅適用于全虛擬化模式下的虛擬機(jī)。下圖展示了3種類型的全虛擬化模式之間的區(qū)別。

4)半虛擬化+硬件擴(kuò)展特性(PVH)

Xen虛擬化管理程序4.4版本中包含一種虛擬化模式,叫作基于DomainU的PVH;4.5版本又開發(fā)了一種基于Domain0(Linux和BSD)的PVH虛擬化模式,其實(shí)質(zhì)是半虛擬化的虛擬機(jī)可以使用半虛擬化驅(qū)動(dòng)以提高I/O性能,也可以使用硬件擴(kuò)展特性提高系統(tǒng)性能,不需要硬件仿真。PVH在4.4和4.5版本中作為試驗(yàn)進(jìn)行發(fā)布和測(cè)試使用,性能表現(xiàn)非常好,并且在4.6版本中進(jìn)行了優(yōu)化。從本質(zhì)上講,PVH對(duì)兩種虛擬化模式進(jìn)行了合并,簡(jiǎn)化了Xen虛擬化管理程序的架構(gòu)。

簡(jiǎn)而言之,PVH在Linux和BSD中使用了極少的代碼和接口,從而減少了TCB和攻擊的可能性,降低了風(fēng)險(xiǎn)。一旦對(duì)其進(jìn)行相應(yīng)的優(yōu)化,它將具備更好的性能和更低的延遲,特別是在64位的操作系統(tǒng)上表現(xiàn)更優(yōu)。

PVH要求虛擬機(jī)操作系統(tǒng)對(duì)其提供支持,在配置文件中設(shè)置pvh=1即可啟用PVH支持。下圖展示了全虛擬化、半虛擬化和PVH之間的區(qū)別。

3.Toolstacks、APIs和終端

Xen虛擬化管理程序包含許多不同的Toolstacks,每個(gè)Toolstack對(duì)外開放接口,利用該開放接口可以運(yùn)行各種不同的工具,管理整個(gè)系統(tǒng)。下面介紹一些商業(yè)化產(chǎn)品所使用的Toolstack,以及托管服務(wù)商使用API的案例。

Xen虛擬化管理程序與默認(rèn)的Toolstacks、Libvirt和XAPI相互作用、協(xié)同運(yùn)行。Xen虛擬化管理程序與XAPI配合使用的虛擬化產(chǎn)品是XCP,但是其已經(jīng)逐漸被開源產(chǎn)品XenServer所取代。基于Xen虛擬化管理程序的各種虛擬化模式都具備各自的優(yōu)勢(shì),并且針對(duì)不同的案例進(jìn)行了優(yōu)化,因此對(duì)虛擬化方案的選擇也是見仁見智。下圖中的Default:XL和XAPI/XE由Xen虛擬化管理程序提供。

下面針對(duì)圖形中各種不同的Toolstacks進(jìn)行解釋。

● Default:XL:XL是一個(gè)使用Libxenlight建立的輕量級(jí)CLI Toolstack,其隨著Xen的更新而發(fā)展,在Xen 4.1版本中,XL是默認(rèn)使用的Toolstack。由于Xend已經(jīng)過時(shí),即將從Xen中刪除,所以XL被設(shè)計(jì)為與XM CLI向后兼容,它提供了一個(gè)簡(jiǎn)單的、針對(duì)Xen的命令行接口,用于虛擬機(jī)的創(chuàng)建和管理等。

● XAPI/XE:Xen虛擬化管理程序管理API(XAPI)是XenServer虛擬化產(chǎn)品默認(rèn)使用的Toolstack,有時(shí)在CloudStack中也會(huì)使用。目前,逐漸被廢棄的XCP虛擬化平臺(tái)正嘗試提供一個(gè)基于XAPI的社區(qū)開發(fā)平臺(tái),以開源的形式進(jìn)行,并在正式發(fā)行版中提供該技術(shù)。

● Libvirt/virsh:Libvirt是一個(gè)虛擬化API,用于管理各種虛擬化技術(shù),如Xen、KVM等。Libvirt擁有一個(gè)Libxenlight端口,用于與xm進(jìn)行接口通信。

● Default/Xend:Xend是一個(gè)誕生時(shí)間比較早的Toolstack,一直作為Xen虛擬化管理程序的一部分進(jìn)行更新、發(fā)布和使用。但是自Xen 4.1版本發(fā)布后,Xend開始過時(shí),不再推薦使用;在Xen 4.5版本以后,其已經(jīng)被刪除?,F(xiàn)在推薦使用上述三種Toolstacks。XL被設(shè)計(jì)成一個(gè)與XM CLI兼容的命令行Toolstack,可以將請(qǐng)求發(fā)送給Xend,所以使用XL不失為一種很好的升級(jí)方法。

下表是以上介紹的Toolstack與其CLI命令行的對(duì)應(yīng)關(guān)系。

主站蜘蛛池模板: 泰来县| 全州县| 来凤县| 南木林县| 南岸区| 武平县| 玉田县| 名山县| 丘北县| 聂荣县| 云安县| 海丰县| 贡觉县| 浮梁县| 广昌县| 永顺县| 改则县| 新宾| 镇原县| 浠水县| 沾益县| 天镇县| 共和县| 广河县| 宣威市| 吉木乃县| 宁津县| 宁南县| 焉耆| 陇南市| 阳山县| 昆山市| 开封县| 邻水| 靖远县| 涿鹿县| 申扎县| 阜新市| 虞城县| 阿瓦提县| 饶阳县|