KVM 是业界最为流行的 Hypervisor,全称是 Kernel-based Virtual Machine。它是做为 Linux kernel 中的一个内核模块而存在,模块名为 kvm.ko,也能够看做是一个进程,被内核调度并管理,从 Linux 2.6.20 版本开始被彻底正式加入到内核的主干开发和正式发布代码中。 KVM 主要用于管理 CPU 和内存的虚拟化,IO 设备的虚拟化则是由 Qemu 来完成。为何会有这样的分工,请继续往下看。git
KVM 与 Qemu 的前世此生
Qemu 是一个纯软件实现的开源「模拟」软件,它可以模拟整套虚拟机的实现,包括 CPU、内存、各类 IO 设备、鼠标、键盘、USB 、网卡、声卡等等,基本上没有它不能模拟的。有人可能会比较疑惑它跟 KVM 之间到底有何关系,咱们能够把它们当作是合做关系,好基友,谁都离不开彼此。微信
KVM 离不开 Qemu。KVM 实现初期,为了简化开发和代码重用,在 Qemu 的基础上进行了修改,主要是将比较耗性能的 CPU 虚拟化和内存虚拟化部分移到了内核中实现,保留 IO 虚拟化模块在用户空间实现。这样的作法主要是考虑到性能的缘由,CPU 和 内存虚拟化是很是复杂的虚拟化模块,并且使用很是频繁,若是实如今用户空间的话,用户态和内核态的频繁切换势必会对性能形成很大的影响。那为何要单独保留 IO 虚拟化在用户空间呢,这个也是权衡之下的结果,首先 IO 设备太多了,其次 IO 虚拟化相对其余两个模块使用不是很频繁,开销会小一些,因此,为了尽量保持内核的纯净性,才有了这样的分配。markdown
Qemu 离不开 KVM。上面也说了,Qemu 是一个纯软件的实现,运行在用户空间,性能很是低下,因此,从 Qemu 的角度,能够说是 Qemu 使用了 KVM 的虚拟化功能,为自身虚拟机提供加速。数据结构
早期二者尚未区分(没有同居),KVM 修改的模块叫 qemu-kvm,到 Qemu1.3 版本以后,二者就合二为一了(同居啦),若是咱们在用 Qemu 建立虚拟机时,要加载 KVM 模块,须要为其指定参数 --enable-kvm。架构
KVM 架构
KVM 是基于硬件虚拟化(Intel VT 或 AMD-V)实现的一套虚拟化解决方案,经过以上一个与 Qemu 关系的分析,咱们基本上知道它在虚拟化领域处在一个什么样的地位。它其实只负责 CPU 和内存的虚拟化,不负责任何设备的模拟,而是提供接口给用户空间的 Qemu 来模拟。这个接口是 /dev/kvm,
Qemu 经过 /dev/kvm 接口设置一个虚拟机的地址空间,而后向它提供模拟好的 I/O 设备,并将相关的设备回显操做映射到宿主机,完成整个 I/O 设备的虚拟化操做。框架
/dev/kvm 接口是 Qemu 和 KVM 交互的“桥梁”,基本的原理是:/dev/kvm 自己是一个设备文件,这就意味着能够经过 ioctl 函数来对该文件进行控制和管理,从而能够完成用户空间与内核空间的数据交互。在 KVM 与 Qemu 的通讯过程主要就是一系列针对该设备文件的 ioctl 调用。函数
我就拿建立虚拟机举个例子,虚拟机本质上是宿主机的一个进程,包括用户态数据结构和内核态数据结构,用户态部分由 Qemu 建立并初始化,内核态部分则由 KVM 来完成,完成后会返回一个文件句柄来表明所建立的虚拟机,针对该文件句柄的 ioctl 调用就能够对虚拟机进行相应的管理,好比创建虚拟机地址空间和宿主机地址空间的映射关系,建立多个线程(虚拟处理器,vCPU)来供虚拟机使用等,对于建立出的 vCPU,也会生成相应的文件句柄,一样,对 vCPU 的文件句柄的 ioctl 调用就能够对 vCPU 进行管理。工具
关于这块的具体细节,后面会有文章来专门讨论。post
VMM 管理工具 —— libvirt
目前,虚拟化这个领域能够说是百花齐放,针对不一样的场景提出了不少的虚拟化解决方案,KVM、Xen、VMware、VirtualBox、Hyper-V 等等,具体的这些方案有什么特色,能够看前文「虚拟化技术总览」。这么多方案势必有不少通用的模块,不一样之处可能在于,与不一样硬件厂商的适配上,为了支持更多厂商,以及应用更多的领域,有不少 IaaS 解决方案须要融合多种虚拟化技术。这个时候若是有一个平台类的管理工具就会很是方便,libvirt 就是这样一个工具。性能
libvirt 除了可以支持多种虚拟化方案以外,还支持 OpenVZ、LXC 等容器虚拟化系统。它提供一套完善的虚拟机管理工具,支持 GUI 和命令行的形式,如 virsh、virt-install、virt-manager。因为它的通用性和易管理,不少云计算框架平台都在底层使用 libvirt 的 API 来管理虚拟机,好比 OpenStack、OpenNebula、Eucalyptus 等。这个工具咱们仅仅提一下,有兴趣的能够装个玩玩。
下面给出 KVM 和 Qemu 的 git 路径,有兴趣的能够把源码下下来研究下。
kvm.git:
git clone git://git.kernel.org/pub/scm/virt/kvm/kvm.git qemu.git(包括了 kvm): git clone git://git.qemu-project.org/qemu.git
PS:对云计算感兴趣的小伙伴能够关注个人微信公众号:aCloudDeveloper,专一云计算领域,坚持分享干货。