|
KVM: 基于内核的虚拟驱动
赵珂, cn.zhaoke.com
http://blog.zhaoke.com/42.html
概览
当前虚拟技术存在几种不同的虚拟机管理程序(hypervisors). 其中大多是基于硬件的x86虚拟, 它们的软件层比较复杂. 但随着Intel VT(虚拟技术, Virtualization Technology)和AMD SVM(安全虚拟机, Secure Virtual Machine)的出现, 编写一个hypervisor程序将变得更加容易. 现在我们也可以利用当前开源技术来享用虚拟技术所带来的乐趣.
通用的Hypervisor模型
现在通用的Hypervisor模型包含一个可管理多个”客户”操作系统共享硬件的软件层. Hypervisor为专门(特权)的客户系统执行基本调度和内存管理, 通常的委托管理和I/O函数.
http://blog.zhaoke.com/data/2006/1228/kvm_fig1.gif
图1 - 基于Hypervisor的结构
今天的硬件变得越加复杂. 通常系统的”基本”调度操作可称做多个硬件线程(基于单核, 多核单个Socket, 多个Socket处理器). 类似, 片上内存(on-chip)控制器要求内存管理能实现系统分布式内存访问(NUMA)的功能.
当我们投入更多精力集成这些功能到hypervisors的时候, 我们已经有一个成熟的调度器和内存管理系统来处理这些问题 - linux内核.
使用linux做为Hypervisor
在标准的linux内核中增加虚拟技术, 我们能够获得一个已经(或将)优化了的内核, 一个改进的虚拟环境. 在这个模型当中, 每一个虚拟机都是一个由Linux调度程序管理的标准进程. 进程占用的内存由linux内存分配程序管理, NUMA集成到了调度程序当中.
一个通常的linux进程有两种运行模式: 内核和用户. KVM增加了第三种模式: 客户模式(guest mode, 有自己的内核和用户模式, 跟hypervisor没有任何关系).
http://blog.zhaoke.com/data/2006/1228/kvm_fig2.gif
图2 - 基于kvm的结构
各个模式的分工:
客户模式: 执行非I/O客户代码
内核模式: 切换到客户模式, 处理客户模式下因I/O或特殊指令引起的任何退出.
用户模式: 执行客户相关的I/O任务.
通过集成到内核当中, kvm ‘hypervisor’(虚拟机管理程序)无需修改就能自动跟踪最新的硬件和扩展功能.
一个最小化的系统
传统Hypervisor(虚拟机管理程序)模型其中一个优点是系统是最小化的(见上图2), 仅包含几十万行代码. 然而没有考虑到具有特权的客户机. 客户机访问所有的系统内存, 无论是通过hypercalls调用或为DMA硬件编写的程序. 特权客户出现的故障是不可恢复的, 就如同hypervisor发生故障不能自动重启一样.
一个基于kvm的系统的特权范围是真正最小化的: 仅包含主机内核和附加几千行代码的内核模式驱动, 可提供无限制的硬件访问.
kvm组件
我们以结构为例来了解kvm的简易性, kvm包括两个组件:
一个是管理虚拟硬件的设备驱动, 该驱动通过一个字符串设备/dev/kvm来显示其能力.
另一个是用于模拟PC硬件的用户空间组件, 这是一个稍做修改的qemu进程.
修改过的qemu进程使用mmap()管理客户机的物理内存和调用内核模式下的驱动运行于客户模式.
I/O模型直接来自于qemu, 支持可写时拷贝磁盘映像和其它qemu的功能.
I/O性能
当执行客户的I/O任务时, kvm模型具有一些性能上的优点. 考虑特权客户系统的事件顺序:
. 客户发起一个I/O指令.
. Hypervisor通过陷阱捕获I/O指令, 然后转发到特权客户(一些指令可能在内部进行处理)
. Hypervisor调度程序用来调度特权客户
. 普通客户切换到特权客户状态.
. 调用特权客户中断处理程序, 引发I/O进程由特权客户调度程序进行调度
. 执行进程上下文切换.
. 通过I/O进程初始化客户的I/O.
. I/O进程发送信号(通过特权客户内核和hypervisor): I/O的初始化结束.
. Hypervisor切回到最初的客户.
. Hypervisor继续执行客户代码
Kvm主机上同样的执行顺序:
. 客户发起一个I/O指令.
. 主机内核通过陷阱捕获指令和退出到虚拟机用户空间状态(一些指令可能在内核模式进行处理)
. 通过虚拟机用户空间初始化客户I/O.
. 虚拟机用户空间返回到内核状态.
. 内核继续执行客户代码
管理
自从虚拟机只是一个进程, 所有标准linux进程管理工具都是适用的: 你可以使用kill命令终止, 停止和继续虚拟机的运行(或甚至使用Ctrl-C和类似的键盘快捷键)和使用top查看资源使用状况. 通过普通的linux方法来设置权限: 虚拟机属于启动它们的用户(可以不是root, 但必须能访问/dev/kvm), 所有访问都由内核来进行确认.
系统管理员允许使用现有的工具来管理虚拟机, 主机系统允许逐步增加更多的虚拟机.
结论
为了平衡新silicon芯片提供的能力, kvm模型介绍了一种新的虚拟技术, 它能够很好利用linux的结构和最新的功能. 更多的是, 通过可加载模块方式集成hypervisor到主机的linux内核当中能够简化虚拟环境的管理和提高性能, 减小对已有系统的最小影响.
参考:
KVM: Kernel-based Virtualization Driver
备注:
转载请保持文章完整性, 欢迎交流. |
|