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

1.2 Linux虛擬化技術(shù)

虛擬化是云計算的基礎(chǔ)。虛擬化使得在一臺物理服務(wù)器上可以運行多臺虛擬機(jī),虛擬機(jī)共享物理機(jī)的CPU、內(nèi)存、I/O硬件資源,但邏輯上虛擬機(jī)之間是相互隔離的。OpenStack作為IaaS云操作系統(tǒng),最主要的服務(wù)就是為用戶提供虛擬機(jī)。在目前 OpenStack 的實際應(yīng)用中,主要使用 KVM 和Xen這兩種Linux虛擬化技術(shù)。這里主要討論Linux虛擬化技術(shù)。

1.2.1 計算機(jī)虛擬化基礎(chǔ)

1.虛擬化體系結(jié)構(gòu)與Hypervisor

虛擬化主要是指通過軟件實現(xiàn)的方案,常見的體系結(jié)構(gòu)如圖1-3所示。這是一個直接在物理主機(jī)上運行虛擬機(jī)管理程序的虛擬化系統(tǒng)。在 x86平臺虛擬化技術(shù)中,這個虛擬機(jī)管理程序通常被稱為虛擬機(jī)監(jiān)控器(Virtual Machine Monitor,VMM),又稱為Hypervisor。它是運行在物理機(jī)和虛擬機(jī)之間的一個軟件層,物理機(jī)被稱為主機(jī)(Host),虛擬機(jī)被稱為客戶機(jī)(Guest),中間軟件層即Hypervisor。

圖1-3 虛擬化體系結(jié)構(gòu)

這里解釋兩個基本概念。

(1)主機(jī)——指物理存在的計算機(jī),又稱宿主計算機(jī)(簡稱宿主機(jī))。當(dāng)虛擬機(jī)嵌套時,運行虛擬機(jī)的虛擬機(jī)也是宿主機(jī),但不是物理機(jī)。主機(jī)操作系統(tǒng)是指宿主計算機(jī)上的操作系統(tǒng),在主機(jī)操作系統(tǒng)上安裝的虛擬機(jī)軟件可以在計算機(jī)上模擬一臺或多臺虛擬機(jī)。

(2)虛擬機(jī)——指在物理計算機(jī)上運行的操作系統(tǒng)中模擬出來的計算機(jī),又稱客戶機(jī),理論上完全等同于實體的物理計算機(jī)。每個虛擬機(jī)都可安裝自己的操作系統(tǒng)或應(yīng)用程序,并連接網(wǎng)絡(luò)。運行在虛擬機(jī)上的操作系統(tǒng)稱為客戶操作系統(tǒng)。

Hypervisor基于主機(jī)的硬件資源給虛擬機(jī)提供了一個虛擬的操作平臺并管理每個虛擬機(jī)的運行,所有虛擬機(jī)獨立運行并共享主機(jī)的所有硬件資源。Hypervisor就是提供虛擬機(jī)硬件模擬的專門軟件,可分為兩類:原生型和宿主型。

(1)原生型(Native)

原生型又稱裸機(jī)型(Bare-metal),Hypervisor作為一個精簡的操作系統(tǒng)(操作系統(tǒng)也是軟件,只不過它是一個比較特殊的軟件)直接運行在硬件之上以控制硬件資源并管理虛擬機(jī)。比較常見的有VMware ESXi、Microsoft Hyper-V等。

(2)宿主型(Hosted)

宿主型又稱托管型,Hypervisor運行在傳統(tǒng)的操作系統(tǒng)上,同樣可模擬出一整套虛擬硬件平臺。比較著名的有VMware Workstation、Oracle Virtual Box等。

從性能角度來看,不論原生型還是宿主型都會有性能損耗,但宿主型比原生型的損耗更大,所以企業(yè)生產(chǎn)環(huán)境中基本使用的是原生型Hypervisor,宿主型的Hypervisor一般用于實驗或測試環(huán)境中。

2.全虛擬化和半虛擬化

根據(jù)虛擬化實現(xiàn)技術(shù)的不同,虛擬化可分為全虛擬化和半虛擬化兩種,其中,全虛擬化產(chǎn)品將是未來虛擬化的主流。

(1)全虛擬化(Full Virtualization)

用全虛擬化模擬出來的虛擬機(jī)中的操作系統(tǒng)是與底層的硬件完全隔離的,虛擬機(jī)中所有的硬件資源都通過虛擬化軟件來模擬。這為虛擬機(jī)提供了完整的虛擬硬件平臺,包括處理器、內(nèi)存和外設(shè),支持運行任何理論上可在真實物理平臺上運行的操作系統(tǒng),為虛擬機(jī)的配置提供了較大程度的靈活性。每臺虛擬機(jī)都有一個完全獨立和安全的運行環(huán)境,虛擬機(jī)中的操作系統(tǒng)也不需要做任何修改,并且易于遷移。在操作全虛擬化的虛擬機(jī)的時候,用戶感覺不到它是一臺虛擬機(jī)。全虛擬化的代表產(chǎn)品有VMware ESXi和KVM。

由于虛擬機(jī)的資源都需要通過虛擬化軟件來模擬,虛擬機(jī)會損失一部分的性能。

(2)半虛擬化(Para Virtualization)

半虛擬化的架構(gòu)與全虛擬化基本相同,需要修改虛擬機(jī)中的操作系統(tǒng)來集成一些虛擬化方面的代碼,以減小虛擬化軟件的負(fù)載。其代表產(chǎn)品有Microsoft Hyper-V和XEN。

半虛擬化模擬出來的虛擬機(jī)整體性能會更好些,因為修改后的虛擬機(jī)操作系統(tǒng)承載了部分虛擬化軟件的工作。不足之處是,由于要修改虛擬機(jī)的操作系統(tǒng),用戶會感知使用的環(huán)境是虛擬化環(huán)境,而且兼容性比較差,用戶使用時也比較麻煩,需要獲得集成虛擬化代碼的操作系統(tǒng)。

1.2.2 OpenStack所支持的虛擬化技術(shù)

在 OpenStack 環(huán)境中,計算服務(wù)通過 API 服務(wù)器來控制虛擬機(jī)管理程序,它具備一個抽象層,可以在部署時選擇一種虛擬化技術(shù)來創(chuàng)建虛擬機(jī),向用戶提供云服務(wù)。OpenStack可用的虛擬化技術(shù)列舉如下。

1.KVM

基于內(nèi)核的虛擬機(jī)(Kernel-based Virtual Machine,KVM)是通用的開放虛擬化技術(shù),也是OpenStack用戶使用較多的虛擬化技術(shù),它支持OpenStack的所有特性。

2.Xen

Xen是部署快速、安全、開源的虛擬化軟件技術(shù),可使多個同樣的操作系統(tǒng)或不同操作系統(tǒng)的虛擬機(jī)運行在同一主機(jī)上。Xen技術(shù)主要包括XenServer(服務(wù)器虛擬化平臺)、Xen Cloud Platform (XCP,云基礎(chǔ)架構(gòu))、XenAPI(管理XenServer和XCP的API程序)、XAPI(XenServer和XCP的主守護(hù)進(jìn)程,可與XenAPI直接通信)、基于Libvirt的Xen。OpenStack通過XenAPI支持XenServer和XCP兩種虛擬化技術(shù)。不過,在RHEL等平臺上,OpenStack使用的是基于Libvirt的Xen。

3.容器

容器是在單一 Linux 主機(jī)上提供多個隔離的 Linux 環(huán)境的操作系統(tǒng)級虛擬化技術(shù)。不像基于虛擬化管理程序的傳統(tǒng)虛擬化技術(shù),容器并不需要運行專用的客戶操作系統(tǒng)。目前的容器有以下兩種技術(shù)。

(1)Linux容器(Linux Container,LXC):提供了在單一可控主機(jī)節(jié)點上支持多個相互隔離的服務(wù)器容器同時執(zhí)行的機(jī)制。

(2)Docker:一個開源的應(yīng)用容器引擎,讓開發(fā)者可以把應(yīng)用以及依賴包打包到一個可移植的容器中,然后發(fā)布到任何流行的Linux平臺上。利用Docker也可以實現(xiàn)虛擬化,容器完全使用沙箱機(jī)制,相互之間不會有任何接口。

Docker 的目的是盡可能減少容器中運行的程序,減少到只運行單個程序,并且通過 Docker來管理這個程序。LXC可以快速兼容所有應(yīng)用程序和工具,以及任意管理和編制層次,來替代虛擬機(jī)。

虛擬化管理程序提供更好的進(jìn)程隔離,呈現(xiàn)一個完全的系統(tǒng)。LXC/Docker除了一些基本隔離,并未提供足夠的虛擬化管理功能,缺乏必要的安全機(jī)制?;谌萜鞯姆桨笩o法運行與主機(jī)內(nèi)核不同的其他內(nèi)核,也無法運行一個完全不同的操作系統(tǒng)。目前 OpenStack 社區(qū)對容器的驅(qū)動支持還不如虛擬化管理程序。在OpenStack項目中,LXC屬于計算服務(wù)項目Nova,通過調(diào)用Libvirt來實現(xiàn);Docker驅(qū)動是一種新加入的虛擬化管理程序的驅(qū)動,目前無法替代虛擬化管理程序。

4.Hyper-V

Hyper-V是微軟推出的企業(yè)級虛擬化解決方案。Hyper-V的設(shè)計借鑒了Xen,管理程序采用微內(nèi)核的架構(gòu),兼顧了安全性和性能的要求。Hyper-V作為一種免費的虛擬化方案,在OpenStack中得到了很多支持。

5.VMware ESXi

VMware提供業(yè)界領(lǐng)先且可靠的服務(wù)器虛擬化平臺和軟件定義計算產(chǎn)品,其中ESXi虛擬化平臺用于創(chuàng)建和運行虛擬機(jī)及虛擬設(shè)備。在OpenStack中它也得到了支持,但是如果沒有vCenter和企業(yè)級許可,一些API的使用會受限。

6.Baremetal與Ironic

有些云平臺除了提供虛擬化和虛擬機(jī)服務(wù),還提供傳統(tǒng)的主機(jī)服務(wù)。在 OpenStack 中可以將Baremetal(裸金屬)與其他部署有虛擬化管理程序的節(jié)點通過不同的計算池(可用區(qū)域,Availabity Zone)一起管理。

Baremetal是計算服務(wù)的后端驅(qū)動,與Libvirt驅(qū)動、XenAPI驅(qū)動、VMware驅(qū)動一樣,只不過它是用來管理沒有虛擬化的硬件,主要通過PXE和IPMI進(jìn)行控制管理。

現(xiàn)在Baremetal已由Ironic所替代,Nova管理的是虛擬機(jī)的生命周期,而Ironic管理的是主機(jī)的生命周期。Ironic提供了一系列管理主機(jī)的API接口,可以對“裸”操作系統(tǒng)的主機(jī)進(jìn)行管理,從主機(jī)上架安裝操作系統(tǒng)到主機(jī)下架維修,可以像管理虛擬機(jī)一樣地管理主機(jī),創(chuàng)建一個Nova計算物理節(jié)點,只需告訴Ironic,然后自動地從鏡像模板中加載操作系統(tǒng)到nova-compute安裝完成即可。Ironic解決主機(jī)的添加、刪除、電源管理、操作系統(tǒng)部署等問題,目標(biāo)是成為主機(jī)管理的成熟解決方案,讓OpenStack不僅可以在軟件層面解決云計算問題,而且供應(yīng)商可以對應(yīng)自己的服務(wù)器開發(fā)Ironic插件。

1.2.3 KVM——基于Linux內(nèi)核的虛擬化解決方案

KVM是一種基于Linux x86硬件平臺的開源全虛擬化解決方案,也是主流的Linux虛擬化解決方案,支持廣泛的客戶機(jī)操作系統(tǒng)。KVM需要CPU的虛擬化指令集的支持,如Intel的Intel VT(vmx指令集)或AMD的AMD-V(svm指令集)。

1.KVM模塊

KVM模塊是一個可加載的內(nèi)核模塊kvm.ko。由于KVM對x86硬件架構(gòu)的依賴,因此KVM還需要一個處理器規(guī)范模塊。如果使用Intel架構(gòu),則加載kvm-intel.ko模塊;使用AMD架構(gòu),則加載kvm-amd.ko模塊。

KVM模塊負(fù)責(zé)對虛擬機(jī)的虛擬CPU和內(nèi)存進(jìn)行管理及調(diào)度,主要任務(wù)是初始化CPU硬件,打開虛擬化模式,然后將虛擬機(jī)運行在虛擬模式下,并對虛擬機(jī)的運行提供一定的支持。

至于虛擬機(jī)的外部設(shè)備交互,如果是真實的物理硬件設(shè)備,則利用Linux系統(tǒng)內(nèi)核來管理;如果是虛擬的外部設(shè)備,則借助于QEMU(Quick Emulator,快速仿真)來處理。

由此可見,KVM本身只關(guān)注虛擬機(jī)的調(diào)度和內(nèi)存管理,是一個輕量級的Hypervisor,很多Linux發(fā)行版集成KVM作為虛擬化解決方案,CentOS也不例外。

2.QEMU

KVM模塊本身無法作為一個Hypervisor模擬出一個完整的虛擬機(jī),而且用戶也不能直接對Linux內(nèi)核進(jìn)行操作,因此需要借助其他軟件來進(jìn)行,QEMU就是KVM所需的這樣一個軟件。

QEMU并非KVM的一部分,而是一個開源的虛擬機(jī)軟件。與KVM不同,作為一個宿主型的Hypervisor,沒有 KVM,QEMU 也可以通過模擬來創(chuàng)建和管理虛擬機(jī),只因為是純軟件實現(xiàn),所以性能較低。QEMU的優(yōu)點是,在支持QEMU編譯運行的平臺上就可以實現(xiàn)虛擬機(jī)的功能,甚至虛擬機(jī)可以與主機(jī)不是同一個架構(gòu)。KVM在QEMU的基礎(chǔ)上進(jìn)行了修改。虛擬機(jī)運行期間,QEMU會通過KVM模塊提供的系統(tǒng)調(diào)用進(jìn)入內(nèi)核,由KVM模塊負(fù)責(zé)將虛擬機(jī)置于處理器的特殊模式運行。遇到虛擬機(jī)進(jìn)行輸入/輸出(I/O)操作(外設(shè)交互),KVM 模塊轉(zhuǎn)交給 QEMU 解析和模擬這些設(shè)備。

QEMU 使用 KVM 模塊的虛擬化功能,為自己的虛擬機(jī)提供硬件虛擬化的加速,從而極大地提高了虛擬機(jī)的性能。除此之外,虛擬機(jī)的配置和創(chuàng)建,虛擬機(jī)運行依賴的虛擬設(shè)備,虛擬機(jī)運行時的用戶操作環(huán)境和交互,以及一些針對虛擬機(jī)的特殊技術(shù)(如動態(tài)遷移),都是由 QEMU 自己實現(xiàn)的。

KVM虛擬機(jī)的創(chuàng)建和運行是一個用戶空間的QEMU程序和內(nèi)核空間的KVM模塊相互配合的過程。KVM模塊作為整個虛擬化環(huán)境的核心工作在系統(tǒng)空間,負(fù)責(zé)CPU和內(nèi)存的調(diào)度。QEMU作為模擬器工作在用戶空間,負(fù)責(zé)虛擬機(jī)I/O模擬。

3.KVM架構(gòu)

從上面的分析來看,KVM作為Hypervisor主要包括兩個重要的組成部分:一個是Linux內(nèi)核的KVM模塊,主要負(fù)責(zé)虛擬機(jī)的創(chuàng)建、虛擬內(nèi)存的分配、VCPU寄存器的讀寫以及VCPU的運行;另一個是提供硬件仿真的 QEMU,用于模擬虛擬機(jī)的用戶空間組件、提供 I/O 設(shè)備模型和訪問外設(shè)的途徑。KVM的基本架構(gòu)如圖1-4所示。

圖1-4 KVM的基本架構(gòu)

在KVM模型中,每一個虛擬機(jī)都是一個由Linux調(diào)度程序管理的標(biāo)準(zhǔn)進(jìn)程,可以在用戶空間啟動客戶機(jī)操作系統(tǒng)。一個普通的Linux進(jìn)程有兩種運行模式:內(nèi)核和用戶,而KVM增加了第三種模式——客戶模式,客戶模式又有自己的內(nèi)核和用戶模式。

當(dāng)新的虛擬機(jī)在KVM上啟動時(通過一個稱為kvm的實用程序),它就成為主機(jī)操作系統(tǒng)的一個進(jìn)程,因此就可以像其他進(jìn)程一樣調(diào)度它。但與傳統(tǒng)的 Linux 進(jìn)程不一樣,客戶端被 Hypervisor標(biāo)識為處于Guest模式(獨立于內(nèi)核和用戶模式)。每個虛擬機(jī)都是通過/dev/kvm設(shè)備映射的,它們擁有自己的虛擬地址空間,該空間映射到主機(jī)內(nèi)核的物理地址空間。如前所述,KVM使用底層硬件的虛擬化支持來提供完整的(原生)虛擬化。I/O 請求通過主機(jī)內(nèi)核映射到在主機(jī)上(Hypervisor)執(zhí)行的QEMU進(jìn)程。

4.KVM虛擬磁盤(鏡像)文件格式

在KVM中往往使用Image(鏡像)這個術(shù)語來表示虛擬磁盤,主要有以下3種文件格式。

(1)raw:原始的格式,它直接將文件系統(tǒng)的存儲單元分配給虛擬機(jī)使用,采取直讀直寫的策略。該格式實現(xiàn)簡單,不支持諸如壓縮、快照、加密和CoW等特性。

(2)qcow2:QEMU引入的鏡像文件格式,也是目前KVM默認(rèn)的格式。qcow2文件存儲數(shù)據(jù)的基本單元是簇(cluster),每一簇由若干個數(shù)據(jù)扇區(qū)組成,每個數(shù)據(jù)扇區(qū)的大小是512字節(jié)。在qcow2中,要定位鏡像文件的簇,需要經(jīng)過兩次地址查詢操作,qcow2根據(jù)實際需要來決定占用空間的大小,而且支持更多的主機(jī)文件系統(tǒng)格式。

(3)qed:qcow2的一種改進(jìn),qed的存儲、定位、查詢方式,以及數(shù)據(jù)塊大小與qcow2一樣,它的目的是為了克服qcow2格式的一些缺點,提高性能,不過目前還不夠成熟。

如果需要使用虛擬機(jī)快照,需要選擇qcow2格式。對于大規(guī)模數(shù)據(jù)的存儲,可以選擇raw格式。qcow2格式只能增加容量,不能減少容量,而raw格式可以實現(xiàn)增加或者減少容量。

1.2.4 Libvirt套件

僅有KVM模塊和QEMU組件是不夠的,為了使KVM整個虛擬化環(huán)境易于管理,還需要Libvirt服務(wù)和基于Libvirt開發(fā)出來的管理工具。

Libvirt是一個軟件集合,是一套為方便管理平臺虛擬化技術(shù)而設(shè)計的開源代碼的應(yīng)用程序接口、守護(hù)進(jìn)程和管理工具。它不僅提供了對虛擬機(jī)的管理,而且提供了對虛擬網(wǎng)絡(luò)和存儲的管理。Libvirt最初是為Xen虛擬化平臺設(shè)計的一套API,目前還支持其他多種虛擬化平臺,如KVM、ESX和QEMU等。在KVM解決方案中,Qemu用來進(jìn)行平臺模擬,面向上層管理和操作;而Libvirt用來管理KVM,面向下層管理和操作。整個Libvirt架構(gòu)如圖1-5所示。

圖1-5 Libvirt架構(gòu)

Libvirt是目前使用廣泛的虛擬機(jī)管理應(yīng)用程序接口,一些常用的虛擬機(jī)管理工具(如virsh)和云計算框架平臺(如OpenStack)都是在底層使用Libvirt的應(yīng)用程序接口。

Libvirt包括兩部分,一部分是服務(wù)(守護(hù)進(jìn)程名為libvirtd),另一部分是API。作為一個運行在主機(jī)上的服務(wù)端守護(hù)進(jìn)程,libvirtd為虛擬化平臺及其虛擬機(jī)提供本地和遠(yuǎn)程的管理功能,基于Libvirt開發(fā)出來的管理工具可通過libvirtd服務(wù)來管理整個虛擬化環(huán)境。也就是說,libvirtd在管理工具和虛擬化平臺之間起到一個橋梁的作用。Libvirt API是一系列標(biāo)準(zhǔn)的庫文件,給多種虛擬化平臺提供一個統(tǒng)一的編程接口,相當(dāng)于管理工具需要基于Libvirt的標(biāo)準(zhǔn)接口來進(jìn)行開發(fā),開發(fā)完成后的工具可支持多種虛擬化平臺。

主站蜘蛛池模板: 海丰县| 抚顺市| 土默特右旗| 大新县| 洞口县| 茂名市| 白朗县| 富顺县| 绍兴县| 临汾市| 盐山县| 汉中市| 当涂县| 宝山区| 黄龙县| 龙江县| 叙永县| 淳安县| 武功县| 崇仁县| 新闻| 湄潭县| 凤城市| 巫溪县| 门头沟区| 江西省| 贺州市| 深州市| 莱州市| 石泉县| 武清区| 濮阳县| 易门县| 屏东市| 治多县| 克什克腾旗| 漳平市| 沙洋县| 全南县| 巴东县| 崇义县|