云计算底层技术之 KVM 初探

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


    推荐阅读