KVM技術

jopen 9年前發布 | 26K 次閱讀 KVM

原文在這里:KVM Technology


在開放服務器虛擬化的應用方面,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和敏感指令

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.

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!