天天看點

帶你讀《KVM實戰:原理、進階與性能調優》之二:KVM原理簡介第2章

點選檢視第一章 點選檢視第三章

第2章

KVM原理簡介

2.1 硬體虛拟化技術

通過第1章的介紹,大家已經知道KVM虛拟化必須依賴于硬體輔助的虛拟化技術,本節就來介紹一下硬體虛拟化技術。

最早的硬體虛拟化技術出現在1972年的大型機IBM System/370 系統上,而真正讓硬體虛拟化技術“走入尋常百姓家”的是2005年年末Intel釋出的VT-x硬體虛拟化技術,以及AMD于2006年釋出的AMD-V。本書中除了特别說明,預設以Intel的硬體虛拟化技術作為代表來介紹。

2.1.1 CPU虛拟化

CPU是計算機系統最核心的子產品,我們的程式執行到最後都是翻譯為機器語言在CPU上執行的。在沒有CPU硬體虛拟化技術之前,通常使用指令的二進制翻譯(binary translation)來實作虛拟客戶機中CPU指令的執行,很早期的VMware就使用這樣的方案,其指令執行的翻譯比較複雜,效率比較低。是以Intel最早釋出的虛拟化技術就是CPU虛拟化方面的,這才為本書的主角—KVM的出現創造了必要的硬體條件。

Intel在處理器級别提供了對虛拟化技術的支援,被稱為VMX(virtual-machine extensions)。有兩種VMX操作模式:VMX 根操作(root operation) 與VMX 非根操作(non-root operation)。作為虛拟機監控器中的KVM就是運作在根操作模式下,而虛拟機客戶機的整個軟體棧(包括作業系統和應用程式)則運作在非根操作模式下。進入VMX非根操作模式被稱為“VM Entry”;從非根操作模式退出,被稱為“VM Exit”。

VMX的根操作模式與非VMX模式下最初的處理器執行模式基本一樣,隻是它現在支援了新的VMX相關的指令集以及一些對相關控制寄存器的操作。VMX的非根操作模式是一個相對受限的執行環境,為了适應虛拟化而專門做了一定的修改;在客戶機中執行的一些特殊的敏感指令或者一些異常會觸發“VM Exit”退到虛拟機監控器中,進而運作在VMX根模式。正是這樣的限制,讓虛拟機監控器保持了對處理器資源的控制。

一個虛拟機監控器軟體的最基礎的運作生命周期及其與客戶機的互動如圖2-1所示。

帶你讀《KVM實戰:原理、進階與性能調優》之二:KVM原理簡介第2章

軟體通過執行VMXON指令進入VMX操作模式下;在VMX模式下通過VMLAUNCH 和VMRESUME指令進入客戶機執行模式,即VMX非根模式;當在非根模式下觸發VM Exit時,處理器執行控制權再次回到主控端的虛拟機監控器上;最後虛拟機監控可以執行VMXOFF指令退出VMX執行模式。

邏輯處理器在根模式和非根模式之間的切換通過一個叫作VMCS(virtual-machine control data structure)的資料結構來控制;而VMCS的通路是通過VMCS指針來操作的。VMCS指針是一個指向VMCS結構的64位的位址,使用VMPTRST和VMPTRLD指令對VMCS指針進行讀寫,使用MREAD、VMWRITE和VMCLEAR等指令對VMCS實作配置。

對于一個邏輯處理器,它可以維護多個VMCS資料結構,但是在任何時刻隻有一個VMCS在目前真正生效。多個VMCS之間也是可以互相切換的,VMPTRLD指令就讓某個VMCS在目前生效,而其他VMCS就自然成為不是目前生效的。一個虛拟機監控器會為一個虛拟客戶機上的每一個邏輯處理器維護一個VMCS資料結構。

根據Intel的官方文檔,我們這裡列舉部分在非根模式下會導緻“VM Exit”的敏感指令和一些異常供讀者朋友參考,這對于了解KVM的執行機制是必要的,因為KVM也必須按照CPU的硬體規範來實作虛拟化軟體邏輯。

1)一定會導緻VM Exit的指令:CPUID、GETSEC、INVD、XSETBV等,以及VMX 模式引入的INVEPT、INVVPID、VMCALL、VMCLEAR、VMLAUNCH、VMPTRLD、VMPTRST、VMRESUME、VMXOFF、VMXON等。

2)在一定的設定條件下會導緻VM Exit的指令:CLTS、HLT、IN、OUT、INVLPG、INVPCID、LGDT、LMSW、MONITOR、MOV from CR3、MOV to CR3、MWAIT、MWAIT、RDMSR、RWMSR、VMREAD、VMWRITE、RDRAND、RDTSC、XSAVES、XRSTORS等。如在處理器的虛拟機執行控制寄存器中的“HLT exiting”比特位被置為1時,HLT的執行就會導緻VM Exit。

3)可能會導緻VM Exit的事件:一些異常、三次故障(Triple fault)、外部中斷、不可屏蔽中斷(NMI)、INIT信号、系統管理中斷(SMI)等。如在虛拟機執行控制寄存器中的“NMI exiting”比特位被置為1時,不可屏蔽中斷就會導緻VM Exit。

最後提一下,由于發生一次VM Exit的代價是比較高的(可能會消耗成百上千個CPU執行周期,而平時很多指令是幾個CPU執行周期就能完成),是以對于VM Exit的分析是虛拟化中性能分析和調優的一個關鍵點。

2.1.2 記憶體虛拟化

記憶體虛拟化的目的是給虛拟客戶機作業系統提供一個從0位址開始的連續實體記憶體空間,同時在多個客戶機之間實作隔離和排程。在虛拟化環境中,記憶體位址的通路會主要涉及以下4個基礎概念,圖2-2形象地展示了虛拟化環境中記憶體位址。

帶你讀《KVM實戰:原理、進階與性能調優》之二:KVM原理簡介第2章

1)客戶機虛拟位址,GVA(Guest Virtual Address)

2)客戶機實體位址,GPA(Guest Physical Address)

3)主控端虛拟位址,HVA(Host Virtual Address)

4)主控端實體位址,HPA(Host Physical Address)

記憶體虛拟化就是要将客戶機虛拟位址(GVA)轉化為最終能夠通路的主控端上的實體位址(HPA)。對于客戶機作業系統而言,它不感覺記憶體虛拟化的存在,在程式通路客戶機中虛拟位址時,通過CR3寄存器可以将其轉化為實體位址,但是在虛拟化環境中這個實體位址隻是客戶機的實體位址,還不是真實記憶體硬體上的實體位址。是以,虛拟機監控器就需要維護從客戶機虛拟位址到主控端實體位址之間的一個映射關系,在沒有硬體提供的記憶體虛拟化之前,這個維護映射關系的頁表叫作影子頁表(Shadow Page Table)。記憶體的通路和更新通常是非常頻繁的,要維護影子頁表中對應關系會非常複雜,開銷也較大。同時需要為每一個客戶機都維護一份影子頁表,當客戶機數量較多時,其影子頁表占用的記憶體較大也會是一個問題。

Intel CPU 在硬體設計上就引入了EPT(Extended Page Tables,擴充頁表),進而将客戶機虛拟位址到主控端實體位址的轉換通過硬體來實作。當然,這個轉換是通過兩個步驟來實作的,如圖2-3所示。首先,通過客戶機CR3寄存器将客戶機虛拟位址轉化為客戶機實體位址,然後通過查詢EPT來實作客戶機實體位址到主控端實體位址的轉化。EPT的控制權在虛拟機監控器中,隻有當CPU工作在非根模式時才參與記憶體位址的轉換。使用EPT後,客戶機在讀寫CR3和執行INVLPG指令時不會導緻VM Exit,而且客戶頁表結構自身導緻的頁故障也不會導緻VM Exit。是以通過引入硬體上EPT的支援,簡化了記憶體虛拟化的實作複雜度,同時也提高了記憶體位址轉換的效率。

帶你讀《KVM實戰:原理、進階與性能調優》之二:KVM原理簡介第2章

除了EPT,Intel在記憶體虛拟化效率方面還引入了VPID(Virtual-processor identifier)特性,在硬體級對TLB資源管理進行了優化。在沒有VPID之前,不同客戶機的邏輯CPU在切換執行時需要重新整理TLB,而TLB的重新整理會讓記憶體通路的效率下降。VPID技術通過在硬體上為TLB增加一個标志,可以識别不同的虛拟處理器的位址空間,是以系統可以區分虛拟機監控器和不同虛拟機上不同處理器的TLB,在邏輯CPU切換執行時就不會重新整理TLB,而隻需要使用對應的TLB即可。VPID的示意圖如圖2-4所示。當CPU運作在非根模式下,且虛拟機執行控制寄存器的“enable VPID”比特位被置為1時,目前的VPID的值是VMCS中的VPID執行控制域的值,其值是非0的。VPID的值在3種情況下為0,第1種是在非虛拟化環境中執行時,第2種是在根模式下執行時,第3種情況是在非根模式下執行但“enable VPID”控制位被置0時。

帶你讀《KVM實戰:原理、進階與性能調優》之二:KVM原理簡介第2章

2.1.3 I/O虛拟化

在虛拟化的架構下,虛拟機監控器必須支援來自客戶機的I/O請求。通常情況下有以下4種I/O虛拟化方式。

1)裝置模拟:在虛拟機監控器中模拟一個傳統的I/O裝置的特性,比如在QEMU中模拟一個Intel的千兆網卡或者一個IDE硬碟驅動器,在客戶機中就暴露為對應的硬體裝置。客戶機中的I/O請求都由虛拟機監控器捕獲并模拟執行後傳回給客戶機。

2)前後端驅動接口:在虛拟機監控器與客戶機之間定義一種全新的适合于虛拟化環境的互動接口,比如常見的virtio協定就是在客戶機中暴露為virtio-net、virtio-blk等網絡和磁盤裝置,在QEMU中實作相應的virtio後端驅動。

3)裝置直接配置設定:将一個實體裝置,如一個網卡或硬碟驅動器直接配置設定給客戶機使用,這種情況下I/O請求的鍊路中很少需要或基本不需要虛拟機監控器的參與,是以性能很好。

4)裝置共享配置設定:其實是裝置直接配置設定方式的一個擴充。在這種模式下,一個(具有特定特性的)實體裝置可以支援多個虛拟機功能接口,可以将虛拟功能接口獨立地配置設定給不同的客戶機使用。如SR-IOV就是這種方式的一個标準協定。

表2-1展示了這4種I/O虛拟化方式的優缺點,給讀者一個概括性的認識。在這4種方式中,前兩種都是純軟體的實作,後兩種都需要特定硬體特性的支援。

帶你讀《KVM實戰:原理、進階與性能調優》之二:KVM原理簡介第2章

裝置直接配置設定在Intel平台上就是VT-d(Virtualization Technology For Directed I/O)特性,一般在系統BIOS中可以看到相關的參數設定。Intel VT-d為虛拟機監控器提供了幾個重要的能力:I/O裝置配置設定、DMA重定向、中斷重定向、中斷投遞等。圖2-5描述了在VT-d硬體特性的幫助下實作的裝置直接配置設定的架構,并與最傳統的、通過軟體模拟裝置的I/O裝置虛拟化進行了對比。

帶你讀《KVM實戰:原理、進階與性能調優》之二:KVM原理簡介第2章

盡管VT-d特性支援的裝置直接配置設定方式性能可以接近實體裝置在非虛拟化環境中的性能極限,但是它有一個缺點:單個裝置隻能配置設定給一個客戶機,而在虛拟化環境下一個主控端上往往運作着多個客戶機,很難保證每個客戶機都能得到一個直接配置設定的裝置。為了克服這個缺點,裝置共享配置設定硬體技術就應運而生,其中SR-IOV(Single Root I/O Virtualization and Sharing)就是這樣的一個标準。實作了SR-IOV規範的裝置,有一個功能完整的PCI-e裝置成為實體功能(Physical Function,PF)。在使能了SR-IOV之後,PF就會派生出若幹個虛拟功能(Virtual Function,VF)。VF看起來依然是一個PCI-e裝置,它擁有最小化的資源配置,有用獨立的資源,可以作為獨立的裝置直接配置設定給客戶機使用。Intel的很多進階網卡如82599系列網卡就支援SR-IOV特性,一個85299網卡PF就即可配置出多達63個VF,基本可滿足單個主控端上的客戶機配置設定使用。當然,SR-IOV這種特性可以看作VT-d的一個特殊例子,是以SR-IOV除了裝置本身要支援該特性,同時也需要硬體平台打開VT-d特性支援。圖2-6展示了一個Intel以太網卡支援SR-IOV的硬體基礎架構。

帶你讀《KVM實戰:原理、進階與性能調優》之二:KVM原理簡介第2章

2.1.4 Intel虛拟化技術發展

虛拟化技術從最初的純軟體的虛拟化技術,逐漸發展到硬體虛拟化技術的支援,時至今日硬體虛拟化技術已比較成熟。前面3小節已經分别就各種硬體虛拟化技術進行了介紹,這裡以Intel平台為例,再對其做一個小結。

Intel硬體虛拟化技術大緻分為如下3個類别(這個順序也基本上是相應技術出現的時間先後順序)。

1)VT-x技術:是指Intel處理器中進行的一些虛拟化技術支援,包括CPU中引入的最基礎的VMX技術,使得KVM等硬體虛拟化基礎的出現成為可能。同時也包括記憶體虛拟化的硬體支援EPT、VPID等技術。

2)VT-d技術:是指Intel的晶片組的虛拟化技術支援,通過Intel IOMMU可以實作對裝置直接配置設定的支援。

3)VT-c技術:是指Intel的I/O裝置相關的虛拟化技術支援,主要包含兩個技術:一個是借助虛拟機裝置隊列(VMDq)最大限度提高 I/O 吞吐率,VMDq由Intel網卡中的專用硬體來完成;另一個是借助虛拟機直接互連(VMDc)大幅提升虛拟化性能,VMDc主要就是基于SR-IOV标準将單個Intel網卡産生多個VF裝置,用來直接配置設定給客戶機。

圖2-7展示了Intel的硬體虛拟化技術的發展線路圖,從中我們可以看到從2005年開始支援VT-x硬體虛拟化,到現在較多的SR-IOV等VT-d的虛拟化技術,硬體虛拟化技術家族有了越來越多的成員,技術特性也逐漸完善。如何在具體業務的生産環境中充分利用硬體虛拟化技術帶來的技術紅利,建構高性能、可擴充、易維護的虛拟化環境,可能是大家學習虛拟化的一個主要目标。通過本書,希望大家也能夠了解一些實踐經驗和受到一些啟發。

帶你讀《KVM實戰:原理、進階與性能調優》之二:KVM原理簡介第2章

2.2 KVM架構概述

上一節介紹了CPU、記憶體、I/O等硬體虛拟化技術。KVM就是在硬體輔助虛拟化技術之上建構起來的虛拟機監控器。當然,并非要所有這些硬體虛拟化都支援才能運作KVM虛拟化,KVM對硬體最低的依賴是CPU的硬體虛拟化支援,比如:Intel的VT技術和AMD的AMD-V技術,而其他的記憶體和I/O的硬體虛拟化支援,會讓整個KVM虛拟化下的性能得到更多的提升。

KVM虛拟化的核心主要由以下兩個子產品組成:

1)KVM核心子產品,它屬于标準Linux核心的一部分,是一個專門提供虛拟化功能的子產品,主要負責CPU和記憶體的虛拟化,包括:客戶機的建立、虛拟記憶體的配置設定、CPU執行模式的切換、vCPU寄存器的通路、vCPU的執行。

2)QEMU使用者态工具,它是一個普通的Linux程序,為客戶機提供裝置模拟的功能,包括模拟BIOS、PCI/PCIE總線、磁盤、網卡、顯示卡、聲霸卡、鍵盤、滑鼠等。同時它通過ioctl系統調用與核心态的KVM子產品進行互動。

KVM是在硬體虛拟化支援下的完全虛拟化技術,是以它能支援在相應硬體上能運作的幾乎所有的作業系統,如:Linux、Windows、FreeBSD、MacOS等。KVM的基礎架構如圖2-8所示。在KVM虛拟化架構下,每個客戶機就是一個QEMU程序,在一個主控端上有多少個虛拟機就會有多少個QEMU程序;客戶機中的每一個虛拟CPU對應QEMU程序中的一個執行線程;一個主控端中隻有一個KVM核心子產品,所有客戶機都與這個核心子產品進行互動。

帶你讀《KVM實戰:原理、進階與性能調優》之二:KVM原理簡介第2章

2.3 KVM核心子產品

KVM核心子產品是标準Linux核心的一部分,由于KVM的存在讓Linux本身就變成了一個Hypervisor,可以原生地支援虛拟化功能。目前,KVM支援多種處理器平台,它支援最常見的以Intel和AMD為代表的x86和x86_64平台,也支援PowerPC、S/390、ARM等非x86架構的平台。

KVM子產品是KVM虛拟化的核心子產品,它在核心中由兩部分組成:一個是處理器架構無關的部分,用lsmod指令中可以看到,叫作kvm子產品;另一個是處理器架構相關的部分,在Intel平台上就是kvm_intel這個核心子產品。KVM的主要功能是初始化CPU硬體,打開虛拟化模式,然後将虛拟客戶機運作在虛拟機模式下,并對虛拟客戶機的運作提供一定的支援。

KVM僅支援硬體輔助的虛拟化,是以打開并初始化系統硬體以支援虛拟機的運作,是KVM子產品的職責所在。以KVM在Intel公司的CPU上運作為例,在被核心加載的時候,KVM子產品會先初始化内部的資料結構;做好準備之後,KVM子產品檢測系統目前的CPU,然後打開CPU控制寄存器CR4中的虛拟化模式開關,并通過執行VMXON指令将宿主作業系統(包括KVM子產品本身)置于CPU執行模式的虛拟化模式中的根模式;最後,KVM子產品建立特殊裝置檔案 /dev/kvm 并等待來自使用者空間的指令。接下來,虛拟機的建立和運作将是一個使用者空間的應用程式(QEMU)和KVM子產品互相配合的過程。

/dev/kvm 這個裝置可以被當作一個标準的字元裝置,KVM子產品與使用者空間QEMU的通信接口主要是一系列針對這個特殊裝置檔案的loctl調用。當然,每個虛拟客戶機針對/dev/kvm檔案的最重要的loctl調用就是“建立虛拟機”。在這裡,“建立虛拟機”可以了解成KVM為了某個特定的虛拟客戶機(使用者空間程式建立并初始化)建立對應的核心資料結構。同時,KVM還會傳回一個檔案句柄來代表所建立的虛拟機。針對該檔案句柄的loctl調用可以對虛拟機做相應的管理,比如建立使用者空間虛拟位址和客戶機實體位址及真實記憶體實體位址的映射關系,再比如建立多個可供運作的虛拟處理器(vCPU)。同樣,KVM子產品會為每一個建立出來的虛拟處理器生成對應的檔案句柄,對虛拟處理器相應的檔案句柄進行相應的loctl調用,就可以對虛拟處理器進行管理。

針對虛拟處理器的最重要的loctl調用就是“執行虛拟處理器”。通過它,使用者空間準備好的虛拟機在KVM子產品的支援下,被置于虛拟化模式中的非根模式下,開始執行二進制指令。在非根模式下,所有敏感的二進制指令都會被處理器捕捉到,處理器在儲存現場之後自動切換到根模式,由KVM決定如何進一步處理(要麼由KVM子產品直接處理,要麼傳回使用者空間交由使用者空間程式處理)。

除了處理器的虛拟化,記憶體虛拟化也是由KVM子產品實作的,包括前面提到的使用硬體提供的EPT特性,通過兩級轉換實作客戶機虛拟位址到主控端實體位址之間的轉換。

處理器對裝置的通路主要是通過I/O指令和MMIO,其中I/O指令會被處理器直接截獲,MMIO會通過配置記憶體虛拟化來捕捉。但是,外設的模拟一般不由KVM子產品負責。一般來說,隻有對性能要求比較高的虛拟裝置才會由KVM核心子產品來直接負責,比如虛拟中斷控制器和虛拟時鐘,這樣可以大量減少處理器模式切換的開銷。而大部分的輸入輸出裝置交給下一節将要介紹的使用者态程式QEMU來負責。

2.4 QEMU使用者态裝置模拟

QEMU原本就是一個著名的開源虛拟機軟體項目,而不是KVM虛拟化軟體的一部分。與KVM不同,QEMU最初實作的虛拟機是一個純軟體的實作,通過二進制翻譯來實作虛拟化客戶機中的CPU指令模拟,是以性能比較低。但是,其優點是跨平台,QEMU支援在Linux、Windows、FreeBSD、Solaris、MacOS等多種作業系統上運作,能支援在QEMU本身編譯運作的平台上就實作虛拟機的功能,甚至可以支援客戶機與主控端并不是同一個架構(比如在x86平台上運作ARM客戶機)。作為一個存在已久的虛拟機監控器軟體,QEMU的代碼中有完整的虛拟機實作,包括處理器虛拟化、記憶體虛拟化,以及KVM也會用到的虛拟裝置模拟(比如網卡、顯示卡、存儲控制器和硬碟等)。

除了二進制翻譯的方式,QEMU也能與基于硬體虛拟化的Xen、KVM結合,為它們提供客戶機的裝置模拟。通過與KVM的密切結合,讓虛拟化的性能提升得非常高,在真實的企業級虛拟化場景中發揮重要作用,是以我們通常提及KVM虛拟化時就會說“QEMU/KVM”這樣的軟體棧。

最早期的KVM開發者們為了簡化軟體架構和代碼重用,根據KVM特性在QEMU的基礎上進行了修改(當然這部分修改已經合并回QEMU的主幹代碼,故現在的QEMU已原生支援KVM虛拟化特性)。從圖2-8可以看出,每一個虛拟客戶機在主控端中就展現為一個QEMU程序,而客戶機的每一個虛拟CPU就是一個QEMU線程。虛拟機運作期間,QEMU會通過KVM子產品提供的系統調用進入核心,由KVM 子產品負責将虛拟機置于處理器的特殊模式下運作。遇到虛拟機進行I/O操作時,KVM子產品會從上次的系統調用出口處傳回QEMU,由QEMU來負責解析和模拟這些裝置。

從QEMU角度來看,也可以說QEMU使用了KVM子產品的虛拟化功能,為自己的虛拟機提供硬體虛拟化的加速,進而極大地提高了虛拟機的性能。除此之外,虛拟機的配置和建立,虛拟機運作依賴的虛拟裝置,虛拟機運作時的使用者操作環境和互動,以及一些針對虛拟機的特殊技術(如:動态遷移),都是由QEMU自己實作的。

QEMU除了提供完全模拟的裝置(如:e1000網卡、IDE磁盤等)以外,還支援virtio協定的裝置模拟。virtio是一個溝通客戶機前端裝置與主控端上裝置後端模拟的比較高性能的協定,在前端客戶機中需要安裝相應的virtio-blk、virtio-scsi、virtio-net等驅動,而QEMU就實作了virtio的虛拟化後端。QEMU還提供了叫作virtio-blk-data-plane的一種高性能的塊裝置I/O方式,它最初在QEMU 1.4版本中被引入。virtio-blk-data-plane與傳統virtio-blk相比,它為每個塊裝置單獨配置設定一個線程用于I/O處理,data-plane線程不需要與原QEMU執行線程同步和競争鎖,而且它使用 ioeventfd/irqfd 機制,同時利用主控端Linux上的AIO(異步I/O)來處理客戶機的I/O請求,使得塊裝置I/O效率進一步提高。

總之,QEMU既是一個功能完整的虛拟機監控器,也在QEMU/KVM的軟體棧中承擔裝置模拟的工作。

2.5 與QEMU/KVM結合的元件

在KVM虛拟化的軟體棧中,毋庸置疑的是KVM核心子產品與QEMU使用者态程式是處于最核心的位置,有了它們就可通過qemu指令行操作實作完整的虛拟機功能,本書中多數的實踐範例正是通過qemu指令行來示範的。然而,在實際的雲計算的虛拟化場景中,為了更高的性能或者管理的友善性,還有很多的軟體可以作為KVM虛拟化實施中的元件,這裡簡單介紹其中的幾個。

1. vhost-net

vhost-net是Linux核心中的一個子產品,它用于替代QEMU中的virtio-net使用者态的virtio網絡的後端實作。使用vhost-net時,還支援網卡的多隊列,整體來說會讓網絡性能得到較大提高。在6.1.6節中對vhost-net有更多的介紹。

2. Open vSwitch

Open vSwitch是一個高品質的、多層虛拟交換機,使用開源Apache2.0許可協定,主要用可移植性強的C語言編寫的。它的目的是讓大規模網絡自動化可以通過程式設計擴充,同時仍然支援标準的管理接口和協定(例如NetFlow、sFlow、SPAN、RSPAN、CLI、LACP、802.1ag)。同時也提供了對 OpenFlow 協定的支援,使用者可以使用任何支援 OpenFlow 協定的控制器對 OVS 進行遠端管理控制。Open vSwitch被設計為支援跨越多個實體伺服器的分布式環境,類似于VMware的vNetwork分布式vswitch或Cisco Nexus 1000 V。Open vSwitch支援多種虛拟化技術,包括Xen/XenServer、KVM和VirtualBox。在KVM虛拟化中,要實作軟體定義網絡(SDN),那麼Open vSwitch是一個非常好的開源選擇。

3. DPDK

DPDK全稱是Data Plane Development Kit,最初是由Intel公司維護的資料平面開發工具集,為Intel x86處理器架構下使用者空間高效的資料包處理提供庫函數和驅動的支援,現在也是一個完全獨立的開源項目,它還支援POWER和ARM處理器架構。不同于Linux系統以通用性設計為目的,它專注于網絡應用中資料包的高性能處理。具體展現在DPDK應用程式是運作在使用者空間上,利用自身提供的資料平面庫來收發資料包,繞過了Linux核心協定棧對資料包處理過程。其優點是:性能高、使用者态開發、出故障後易恢複。在KVM架構中,為了達到非常高的網絡處理能力(特别是小包處理能力),可以選擇DPDK與QEMU中的vhost-user結合起來使用。

4. SPDK

SPDK全稱是Storage Performance Development Kit,它可為編寫高性能、可擴充的、使用者模式的存儲程式提供一系列工具及開發庫。它與DPDK非常類似,其主要特點是:将驅動放到使用者态進而實作零拷貝、用輪詢模式替代傳統的中斷模式、在所有的I/O鍊路上實作無鎖設計,這些設計會使其性能比較高。在KVM中需要非常高的存儲I/O性能時,可以将QEMU與SPDK結合使用。

5. Ceph

Ceph是Linux上一個著名的分布式存儲系統,能夠在維護 POSIX 相容性的同時加入複制和容錯功能。Ceph由儲存管理器(Object storage cluster對象存儲叢集,即OSD守護程序)、叢集螢幕(Ceph Monitor)和中繼資料伺服器(Metadata server cluster,MDS)構成。其中,中繼資料伺服器MDS僅僅在用戶端通過檔案系統方式使用Ceph時才需要。當用戶端通過塊裝置或對象存儲使用Ceph時,可以沒有MDS。Ceph支援3種調用接口:對象存儲,塊存儲,檔案系統挂載。在libvirt和QEMU中都有Ceph的接口,是以Ceph與KVM虛拟化內建是非常容易的。在OpenStack的雲平台解決方案中,Ceph是一個非常常用的存儲後端。

6. libguestfs

libguestfs是用于通路和修改虛拟機的磁盤鏡像的一組工具集合。libguestfs提供了通路和編輯客戶機中的檔案、腳本化修改客戶機中的資訊、監控磁盤使用和空閑的統計資訊、P2V、V2V、建立客戶機、克隆客戶機、備份磁盤内容、格式化磁盤、調整磁盤大小等非常豐富的功能。libguestfs還提供了共享庫,可以在C/C++、Python等程式設計語言中對其進行調用。libguestfs不需要啟動KVM客戶機就可以對磁盤鏡像進行管理,功能強大且非常靈活,是管理KVM磁盤鏡像的首選工具。

2.6 KVM上層管理工具

一個成熟的虛拟化解決方案離不開良好的管理和運維工具,部署、運維、管理的複雜度與靈活性是企業實施虛拟化時重點考慮的問題。KVM目前已經有從libvirt API、virsh指令行工具到OpenStack雲管理平台等一整套管理工具,盡管與老牌虛拟化巨頭VMware提供的商業化虛拟化管理工具相比在功能和易用性上有所差距,但KVM這一整套管理工具都是API化的、開源的,在使用的靈活性以及對其做二次開發的定制化方面仍有一定優勢。根據筆者的實踐經驗,本節給大家概括性地介紹KVM軟體棧中常見的幾個管理運維工具,在第4章将會詳細介紹相關内容。

1. libvirt

libvirt是使用最廣泛的對KVM虛拟化進行管理的工具和應用程式接口,已經是事實上的虛拟化接口标準,本節後部分介紹的其他工具都是基于libvirt的API來實作的。作為通用的虛拟化API,libvirt不但能管理KVM,還能管理VMware、Hyper-V、Xen、VirtualBox等其他虛拟化方案。

2. virsh

virsh是一個常用的管理KVM虛拟化的指令行工具,對于系統管理者在單個主控端上進行運維操作,virsh指令行可能是最佳選擇。virsh是用C語言編寫的一個使用libvirt API 的虛拟化管理工具,其源代碼也是在libvirt這個開源項目中的。

3. virt-manager

virt-manager是專門針對虛拟機的圖形化管理軟體,底層與虛拟化互動的部分仍然是調用libvirt API來操作的。virt-manager除了提供虛拟機生命周期(包括:建立、啟動、停止、打快照、動态遷移等)管理的基本功能,還提供性能和資源使用率的監控,同時内置了VNC和SPICE用戶端,友善圖形化連接配接到虛拟客戶機中。virt-manager在RHEL、CentOS、Fedora等作業系統上是非常流行的虛拟化管理軟體,在管理的機器數量規模較小時,virt-manager是很好的選擇。因其圖形化操作的易用性,成為新手入門學習虛拟化操作的首選管理軟體。

4. OpenStack

OpenStack是一個開源的基礎架構即服務(IaaS)雲計算管理平台,可用于建構共有雲和私有雲服務的基礎設施。OpenStack是目前業界使用最廣泛的功能最強大的雲管理平台,它不僅提供了管理虛拟機的豐富功能,還有非常多其他重要管理功能,如:對象存儲、塊存儲、網絡、鏡像、身份驗證、編排服務、控制台等。OpenStack仍然使用libvirt API來完成對底層虛拟化的管理。

2.7 本章小結

本節主要介紹了KVM虛拟化的基本原理,從硬體到軟體、從底層到上層都做了一些介紹,包括:硬體虛拟化技術簡介、KVM軟體架構概況、KVM核心子產品、QEMU使用者态裝置模拟、與KVM結合的vhost-net等元件、KVM的管理工具等。由于KVM是基于硬體輔助的虛拟化軟體,故在2.1節又分别介紹了CPU虛拟化、記憶體虛拟化、I/O虛拟化以及Intel的虛拟化技術發展情況,以幫助讀者了解虛拟化原理。同時,通過對QEMU/KVM相結合的元件和KVM上層管理工具的介紹,讓讀者在實施KVM虛拟化之前有概括性的認識,對于提高虛拟化的性能和提供工程實施效率都會有所幫助。

繼續閱讀