苏眠月|云计算底层技术之 KVM 初探
KVM 是业界最为流行的 Hypervisor , 全称是 Kernel-based Virtual Machine 。 它是作为 Linux kernel 中的一个内核模块而存在 , 模块名为 kvm.ko , 也可以看作是一个进程 , 被内核调度并管理 , 从 Linux 2.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 与 Qemu 的关系
KVM 是基于硬件虚拟化(Intel VT 或 AMD-V)实现的一套虚拟化解决方案 , 通过以上一个与 Qemu 关系的分析 , 我们基本上知道它在虚拟化领域处在一个什么样的地位 。 它其实只负责 CPU 和内存的虚拟化 , 不负责任何设备的模拟 , 而是提供接口给用户空间的 Qemu 来模拟 。 这个接口是 /dev/kvm,
Qemu 通过 /dev/kvm 接口设置一个虚拟机的地址空间 , 然后向它提供模拟好的 I/O 设备 , 并将相关的设备回显操作映射到宿主机 , 完成整个 I/O 设备的虚拟化操作 。
本文插图
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 就是这样一个工具 。
本文插图
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.gitqemu.git(包括了 kvm):git clone git://git.qemu-project.org/qemu.git 【苏眠月|云计算底层技术之 KVM 初探】
推荐阅读
- 富士康底层“打工人”生存实录:想加班?先请领导吃饭、洗脚
- 中链智城与链想家就区块链底层技术专利进行深度合作
- 大数据&云计算|【厅属动态】中国测绘学会测绘地理信息创新产品:广东省自然资源大数据挖掘分析系统
- 云计算|淮海·壹佰廿|潮玩淮海——亚瑟士首家中国旗舰店
- 云计算长跑,谁正在掉队?
- 为什么社会底层的人,生活不好的人会抱怨社会不公平?
- 健康plus|难倒亿万人的难题:为什么人生总是不顺?你需要的是底层思维能力
- 难倒亿万人的难题:为什么人生总是不顺?你需要的是底层思维能力
- 无处不在的云计算,到底有哪些优势?
- 大数据&云计算|XPU时代创新者英特尔
