2.5.1 KVM虚拟化方案
KVM是Kernel-based Virtual Machine的简称,中文全称为内核虚拟机,是一个开源的系统虚拟化模块,自Linux 2.6.20之后集成在Linux的各个主要发行版本中。它使用Linux自身的调度器进行管理,所以相对于Xen,其核心源码很少。KVM目前已成为学术界的主流VMM之一。
KVM最初由以色列的Qumranet公司开发,为了简化开发,KVM的开发人员没有选择从底层开始从头写一个新的Hypervisor,而是选择了基于Linux内核,通过在LinuxKernel上加载新的模块从而使Linux Kernel本身变成一个Hypervisor。
KVM的虚拟化需要CPU硬件虚拟化的支持(如Intel VT技术或者AMD V技术),是基于硬件的完全虚拟化。每一个KVM虚拟机都是一个由Linux调度程序管理的标准进程。但是,仅有KVM模块是远远不够的,因为用户无法直接控制内核模块去做事情,因此,还必须有一个用户空间的工具才行。
KVM仅仅是Linux内核的一个模块,管理和创建完整的KVM虚拟机需要更多的辅助工具。这个辅助的用户空间的工具,开发者可以选择已经成型的开源虚拟化软件QEMU。在Linux系统中,首先可以用modprobe系统工具去加载KVM模块,如果用RPM安装KVM软件包,系统会在启动时自动加载模块。加载了模块后,才能进一步通过其他工具创建虚拟机。QEMU可以虚拟不同的CPU构架,例如,在x86的CPU上虚拟一个Power的CPU,并利用它编译出可运行在Power上的程序。QEMU是一个强大的虚拟化软件,KVM使用了QEMU的基于x86的部分,并稍加改造,形成了可控制KVM内核模块的用户空间工具QEMU。所以,Linux发行版中分为kernel部分的KVM内核模块和QEMU工具。
对于KVM的用户空间工具,尽管QEMU工具可以创建和管理KVM虚拟机,但是,RedHat为KVM开发了更多的辅助工具,如libvirt、virsh、virt-manager等。原因是QEMU工具效率不高,不易于使用。libvirt是一套提供了多种语言接口的API,为各种虚拟化工具提供一套方便、可靠的编程接口,不仅支持KVM,还支持Xen等其他虚拟机。使用libvirt,只需要通过libvirt提供的函数连接到KVM或Xen宿主机,便可以用同样的命令控制不同的虚拟机。libvirt不仅提供了API,还自带一套基于文本的管理虚拟机的命令——virsh,可以通过使用virsh命令来使用libvirt的全部功能。但最终,用户更渴望的是图形用户界面,这就是virt-manager。virt-manager是一套用Python编写的虚拟机管理图形界面,用户可以通过它直观地操作不同的虚拟机。virt-manager也是利用libvirt的API实现的。
KVM模块是KVM虚拟机的核心部分。其主要功能包括:初始化CPU硬件,打开虚拟化模式,将虚拟客户机运行在虚拟机模式下,并对虚拟客户机的运行提供一定的支持。
KVM的初始化过程如下:
(1)初始化CPU硬件。KVM是基于硬件进行虚拟化,CPU必须支持虚拟化技术。KVM会首先检测当前系统的CPU,确保CPU支持虚拟化。当KVM模块被加载时,KVM模块会先初始化内部数据结构。KVM的内核部分是作为可动态加载内核模块运行在宿主机中的,其中一个模块是和平台无关的实现虚拟化核心基础架构的kvm模块,另一个是与硬件平台相关的kvm_intel模块或者是kvm_amd模块。
(2)打开CPU控制寄存器CR4中的虚拟化模式开关,并通过执行特定指令将宿主机操作系统置于虚拟化模式中的根模式。
(3)KVM模块创建特殊设备文件/dev/kvm,并等待来自用户空间的命令(例如,是否创建虚拟客户机,创建什么样的虚拟客户机等)。
接下来是用户空间使用工具创建、管理,以及关闭虚拟客户机。
KVM是Linux完全原生的全虚拟化解决方案,目前设计为可加载的内核模块,支持广泛的客户机操作系统,比如Linux、BSD、Solaris、Windows、Haiku、ReactOS和AROSResearch Operating System。
在KVM架构中,虚拟机实现为常规的Linux进程,由标准Linux调度程序进行调度。事实上,每个虚拟CPU显示为一个常规的Linux进程。这使KVM能够享受Linux内核的所有功能。
需要注意的是,KVM本身不执行任何模拟,需要用户空间程序(例如QEMU)通过/dev/kvm接口设置一个客户机虚拟服务器的地址空间,向它提供模拟的I/O,并将它的视频显示映射回宿主机的显示屏,以完成整个虚拟过程。
图2-25所示为KVM的架构,从图中可以看出,最底层是硬件系统,其中包括处理器、内存、输入/输出设备等硬件。在硬件系统之上就是Linux操作系统,KVM作为Linux内核的一个模块加载其中,再向上就是基于Linux的应用程序,同时也包括基于KVM模块虚拟出来的虚拟客户机。
图2-25 KVM架构
最后,看一下KVM的前景。KVM是一个相对较新的虚拟化产品,但是诞生不久就被Linux社区接纳,成为随Linux内核发布的轻量型模块。与Linux内核集成,使KVM可以直接获益于最新的Linux内核开发成果,例如更好的进程调度支持、更广泛的物理硬件平台的驱动、更高的代码质量等。
作为相对较新的虚拟化方案,KVM需要成熟的工具以用于管理KVM服务器和客户机。不过,随着libvirt、virt-manager等工具和OpenStack等云计算平台的逐渐完善,KVM管理工具在易用性方面的劣势已经逐渐被克服。另外,KVM可用于改进虚拟网络的支持、虚拟存储支持、增强的安全性、高可用性、容错性、电源管理、HPC/实时支持、虚拟CPU可伸缩性、跨供应商兼容性、科技可移植性等方面。目前,KVM开发者社区比较活跃,也有不少大公司的工程师参与开发,我们有理由相信KVM的很多功能都会在不远的将来得到进一步完善。