KVM虛擬化技術

今天是週六,看到一片KVM相關的文章,感受寫得很不錯,翻譯了,原文在這裏:KVM Technologylinux

 

在開放服務器虛擬化的應用方面,KVM虛擬化技術近年來廣受關注。自從2006年10月份誕生以來,其簡單的思想激起了Linux內核開發者們的興趣,在他們的幫助下,KVM的功能獲得迅速擴展。目前,KVM獲得Red Hat企業版Linux的正式支持,並從版本6開始受到Fujitsu的支持。這篇論文首先解釋KVM的實現機制,接着描述它的各個組件。而後就硬件及軟件對KVM虛擬化的支持進行介紹,並簡要描述Fujitsu爲使KVM得以在關鍵工做任務中使用所進行的改進計劃。服務器

 

 1. 簡介數據結構

 

近年來,因爲各類各樣的緣由,x86系列CPU服務器的虛擬化技術受到普遍關注。服務器虛擬化技術自己已經存在一段時間了,Intel在他們CPU中提供的(Intel VT)1)和AMD在他們CPU中提供的虛擬化(ADM-V)2)使得開發者們可以在x86硬件上以相對廉價的成本使用虛擬化技術,而且基本能知足性能要求。各類基於軟件的服務器虛擬化技術也相繼出現,其中(KVM)3) 以開放源碼軟件(OSS)服務器虛擬化技術的形式迅速走在了前列。KVM是基於Intel VT-x note1)和AMD-V的設計,使用相對簡單的架構(結構)來得到虛擬化。KVM的基本思想於2006年10月份由Avi Kivity(當時的Qumranet,一家以色列公司)首次公佈。Linux內核開發者們被KVM簡潔的設計所吸引,迅速採納並擴展了它的功能。KVM目前獲得Red Hat企業版Linux的正式支持,並從版本6開始受到Fujitsu的支持。這篇論文描述KVM的簡單機制,並簡要介紹硬件及軟件各層面對KVM的支持,默認以Intel VT-x CPU的功能爲例。
多線程

 

2. KVM機制架構

 

爲使讀者對KVM機制有一個基本的認識,這一節首先介紹Intel VT-x,而後介紹快速模擬器QEMU,它是KVM的一個重要OSS組件。框架

 

2.1 Intel VT-x和敏感指令socket

 

KVM會使用到Intel VT-x的功能,KVM的設計者把KVM看成Linux內核的功能來實現.note2)。接下來是對KVM的一個概覽,以輔助理解KVM。Intel VT-x能夠被看做是一個「檢測到敏感指令執行時切換到hypervisor的功能」,如圖1所示。Hypervisor是物理機上操控VM(客戶機系統)的一個控制程序。敏感指令有兩種定義:函數

1) 「控制敏感指令」試圖修改系統資源狀態。工具

2) 「行爲敏感指令」根據系統資源的狀態進行操做。性能

 

概念上,虛擬機上的程序執行控制敏感指令影響物理機的行爲,虛擬機上的程序執行行爲敏感指令表現爲在虛擬機上執行的效果,和它們在物理機上執行產生不一樣的效果。若是一個程序試圖執行這些指令而不被阻止,將會給hypervisor和客戶機系統帶來嚴重的問題。所以,有必要讓CPU在檢測到一個敏感指令的開始執行並把它轉向到hypervisor,讓hypervisor替代應用程序去執行這個敏感指令。然而,x86 CPU在設計之初並無考慮到虛擬化的需求,因此有一些敏感指令試圖在客戶機系統執行時沒法被CPU檢測到,結果致使了hypervisor沒法代替客戶機系統去執行那些指令。Intel VT-x就是爲應對這個問題而被開發的,它給處理器添加了新的執行模式,在CPU檢測到這些敏感指令時進行模式切換,這樣hypervisor就能夠代替初始的那個程序去執行敏感指令。

具體來講,Intel VT-x添加了兩個執行模式:VMX根操做和VMX非根操做模式,VMX表明了「virtual machine extension」。如圖2所示,VMX非根模式是客戶機系統的執行模式。若是在這個模式下試圖執行敏感指令,CPU發現並切換到VMX根操做模式,即切換到hypervisor所處的執行模式。這個轉換叫「VM Exit」,表示控制權轉移到了hypervisor,使其可以代替客戶機系統去執行敏感指令。

 Intel VT-x引入了兩條新的指令,VMLAUNCH和VMRESUME,使得能夠切換到VMX非根操做模式,叫「VM Entry」。KVM的主要角色就是處理VM退出和執行VM Entry指令。KVM在Linux內核中以一個模塊的形式實現。

 

2.2 KVM和QEMU

 

KVM內核模塊本身沒法建立VM,要建立VM,它必須使用QEMU,QEMU以一個用戶空間進程存在 6)。QEMU本質上是一個硬件模擬器,它做爲一個開放源碼軟件,模擬標準的x86 PC和其它的架構,其存在早於KVM也不依賴KVM來運行。做爲一個基於軟件的模擬器,QEMU逐條地解釋和執行CPU指令,意味着性能受限。然而,若是有三個條件可以知足,QEMU能夠在保持其建立VM功能的同時大大提高其性能。

1) 目標指令能夠直接被CPU執行。

2) 在VMX非根操做模式下,指令能夠不經修改的被CPU直接執行。

3)  不能直接執行的指令可被鑑別並傳遞給QEMU進行模擬處理。

 KVM的開發就是基於這個思想,它使得既能夠建立虛擬機又能最大化的複用已有的開放源碼軟件(OSS),只需作最小量的修改。正是這個緣由,使KVM獲得不少Linux內核開發者的支持。

 

QEMU/KVM的執行流程如圖3所示。首先,KVM內核模塊建立(圖中step 0)一個文件"/dev/kvm",這個文件使得QEMU能夠將各類各樣的請求信息傳遞給內核模塊來執行hypervisor功能。當QEMU啓動執行一個客戶機系統,它反覆地調用ioctl()系統調用,在調用中指定這個文件(或者從這個文件派生的文件描述符)。要開始執行客戶機系統時,QEMU調用ioctl()指示(step 1)KVM內核模塊啓動客戶機系統。KVM內核模塊轉去執行VM Entry(step 2)並執行客戶機系統。以後當客戶機系統欲執行一條敏感指令時,VM Exit被執行(step 3),KVM獲取退出的緣由。若是須要QEMU的干預來執行I/O任務或其它任務,控制轉移到QEMU進程(step 4),而後QEMU執行該任務。執行完畢後,QEMU又一次調用ioctl()系統調用,請求KVM繼續執行客戶機系統(i.e., 執行流程返回到step 1)。這個QEMU/KVM流程在VM的整個模擬過程當中不斷反覆。

 

QEMU/KVM有一個相對簡單的結構

1) KVM內核模塊的實現將Linux內核變成一個hypervisor。

2) 每一個客戶機系統有一個QEMU進程。有多少個客戶機系統在運行,就相應的有多少個QEMU進程在運行。

3) QEMU是一個多線程程序,客戶機系統的每一個虛擬CPU(vCPU)對應一個QEMU線程。圖3中的步驟1-4都在這些線程中進行。

4) 從Linux內核來看,QEMU線程就和普通的用戶進程同樣。對應於客戶機虛擬CPU的線程接受Linux內核調度器的管理,這和其它進程的線程無異。

 

3. KVM組件

 

這一節介紹KVM相關的組件而不是QEMU,並描述KVM的總體結構。QEMU自己經過字符用戶接口(CUI)以一個簡單的同名命令啓動(a simple command of the same name via a character user interface)。若是在客戶機系統運行時執行ps命令,QEMU的運行狀態就會顯示,如例子中所示:

[goto@lifua ~ ]$ ps auxw |grep qemu
qemu  ......  /usr/bin/qemu-kvm -S -M
fedora-13 -enable-kvm -m 1024 -smp 1, sockets=1,
cores=1, threads=1 .....
-drive file=/home/goto/kvm_image/fedora13.img,
..... -device rtl8139, vlan=0, id=net0,
mac=52:54:00:65:03:a0 ......

 

命令項「-m 1024」和「-smp 1」分別表示客戶機系統內存容量和CPU數量。雖然上面的例子中只顯示了實際行數的大概三分之一,但全部QEMU的設置,如設備的設置,都是經過QEMU命令參數的形式傳遞了的。

不出所料,咱們沒有必要在命令中直接指定全部的選項。基於這個緣由,出現了一個叫"virt-manager," 7)的圖形用戶接口(GUI),供用戶管理一個或多個客戶機系統。virt-manager可在Red Hat企業版Linux和其它的一些操做系統中使用。圖4是多個客戶機系統運行時的一個截圖。左上角窗口是virt-manager的屏幕,左下角和右邊窗口是客戶機系統屏幕,表示有兩個客戶機系統在運行。這個截圖顯示的是虛擬機在Fedora發行版上運行的狀況,RHEL6上的狀況會有些不一樣。

 

 

除了這些GUIs,virt-manager還能以CUI的形式("virsh")供用戶操做客戶機系統。KVM的總體結構,從GUI到Linux內核,包括如下五個組件:

1) virt-manager

一個用來管理VM的GUI/CUI用戶接口;它使用libvirt調用VM的各類功能,以後會有描述。

2) libvirt

一個工具及接口t(tool-and-interface)庫 8),做爲較通用的服務器虛擬化軟件,它支持Xen,VMware ESX/GSX,固然,還有QEMU/KVM。

3) QEMU

一個和KVM內核模塊交互的模擬器,處理多種客戶機系統請求如I/O;一個QEMU進程對應一個客戶機系統。

4) KVM內核模塊
從狹義上來講,KVM是一個Linux內核模塊,處理客戶機系統的VM Exits和執行VM Entry指令。

5) Linux內核

既然QEMU做爲一個普通的用戶進程運行,相應客戶機系統的調度就由Linux內核本身來處理。若是咱們對圖3進行修正,使它包含virt-manager和其它的組件,就獲得了KVM的總體構架圖,如圖5所示。全部的組件都是開放源碼軟件(OSS)。

 

4. KVM硬件和軟件支持的功能

 

服務器虛擬化最關注的是性能,理想的狀況下,虛擬機的性能不要比物理機性能差。爲此,除了上文描述的基本的KVM機制,各類不一樣的硬件和軟件支持虛擬化功能爭相出現。最基本的目標就是使用它們來改善KVM的性能。這一節將介紹幾個這樣的功能。

 

1) Extended Page Table(EPT)

EPT擴展了CPU提供的地址轉換機制(MMU: 內存管理單元)。虛擬機包含兩部分結構,一部分是hypervisor,另外一部分是客戶機系統。以往的MMU結構在設計時沒有考慮到虛擬機的需求,不能直接使用。

在EPT以前,須要使用軟件方案進行地址轉換,這種技術叫「影子頁表」。EPT使得虛擬機的「物理地址」由CPU轉換成物理機的物理地址,軟件轉換方案也就不須要了。KVM充分利用了EPT提供的功能,使得虛擬機性能獲得大幅提高。

2) VT-d

VT-d是I/O設備(IOMMU)的地址轉換機制。它爲每種設備功能提供了內存地址轉換表(和MMU頁表的數據結構徹底一致)。有了VT-d,客戶機的內存地址可被指定爲設備數據傳輸的目標地址,數據直接被傳遞到客戶機操做系統。VT-d屬於芯片級功能,須要固件的支持。相應的,若是固件和Linux內核都支持VT-d,後者會識別VT-d功能並使用它。

3) virtio

虛擬機設備一般由QEMU設備模擬功能進行建立和處理。這種模擬的開銷很高,所以I/O性能表現不佳。爲了克服這個問題,引入了一種叫「virtio」的機制。Virtio準備一個緩衝區,該緩衝區可同時被客戶機系統和QEMU訪問。使用這個緩衝區,對多個數據項的I/O處理就能夠同時進行,減小了QEMU模擬的開銷進而或得高速的處理方案。從客戶機系統來看,這種機制就像是訪問一個virtio PCI設備同樣。經過在客戶機系統中實現一個virtio驅動(固然,Windows須要一個virtio驅動),可得到virtio帶來的好處並達到高速I/O的效果。

4) Kernel Samepage Merging(KSM)

同一個物理機上不一樣虛擬機可能在運行一樣的操做系統和應用程序。在這種狀況下,它們頗有可能有些內存區域具備相同的數據。將這些內存區域整合成一個區域將減小內存的使用量。基於這一點,KSM功能 9)被添加到KVM。KSM功能使用一個「ksmd」內核線程按期監控進程內存使用狀況並自動將重複的內存頁合併成一個公共頁。理想的狀況下,全部內存頁都會被拿來比較看是否有重複數據,但持續地比較全部系統進程使用的全部內存頁會極其低效。因爲這個緣由,Linux提供一種機制,便可以經過madvice()系統調用的第三個參數(advice參數)來指定哪一個內存區將被考慮做爲KSM進行合併的對象。QEMU在給客戶機分配內存時使用這個系統函數,用戶就當即享受到KSM的功能。在RHEL6中,這個功能在系統初始化狀態下就是有效的。

 

5. KVM將來的加強

 

咱們的目標就是使得KVM可以在關鍵任務系統和應用領域被使用,但爲改善功能和質量,還有不少地方須要提高。下面介紹的是Fujitsu的幾項開發計劃,目的是提高KVM功能。

1)  libvirt功能性和質量上的提高

相對於KVM內核模塊和QEMU的成熟度,libvirt的功能還遠未完整,這使得KVM的功能沒法被徹底挖掘,並且libvirt尚未達到穩定和質量良好的狀態。所以,提高libvirt的功能性和質量是一個緊迫的開發任務。

2) 資源管理功能的提高

按預期,KVM會和Cgroup 10)整合,Cgroup是RHEL6中引進的一個資源管理功能。當前,Cgroup的功能可用於多種資源的分配,如給一個進程分配某個特定數目的CPU。而後,從控制虛擬機系統的角度來看,KVM和Cgroup的整合仍是有不少問題須要處理,好比對I/O無法進行足夠的控制。所以提高Cgroup功能也是一項計劃。

3) Machine-check support(機器檢查支持)

物理機不可糾正錯誤,如multi-bit錯誤發生的信息要可以被傳遞給客戶機系統。關於這個,一個基本的框架已經被合併到KVM,可是專門針對KVM機器檢查的支持還須要提高,以使客戶機系統能夠進行內存錯誤的恢復。

 

6. 結論

 

這篇論文描述了KVM的基本機制和Red Hat企業版Linux 6中服務器虛擬化支持的標準功能,同時介紹了Fujitsu在開發和提高KVM功能方面的努力。Fujitsu指望這些開發工做使得KVM在將來成爲客戶關鍵任務系統中一個重要的組件。

 

參考


1)    Intel: Virtualization (Intel VT).
http://www.intel.com/technology/virtualization/technology.htm?iid=tech_vt+tech
2)     AMD Virtualization. 
http://sites.amd.com/us/business/it-solutions/virtualization/Pages/virtualization.aspx
3)     Main Page—KVM.
    http://www.linux-kvm.org/page/Main_Page
4)     [PATCH 0/7] KVM: Kernel-based Virtual Machine.
    http://marc.info/?l=linux-kernel&m=116126591619631&w=2
5)     Gerald J. Popek, Robert P. Goldberg: Formal Requirements for Virtualizable Third Generation Architectures, (1974).
    http://portal.acm.org/ft_gateway.cfm?id=361073&type=pdf&CFID=5009197&CFTOKEN=14838199
6)     About—QEMU.
    http://wiki.qemu.org/Main_Page
7)     Virtual Machine Manager.
    http://virt-manager.et.redhat.com/
8)     Libvirt: The virtualization API.
    http://libvirt.org/
9)     [PATCH 0/4] ksm - dynamic page sharing driver for linux.
    http://marc.info/?l=linux-kernel&m=122640987623679&w=2
10)     H. Ishii: Fujitsu’s Activities for Improving Linux as Primary OS for PRIMEQUEST.
   

note 1)    Intel VT is the generic name of Intel’s virtualization support function consisting of Intel VT-x for x86 processors like Core 2 Duo and Intel Xeon, Intel VT-i for Itanium 2, and Intel VT-d supporting I/O virtualization.

note 2)    The advantage of this is that a kernel function can easily support hypervisor operation given the high affinity between the kernel and hypervisor.

相關文章
相關標籤/搜索