QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1892|回复: 0

KVM: 基于内核的虚拟驱动

[复制链接]
发表于 2006-12-28 01:01:31 | 显示全部楼层 |阅读模式
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

备注:
转载请保持文章完整性, 欢迎交流.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-3-28 19:58 , Processed in 0.045544 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表