1.简介
2.架构
3.KVM模块及QEMU
一、简介
KVM(Kernel Virtual Machine)基于内核的虚拟机。阿维·齐维迪(Avi Kivity)在一家名为Qumranet的初创企业开始了KVM的研发工作,开发人员基于Linux Kernel通过加载新的模块使Linux Kernel本身变成一个Hypervisor(管理程序),后KVM模块源代码成为Linux内核源代码的一部分。随后此公司于2008年被红帽公司收购,于是redhat在自己的产品中用KVM替换了Xen。
KVM目前的设计为:通过可加载的内核模块支持客户机操作系统(Linux、Solaris、Windows等等)。
KVM的架构中,虚拟机的实现为常规的Linux进程,由标准的调度程序进行调度。
二、架构
从虚拟机的基本架构上来区分,一般分为两种。
类型一:可以视为特别为虚拟机优化裁剪的操作系统内核。虚拟机监控程序运行在底层软件层,实现系统的初始化、物理资源的管理等操作系统的职能。这一类型的虚拟机监控程序一般会提供一个具有一定特定权限的特殊虚拟机,这个特殊虚拟机运行用户日常操作系统和管理使用的操作系统环境。如:Xen、VMware ESXI和Hyper-V。
类型二:虚拟机监控程序依赖操作系统来实现管理和调度,也会受到宿主操作系统的一些限制。无法为了虚拟机的优化而改变操作系统。如:VMware Workstation、VirtualBox。
而KVM是基于宿主操作系统的类型二的虚拟机。(如果说在windows下使用VMware Workstation,这个就可以类比为在Linux下的VMware Workstation。只不过KVM是通过内核模块的形式实现,充分利用Linux内核既有的实现,最大限度的重用代码。)
左侧是标准的Linux操作系统,KVM内核模块在运行时按需加载进入内核空间运行。KVM本身并不进行任何模拟。相反,它暴露出一个/dev/kvm接口,需要用户空间程序通过借口设置一个客户机虚拟服务器的地址空间,向他提供模拟的I/O,并将它的视频显示映射回宿主的显示屏,目前这个应用程序就是QEMU。
三、KVM模块及QEMU
KVM模块
KVM模块是KVM虚拟机的核心部分。KVM仅支持硬件虚拟化。其主要功能是初始化cpu硬件,打开虚拟化模式,然后将虚拟客户机运行在虚拟机模式下,并对虚拟客户机的运行提供一定的支持。
以KVM在Intel的CPU上运行为例,在被内核加载的时候,KVM模块会先初始化内部的数据结构;之后KVM模块检测系统当前的CPU,然后打开CPU控制寄存器CR4中的虚拟化模式开关,并通过执行VMXON指令将宿主操作系统置于虚拟化模式的根模式;最后KVM模块创建特殊设备文件/dev/kvm并等待来自用户空间的命令。接下来虚拟机的创建和运行是一个用户空间程序(QEMU)和KVM模块互相配合的过程。
QEMU
QEMU是一个开源的虚拟机纯软件的实现,性能低下。但是其优点是支持本身编译运行的平台上就可以实现虚拟机的功能,甚至虚拟机可以与宿主机不同架构。QEMU代码中有着整套虚拟机的实现,包括处理器、内存虚拟化以及虚拟设备模拟(比如网卡、显卡、存储控制器及硬盘等。)
虚拟机运行期间,QEMU会通过KVM模块提供的系统接口调用进入内核,由KVM模块将虚拟机至于处理器的特殊模式运行。遇到虚拟机输入输出操作,KVM模块会从上次系统调用的接口返回给QEMU,由QEMU来负责解析和处理这些设备。从QEMU角度看,可以说QEMU使用了KVM模块的虚拟化功能,为自己的虚拟机提供硬件虚拟化的加速,极大提高虚拟机的性能。虚拟机的配置和创建,运行依赖的虚拟设备,用户操作环境和交互,以及一些特殊功能(如动态迁移),都是由QEMU自己实现的。QEMU和KVM模块两者的结合无疑是最合适的选择。而qemu-kvm是为了KVM专门做了修改和优化的QEMU分支。