发现Linux KVM

时间:2022-09-19 04:19:09

KVM模块实现了内核级别的虚拟机功能,配合以前的qemu虚拟机程序,实现了高速的虚拟计算机。可以说,KVM在vmware 和 xen的鹬蚌相争中,渔翁得利。

linux总是和灵活性、适应性联系在一起,对于虚拟化的选择也不例外。但近来,Linux虚拟化这道风景的一个改变却是引入了内核虚拟机或kvm。KVM是传统的Linux操作系统内核(V2.6.20)的第一个虚拟化方案。KVM支持Linux客户机操作系统的虚拟化,甚至支持有虚拟化硬件基础的Windows。了解Linux KVM的体系结构及其与Linux内核紧密结合的原因也许会改变你使用Linux的方式。

引入

虚拟化是一个存在了较长时间的概念了。简单地说,这就是将某物拿来并将它变成看起来像别的什么东西。将此概念运用到一个计算机系统中就允许不同的用户对单一的系统拥有不同的视图(例如,一个同时运行着Linux和Microsoft Windows的计算机系统),这通常被称为完全虚拟化。

虚拟化还可以表现为另一种更为复杂的形式,在此形式中,单一的计算机以多种体系结构形式出现(对于一个用户来说,它是一个标准的x86平台;对另一个用户来说,这又是一个IBM的Power PC平台)。这种形式的虚拟化通常被称为硬件模拟或硬件仿真。

最后,一种更为简单的虚拟化形式是操作系统的虚拟化,在这种形式中,单台计算机运行着多个相同类型的操作系统。这种虚拟化仅在单一的操作系统上将几个服务器进行分离,这就意味着所有的服务器使用相同类型和版本的操作系统。

虚拟化(Virtualization)和准虚拟化(para-virtualization)

两种最普通的虚拟化方法是完全虚拟化和准虚拟化。

在完全虚拟化中,在虚拟化的操作系统和硬件之间存在着一个可以对访问进行仲裁的层,这一层称为管理程序层(即hypervisor)或虚拟机监督程序(VMM)。准虚拟化与此类似,不过hypervisor管理程序以一种更加协作的方式运作。这是因为每一个客户机都清楚它已被虚拟化,因此每个客户机都要与管理程序合作以完成对底层硬件的虚拟化。

完全虚拟化的例子包括商业化的虚拟化方案VMware,还有商业化的用于IBM zSeries计算机的IBM System z9 Virtual Machine (z/VM)操作系统。准虚拟化由Xen和User-Mode-Linux (UML)提供。KVM也被认为是一种完全虚拟化方案。

虚拟化是怎样工作的?

让我们简单讨论一下虚拟化及相关元素。在虚拟化方案的底部是被虚拟化的机器。这台机器可能支持也可能不直接支持虚拟化,这就需要下一层的支持,即管理程序层(hypervisor或VMM),VMM作为硬件平台和操作系统的抽象层而存在。在有些情况下,这个管理程序层即一个操作系统;如此一来,它就被称为主机操作系统,如图1所示。

在管理程序之上的是客户机操作系统,也称为虚拟机(VMs)。这些VMs是分离的操作系统,它们都认为底层硬件平台是属于它自己的。但实际上,正是管理程序(hypervisor)使它们有了这种“错觉”。

当今,虚拟化方案的一个问题是并非所有的硬件都完全支持虚拟化。较老的X86处理器会对依赖于运行区域的某些指令产生不同的结果。这就产生一个问题,因为管理程序应该在最受保护的区域中执行。正因为如此,虚拟化方案,(如VMware等)会预扫描要执行的代码,从而用转移指令来替换这些指令,以便于管理程序可以正确地处理它们。而支持协作虚拟化方法的Xen则无需修改,因为客户机知道它已被虚拟化和修改。KVM只是简单地忽略这个问题并要求:如果你想要虚拟化,就必须运行在一个新的硬件平台上。

一开始这可能看起来有点儿刻板,不过,考虑到当今那些新一代的支持虚拟化的机器,我们断言,这将成为一个标准而非例外。

KVM 管理程序(hypervisor)

考虑到虚拟化技术的历史进程,KVM可谓新秀。当今存在着许多的开源方法,例如,Xen, Bochs, UML, Linux-VServer, coLinux等,但KVM却倍受瞩目。进一步讲,KVM自身并非一个完全的虚拟化方案,而是一个更宽泛的方案。

KVM所采用的方法是只需通过加载一个内核模块就将Linux内核变成一个hypervisor(管理程序)。这个内核模块导出一个称为/dev/kvm的设备,此设备会启动内核的一个客户机模式(除传统的内核和用户模式之外的)。通过/dev/kvm,一个VM(虚拟机)拥有其自身的地址空间,这个地址空间与内核的地址空间相分离或与任何一个正运行着的VM相分离。设备树(/dev)中的设备对所有的用户空间程序都是公用的。但/dev/kvm与此不同,因为每一个打开它的过程都会看到一个不同的映像(用以支持VM的分离)。

然后KVM简单地将Linux内核变为hypervisor管理程序(在你安装KVM内核时)。因为标准的Linux内核是hypervisor管理程序,它从对标准内核的改变中获益(存储支持、调度程序等等)。对这些Linux部件的优化(如在2.6内核中的新O(1)调度程序)既有利于hypervisor管理程序(主机操作系统)又有利于Linux客户机操作系统。

但KVM并非此道的首创者,很长时间以来UML一直在将Linux内核转换为一个hypervisor管理程序。正因为内核充当了一个hypervisor管理程序,你就可以启动另一个操作系统,如另一个Linux内核或Windows。

KVM

KVM安装后,你可以在用户空间启动客户机操作系统。每一个客户机操作系统是一个主机操作系统(或hypervisor管理程序)的单个过程。图2展示了KVM虚拟化的视图。在底层的是一个支持虚拟化的硬件平台(当前,这也就意味着一个Intel的VT或AMD-SVM处理器)。运行在裸机硬件上的是hypervisor管理程序(KVM模块方式的Linux内核)。这个hypervisor管理程序看起来就像一个普通的可以运行任何其它应用程序的Linux内核。但这个内核还可以支持客户机操作系统,并通过KVM实用程序加载。最后一点,一个客户机操作系统可以支持主机操作系统所支持的相同的应用程序。

KVM是虚拟化方案的一部分。处理器直接提供虚拟化支持(为多个操作系统对处理器虚拟化的能力),存储器通过KVM被虚拟化。最后,I/O通过一个进行简单改进的QEMU过程被虚拟化。KVM引入了一个新的过程模式到Linux的现有内核和用户模式中。这个新的模块称为guest(客户机),正如其名称所暗示的,guest用于执行客户机操作系统代码(或者至少此代码的一部分)。内核模式代表代码执行的特权模式,而用户模式表示非特权模式(对运行于内核之外的程序而言)。客户机模式的存在是为了执行客户机操作系统代码,但仅限于非I/O的代码。在客户机模式内有两个标准的模式,因此一个客户机操作系统运行在客户机模式,但却为其内核和用户空间而支持标准的内核和用户模式。一个客户机操作系统的用户模式的存在是为了执行被独立管理的I/O。

从客户机操作系统执行I/O会拥有QEMU。QEMU是一个平台虚拟化方案,它允许整个PC环境(包括磁盘、显示卡(图形卡)、网络设备)的虚拟化。任何客户机操作系统所发出的I/O请求都被拦截,并被路由到用户模式用以被QEMU过程模拟仿真。

KVM通过/dev/kvm设备提供存储器的虚拟化。当客户机被具象呈现时,每一个客户机操作系统都有其自身的被映射的地址空间。为客户机映射的物理存储器实际上是被虚拟化到过程中的虚拟存储器。维持一组影子页表(shadow page tables)是为了支持从客户机物理地址到主机物理地址的转换。在一个未映射的内存单元被访问时,处理器还通过hypervisor管理程序(主机内核)支持存储器转换过程。

具体展示新客户机

对一个新客户机操作系统的具象呈现由一个称为KVM的实用程序提供。这个实用程序通过KVM模块运作,使用/dev/kvm装载一个客户机,将它与虚拟化磁盘(主机操作系统上的一个正常文件)相关联,然后启动它。

可以通过一组在/dev/kvm设备上的执行的ioctls来支持控制。当一个特定的文件初次打开时,一个与虚拟CPU相关联的新的VM对象就会被创建。接着你就可以使用几个ioctls来创建一个虚拟的CPU,检查KVM版本,创建一个存储器区域,然后启动一个虚拟CPU,显然,需通过使用命令KVM来实现这一点。下面的内容本文将讨论一下KVM命令并展示几个支持的ioctls例子。

使用KVM.

如果的硬件支持的话,使用KVM确实是一件相当简单的事情。需要一个支持虚拟化的处理器:只需要查看/proc/cpuinfo就可以判断系统是否支持虚拟化。这个文件指明了是否支持Intel的vmx或AMD的svm。

下一步,需要一个支持KVM的Linux内核。可以在(设备驱动程序)Device Drivers > (虚拟化)Virtualization中的内核配置中完成。还要启用处理器的环境支持。同样,也必须有一个KVM和gemu用户空间应用程序。

要使用一个支持虚拟化的启动内核,下一步就是为客户机操作系统创建一个磁盘镜象。正如下文所示,需要通过qeumu-img完成这个任务。注意这个镜象的大小是4GB,但是使用qcow(QEMU's copy-on-write format),这个文件会随着需要而增长,而不是占用4GB。

$ qemu-img create -f qcow vm-disk.img 4G

创建了虚拟磁盘后,就将客户机操作系统加载到其中。下面的例子假定客户机操作系统在一个CD-ROM上。除了需要拥有CD-ROM ISO镜象的虚拟磁盘外,还需要在完成后启动这个镜象。

$ kvm -no-acpi -m 384 -cdrom guestos.iso -hda vm-disk.img -boot d

Ari Kivity已编写了若干测试工具用以在无需完全的设备模型的情况下测试KVM。

下面的代码片断(来自于kvm-12/user/main.c)提供了一个查看启动VM的高级视图。控制特性由内核(具体来说,就是在文件./linux-2.6.20/drivers/kvm/kvm_main.c)中的ioctls提供。

对kvm_init的调用打开会打开/dev/kvm设备,检查版本号,然后分配一个KVM环境对象,并填充一些回调操作函数。kvm_create函数设定并映射两个存储器区域,然后用一个ioctl (KVM_CREATE_VCPU)创建一个虚拟的CPU(也称为VCPU)。然后load_file函数将镜象装载到给定VM的地址空间,它通过调用kvm_run而执行。下面的这个过程虽然简单,却可以形象地展示KVM和客户机操作系统:

结束语

KVM是虚拟化问题的一个有趣方案,但并非是第一个内核虚拟化方案,很难想象它会很快地在服务器虚拟化领域席卷天下。其它的方法(例如,UML和Xen)一直以来都在竞争进入Linux内核,但是因为KVM需要进行的改变如此之少,并能将一个标准的内核转换为一个hypervisor,所以选择它的理由也就一目了然了。

KVM的另一个优势是,因为它是内核自身的部分,所以它可以利用内核的优化和发展来进一步壮大。不过,KVM有两个最大问题,一是它需要更新的有虚拟化能力的处理器,二是它需要一个用户空间QEMU过程来提供I/O的虚拟化。但无论好坏,KVM存在于在内核中,单就这一点它就是对现有虚拟化方案的一个巨大提升。

上一篇:轻松与Linux内核交流 下一篇:源讯撬动全球MMT市场