一、計(jì)算虛擬化概述 隨著云計(jì)算的不斷普及,云計(jì)算、虛擬化等名詞逐漸被大眾所熟知,但是兩者的概念卻經(jīng)常會(huì)讓人混淆。云計(jì)算不是一項(xiàng)具體的技術(shù),而是一種資源交付模型,云計(jì)算1.0是以虛擬化為基礎(chǔ),并在此之上進(jìn)一步發(fā)展的。那么虛擬化又是什么呢? 在早期的“煙囪式架構(gòu)”中,軟硬件是耦合的,物理服務(wù)器被一個(gè)操作系統(tǒng)占用,資源利用率非常低。虛擬化技術(shù)出現(xiàn)后,可以通過(guò)Hypervisor在同一物理服務(wù)器上運(yùn)行多個(gè)虛擬機(jī),每個(gè)虛擬機(jī)都是一個(gè)完整的系統(tǒng)。虛擬化技術(shù)將軟硬件解耦,大幅度提高了資源的利用率。 虛擬化中有以下重要概念: Hypervisor(虛擬化管理程序):位于物理機(jī)與虛擬機(jī)之間的“元”操作系統(tǒng),用于創(chuàng)建和執(zhí)行虛擬機(jī)。 Virtual Machine(虛擬機(jī)):在Hypervisor上運(yùn)行的虛擬計(jì)算機(jī),具有分區(qū)、隔離、封裝、獨(dú)立等特點(diǎn)。 Guest OS(客戶(hù)操作系統(tǒng)):運(yùn)行在虛擬機(jī)上的操作系統(tǒng),與普通操作系統(tǒng)相同,不需要進(jìn)行修改即可在虛擬機(jī)上運(yùn)行。 前面提到的虛擬化是針對(duì)于CPU、內(nèi)存、IO設(shè)備等計(jì)算資源,因此稱(chēng)為計(jì)算虛擬化。計(jì)算虛擬化可以將計(jì)算資源池化,而Hypervisor是虛擬化技術(shù)的核心,計(jì)算虛擬化就是通過(guò)Hypervisor向用戶(hù)提供標(biāo)準(zhǔn)的虛擬機(jī)。 二、Hypervisor概述 Hypervisor也稱(chēng)為VMM(Virtual Machine Monitor,虛擬機(jī)監(jiān)視器),是一種運(yùn)行在物理服務(wù)器和虛擬機(jī)系統(tǒng)之間的中間軟件層,可允許多個(gè)虛擬機(jī)共享一套物理基礎(chǔ)設(shè)施。當(dāng)Hypervisor被啟動(dòng)并執(zhí)行時(shí),會(huì)為虛擬機(jī)分配CPU、內(nèi)存、磁盤(pán)、網(wǎng)絡(luò)等硬件資源,并加載虛擬機(jī)的客戶(hù)操作系統(tǒng)。 Hypervisor的架構(gòu)主要分為兩種: 1.裸機(jī)型Hypervisor 裸機(jī)型是指Hypervisor運(yùn)行在物理服務(wù)器上,Guest OS對(duì)硬件的訪問(wèn)必須通過(guò)Hypervisor完成。Hypervisor作為底層硬件的直接操作者,擁有硬件的驅(qū)動(dòng)程序,可以直接管理和調(diào)用硬件資源。 裸機(jī)型代表是ESXi、Xen、Hyper-V以及KVM。 2.宿主型Hypervisor 宿主型是指Hypervisor之下還有一層宿主操作系統(tǒng),Guest OS對(duì)硬件的訪問(wèn)必須經(jīng)過(guò)宿主操作系統(tǒng)。虛擬機(jī)上的應(yīng)用程序調(diào)用硬件資源需要經(jīng)過(guò)多層(VM內(nèi)核→Hypervisor→主機(jī)內(nèi)核),但可以充分利用宿主操作系統(tǒng)提供設(shè)備驅(qū)動(dòng)和底層服務(wù)來(lái)進(jìn)行內(nèi)存管理、進(jìn)程調(diào)度和資源管理等。 宿主型代表是Workstation、Virtual PC、Virtual Server以及GSX Server。 由于宿主型Hypervisor性能較低和開(kāi)源生態(tài)優(yōu)勢(shì)等原因,目前很多廠商都是使用基于裸機(jī)型Hypervisor中KVM架構(gòu)的計(jì)算虛擬化。KVM(Kernel-based Virtual Machine,基于內(nèi)核的虛擬機(jī))是一種基于Linux內(nèi)核的虛擬化開(kāi)源技術(shù),其使用Linux調(diào)度器進(jìn)行管理,因此核心源碼非常少。 KVM運(yùn)行在內(nèi)核空間,屬于Linux內(nèi)核中的一個(gè)模塊,可以提供CPU和內(nèi)存的虛擬化,但還需要一個(gè)運(yùn)行在用戶(hù)空間用于模擬虛擬機(jī)硬件的組件。QEMU是一個(gè)完整的開(kāi)源模擬器軟件,可以作為模擬虛擬機(jī)硬件的用戶(hù)空間工具。 Linux內(nèi)核為內(nèi)核空間的程序,可以直接管理所有物理設(shè)備。Linux系統(tǒng)上的服務(wù)則為用戶(hù)空間的程序,需要使用內(nèi)核的接口提供服務(wù)。 三、Hypervisor的技術(shù)實(shí)現(xiàn) 計(jì)算虛擬化對(duì)物理資源的虛擬可分為CPU虛擬化、內(nèi)存虛擬化和I/O虛擬化,實(shí)現(xiàn)方式可分為全虛擬化、半虛擬化和硬件輔助虛擬化。 1.CPU虛擬化 x86架構(gòu)CPU有四個(gè)特權(quán)級(jí)(Ring0~Ring3),用來(lái)隔離系統(tǒng)軟件和應(yīng)用軟件執(zhí)行的指令。特權(quán)指令是指只能在CPU最高特權(quán)級(jí)(內(nèi)核態(tài))執(zhí)行的指令,而大部分的可讀寫(xiě)關(guān)鍵資源的指令都是特權(quán)指令。如果不在CPU內(nèi)核態(tài)執(zhí)行特權(quán)指令,便會(huì)引發(fā)異常由系統(tǒng)軟件處理非法訪問(wèn)(陷入)。 實(shí)現(xiàn)虛擬化的經(jīng)典方式是使用“特權(quán)解除、陷入模擬”,即將Hypervisor運(yùn)行在最高特權(quán),Guest OS運(yùn)行在非特權(quán)級(jí)。解除Guest OS的特權(quán)級(jí)后,大部分指令仍然可以直接在硬件上運(yùn)行,只有執(zhí)行特權(quán)指令時(shí),才會(huì)陷入到Hypervisor模擬執(zhí)行。 CPU全虛擬化是將Hypervisor運(yùn)行在Ring0,Guest OS運(yùn)行在Ring1。Hypervisor為Guest OS提供CPU模擬,將指令翻譯成真實(shí)的CPU指令,相當(dāng)于Guest OS運(yùn)行在模擬的Ring0上。CPU全虛擬化的虛擬機(jī)具有完全的物理機(jī)特性,Guest OS無(wú)需進(jìn)行修改即可運(yùn)行,兼容性高,但是所有指令都需要經(jīng)過(guò)Hypervisor翻譯,因此性能較差。 CPU半虛擬化是通過(guò)修改Guest OS的代碼,將特權(quán)指令相關(guān)操作轉(zhuǎn)交給Hypercall(超級(jí)調(diào)用),由運(yùn)行在Ring0的Hypervisor處理。CPU半虛擬化的性能要優(yōu)于CPU全虛擬化,但是需要修改Guest OS(Windows不支持修改),依賴(lài)于特定的Hypervisor,因此半虛擬化被很多虛擬化廠商放棄。 CPU硬件輔助虛擬化是通過(guò)引入新的CPU指令和運(yùn)行模式,使Hypervisor和Guest OS運(yùn)行在不同的模式,即Root模式和Non-root模式。這兩個(gè)模式都有Ring0~Ring3特權(quán)級(jí),Hypervisor運(yùn)行在Root模式的Ring0,Guest OS運(yùn)行在Non-root模式的Ring0。CPU硬件輔助虛擬化提升了性能且無(wú)需修改Guest OS,因此成為了發(fā)展趨勢(shì),而KVM就是基于硬件輔助虛擬化Intel-VT和AMD-V技術(shù)。 2.內(nèi)存虛擬化 虛擬內(nèi)存是一種計(jì)算機(jī)系統(tǒng)內(nèi)存管理機(jī)制,可以將物理內(nèi)存抽象化,為應(yīng)用程序提供連續(xù)的虛擬內(nèi)存地址(64位系統(tǒng)地址空間為2^64)。系統(tǒng)將虛擬地址空間和物理地址空間分別劃分為大小相同的頁(yè),并通過(guò)頁(yè)表記錄地址之間的映射關(guān)系,MMU(內(nèi)存管理單元)根據(jù)頁(yè)表完成虛擬地址到物理地址的轉(zhuǎn)換。 在計(jì)算虛擬化中,Hypervisor管理系統(tǒng)的內(nèi)存資源,虛擬機(jī)也有內(nèi)存管理機(jī)制,因此有VA(客戶(hù)機(jī)虛擬地址)、PA(客戶(hù)機(jī)物理地址)、MA(宿主機(jī)機(jī)器地址)三層映射關(guān)系,而內(nèi)存虛擬化需要完成VA到MA的轉(zhuǎn)換。 內(nèi)存全虛擬化是使用SPT(影子頁(yè)表)實(shí)現(xiàn),Hypervisor為Guest OS的每個(gè)頁(yè)表維護(hù)一個(gè)VA到MA映射關(guān)系,并與Guest OS的頁(yè)表保持同步的影子頁(yè)表,Hypervisor通過(guò)影子頁(yè)表直接完成VA到MA的轉(zhuǎn)換。內(nèi)存全虛擬化中的Guest OS無(wú)需感知地址轉(zhuǎn)換,但是影子頁(yè)表需要由Hypervisor維護(hù)并與Guest OS頁(yè)表保持同步,因此性能較差。 內(nèi)存半虛擬化是由Hypervisor截獲Guest OS對(duì)頁(yè)表的寫(xiě)入請(qǐng)求,直接將VA到MA的映射關(guān)系寫(xiě)入到Guest OS的頁(yè)表中,Guest OS根據(jù)修改過(guò)的頁(yè)表直接完成VA到MA的轉(zhuǎn)換。內(nèi)存半虛擬化的性能有較大提升,但是需要修改Guest OS以寫(xiě)入VA到MA的映射關(guān)系。 內(nèi)存硬件輔助虛擬化是由Hypervisor將PA到MA的映射關(guān)系設(shè)置到CPU中,Guest OS修改頁(yè)表無(wú)需Hypervisor的干擾,CPU自動(dòng)查找兩張頁(yè)表完成VA到MA的轉(zhuǎn)換。內(nèi)存硬件輔助虛擬化提升了性能且無(wú)需修改Guest OS,相關(guān)技術(shù)有SLAT(Intel EPT、AMD NPT)。 3.I/O虛擬化 從CPU的角度來(lái)看,外設(shè)是通過(guò)一組I/O資源訪問(wèn)的設(shè)備,因此設(shè)備相關(guān)的虛擬化被稱(chēng)為I/O虛擬化。Hypervisor通過(guò)I/O虛擬化來(lái)復(fù)用有限的設(shè)備資源,包括顯卡、網(wǎng)卡和硬盤(pán)等。 I/O全虛擬化是通過(guò)Hypervisor截取虛擬機(jī)的I/O請(qǐng)求,以軟件的形式模擬虛擬機(jī)I/O設(shè)備。I/O全虛擬化無(wú)需修改Guest OS即可完成I/O操作,但是整個(gè)過(guò)程是通過(guò)軟件模擬,虛擬機(jī)的I/O請(qǐng)求需要與Hypervisor進(jìn)行多次交互,因而開(kāi)銷(xiāo)較大、性能較差。 I/O半虛擬化是由Guest OS提供前端驅(qū)動(dòng),Hypervisor提供后端驅(qū)動(dòng),前端驅(qū)動(dòng)通過(guò)通信機(jī)制,將虛擬機(jī)的I/O請(qǐng)求發(fā)送給Hypervisor的后端驅(qū)動(dòng)處理。I/O半虛擬化需要Guest OS實(shí)現(xiàn)前端驅(qū)動(dòng),后端驅(qū)動(dòng)容易成為瓶頸,但是性能相當(dāng)于I/O全虛擬化有很大提升,相關(guān)技術(shù)有Virtio。 I/O硬件輔助虛擬化是指I/O直通或透?jìng)骷夹g(shù),其原理是將I/O設(shè)備直接分配給虛擬機(jī),使虛擬機(jī)不需要經(jīng)過(guò)Hypervisor,可以直接訪問(wèn)I/O設(shè)備。I/O硬件輔助虛擬化無(wú)需修改Guest OS且性能很好,但是需要硬件的支持,相關(guān)技術(shù)有IOMMU(Intel VT-d、SR-IOV等)。 |
|
來(lái)自: Read_He > 《Hypervisor》