KVM技术

今天是周六,看到一片KVM相关的文章,感觉写得非常不错。翻译了,原文在这里:KVM Technology


在开放server虚拟化的应用方面,KVM虚拟化技术近年来广受关注。自从2006年10月份诞生以来,其简单的思想激起了Linux内核开发人员们的兴趣,在他们的帮助下,KVM的功能得到迅速扩展。

眼下。KVM得到Red Hat企业版Linux的正式支持。并从版本号6開始受到Fujitsu的支持。这篇论文首先解释KVM的实现机制,接着描写叙述它的各个组件。然后就硬件及软件对KVM虚拟化的支持进行介绍。并简要描写叙述Fujitsu为使KVM得以在关键工作任务中使用所进行的改进计划。

 1. 简单介绍


近年来,因为各种各样的原因。x86系列CPUserver的虚拟化技术受到广泛关注。server虚拟化技术本身已经存在一段时间了,Intel在他们CPU中提供的(Intel VT)1)和AMD在他们CPU中提供的虚拟化(ADM-V)2)使得开发人员们可以在x86硬件上以相对便宜的成本使用虚拟化技术,而且基本能满足性能要求。各种基于软件的server虚拟化技术也相继出现,当中(KVM)3) 以开放源代码软件(OSS)server虚拟化技术的形式迅速走在了前列。

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),作为较通用的server虚拟化软件。它支持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硬件和软件支持的功能


server虚拟化最关注的是性能。理想的情况下。虚拟机的性能不要比物理机性能差。为此。除了上文描写叙述的主要的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中server虚拟化支持的标准功能。同一时候介绍了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.


原文地址:https://www.cnblogs.com/tlnshuju/p/7168643.html