探索 Linux 内核虚拟机
- 格式:pdf
- 大小:252.56 KB
- 文档页数:6
系统管理程序之上是客户机操作系统,也称为虚拟机(VM).这些 VM 都是一些相互隔离的操作系 统,将底层硬件平台视为自己所有.但是实际上,是系统管理程序为它们制造了这种假象. 目前使用虚拟化解决方案的问题是,并非所有硬件都可以很 好地支持虚拟化.较老的 x86 处理器根据执行范围对特定指 令会产生不同结果.这就产生了一个问题,因为系统管理程 序应该只能在一个最受保护的范围中执行.由于这个原因, 诸如 VMWare 之类的虚拟化解决方案会提前扫描要执行的代 码,从而将这些指令替换为一些陷阱指令(trap instruction),这样系统管理程序就可以正确地处理它们. Xen 可以支持一种协作的虚拟化方法,它不需要任何修改, 因为客户机知道自己正在进行虚拟化,并已经进行了修改. KVM 会简单地忽略这个问题,如果您希望进行虚拟化,就强 制必须在更新的硬件上运行. 处理器对于虚拟化的支持 由于平台虚拟化的优点非常有用,因 此处理器供应商已经修改了自己的芯 片来直接支持这种方法.这样做使处 理器可以直接支持不同于客户机操作 系统的系统管理程序.对于 VMM 和 VM 来说,除了处理器状态(寄存器 等)的管理不同之外,处理器还支持 I/O 和中断的虚拟化.要了解更多信 息,请参看 参考资料.
虚拟化最常使用的两种方法是全虚拟化 和准虚拟化.使用全虚拟化,在虚拟化的操作系统和硬件之间 存在一个层,用于决定访问.这个层称为系统管理程序 或虚拟机监视器(VMM).准虚拟化与之类 似,但是系统管理程序会以一种更具协作性的方式进行操作.这是因为每个客户操作系统都了解自己 正在虚拟化模式中运行,因此每个系统都与系统管理程序协作,来实现底层硬件的虚拟化. 全虚拟化的例子包括商业虚拟化解决方案 VMware,以及商业 IBM zSeries 计算机上使用的 IBM System z9 Virtual Machine(z/VM)操作系统.准虚拟化的例子有 Xen 和 User-Mode-Linux (UML). KVM 也被认为是一个全虚拟化解决方案,不过我们稍后再介绍这个问题.
探索 Linux 内核虚拟机
学习 KVM 架构及其优点
级别: 中级 M. Tim Jones, 顾问工程师, Emulex 2007 年 5 月 28 日 Linux 既有良好的灵活性,在虚拟化方面同样出色.但是最近,随着内核虚拟机 (KVM)的出现,Linux 虚拟化的前景发生了变化.KVM 是构成主流 Linux 内核 (V2.6.20)一部分的第一个虚拟化解决方案.KVM 支持 Linux 客户操作系统的虚拟化 —— 甚至支持其硬件对虚拟化敏感的 Windows 系统的虚拟化.了解 Linux KVM 的架构 并了解它与内核的紧密集成为何会改变您使用 Linux 的方式.
虚拟化的工作原理
我们首先简要介绍一下虚拟化技术及其涉及的元素.虚拟化解决方案的底部是要进行虚拟化的机器. 这台机器可能直接支持虚拟化,也可能不会直接支持虚拟化;那么就需要系统管理程序 层的支持.系 统管理程序,或称为 VMM,可以看作是平台硬件和操作系统的抽象化.在某些情况中,这个系统管 理程序就是一个操作系统;此时,它就称为主机操作系统,如 图 1 所示. 图 1. 虚拟化的分层抽象
记住 KVM 只是虚拟化解决方案的一部分.处理器直接提供了虚拟化支持(可以为多个操作系统虚拟 化处理器).内存可以通过 kvm 进行虚拟化(这在下一节中将会讨论).最后,I/O 通过一个稍加修 改的 QEMU 进程(执行每个客户操作系统进程的一个拷贝)进行虚拟化. KVM 向 Linux 中引入了一种除现有的内核和用户模式之外的新进程模式.这种新模式就称为客户 模 式,顾名思义,它用来执行客户操作系统代码(至少是一部分代码).回想一下内核模式表示代码执 行的特权模式,而用户模式则表示非特权模式(用于那些运行在内核之外的程序).根据运行内容和 目的,执行模式可以针对不同的目的进行定义.客户模式的存在就是为了执行客户操作系统代码,但 是只针对那些非 I/O 的代码.在客户模式中有两种标准模式,因此客户操作系统在客户模式中运行可 以支持标准的内核,而在用户模式下运行则支持自己的内核和用户 空间应用程序.客户操作系统的用 户模式可以用来执行 I/O 操作,这是单独进行管理的. 在客户操作系统上执行 I/O 的功能是由 QEMU 提供的.QEMU 是一个平台虚拟化解决方案,允许对 一个完整的 PC 环境进行虚拟化(包括磁盘,图形适配器和网络设备).客户操作系统所生成的任何 I/O 请求都会被中途截获,并重新发送到 QEMU 进程模拟的用户模式中. KVM 通过 /dev/kvm 设备提供了内存虚拟化.每个客户操作系统都有自己的地址空间,并且是在实例 化客户操作系统时映射的.映射给客户操作系统的物理内存实际上是映射给这个进程的虚拟内存.为 了支持客户物理地址到主机物理地址的转换,系统维护了一组影子页表(shadow page table).处理 器也可以通过在访问未经映射的内存位置时使用系统管理程序(主机内核)来支持内存转换进程.
刚开始会觉得这有些不方便,但是考虑到目前上市的较新机器都可以支持虚拟化(例如 Intel VT 和 AMD SVM),用不了多久,这将成为标准方法而不是少数例外情况.有关可以支持虚拟化的处理器 的更多信息,请参看 参考资料 和侧栏 处理器对于虚拟化的支持.
KVM 系 统 管 理 程 序
考虑到虚拟化技术的发展时间并不长,KVM 实际上还是一种相对来说比较新的技术.目前存在各具功 能的开源技术,例如 Xen,Bochs,UML,Linux-VServer 和 coLinux,但是 KVM 目前正在被大量使 用.另外,KVM 不再仅仅是一个全虚拟化解决方案,而将成为更大的解决方案的一部分. KVM 所使用的方法是通过简单地加载内核模块而将 Linux 内核转换为一个系统管理程序.这个内核模 块导出了一个名为 /dev/kvm 的设备,它可以启用内核的客户模式(除了传统的内核模式和用户模 式).有了 /dev/kvm 设备,VM 使自己的地址空间独立于内核或运行着的任何其他 VM 的地址空间. 设备树(/dev)中的设备对于所有用户空间进程来说都是通用的.但是每个打开 /dev/kvm 的进程看 到的是不同的映射(为了支持 VM 间的隔离). KVM 然后会简单地将 Linux 内核转换成一个系统管理程序 Linux 内核中 KVM 的源代码 (在安装 kvm 内核模块时).由于标准 Linux 内核就是一个 您可以在 ./linux/drivers 系统管理程序,因此它会从对标准内核的修改中获益良多 /kvm(V2.6.20 及更新版本)中找到 (内存支持,调度程序等).对这些 Linux 组件进行优化 KVM 的源代码.这个目录包含了 (例如 2.6 版本内核中的新 O(1) 调度程序)都可以让系统管 KVM 的源文件,以及对于 Intel 和 理程序(主机操作系统)和 Linux 客户操作系统同时受益. AMD 扩展的处理器支持文件. 但是 KVM 并不是第一个这样做的程序.UML 很久以前就将 Linux 内核转换成一个系统管理程序了.使用内核作为一个系 统管理程序,您就可以启动其他操作系统,例如另一个 Linux 内核或 Windows 系统.
最后,更加简单的一种虚拟化是操作系统虚拟化,其中一台 计算机可以运行相同类型的多个操作系统.这种虚拟化可以将一个操作系统的多个服务器隔离开来 (这意味着全都必须使用相同类型和版本的操作系统).有关虚拟化方法的更多信息,请参看 参考资 料.
虚 拟 化 和 准 虚 拟 化 ( para-virtualization)
ቤተ መጻሕፍቲ ባይዱ
实例化新客户操作系统
新客户操作系统的实例化是由一个名为 kvm 的工具提供的.这个工具可以与 kvm 模块协同工作,使 用 /dev/kvm 来加载客户操作系统,将它与虚拟磁盘(主机操作系统中的一个普通文件)关联起来, 然后启动客户操作系统.
通过一组在 /dev/kvm 设备上执行的 ioctls 可以提供控制支持.当第一次打开这个特殊文件时,就会创 建一个新的 VM 对象,它与一个虚拟 CPU 关联在一起.您然后可以使用几个 ioctls 来创建一个虚拟 CPU,检查 kvm 版本,创建内存区域,然后启动一个虚拟 CPU.您可以使用 kvm 命令实现这种功 能.在接下来的几节中,我们将介绍 kvm 命令,并给出几个受支持的 ioctls 的示例.
Ari Kivity 已经编写了一组测试工具来测试 KVM,而不需要全部的设备模型.下面的代码片断(来自于 kvm-12/user/main.c)从较高的层次上查看了 VM 的启动(请参见 清单 1).控制特性是由内核中的 ioctls 提供的(具体来说,在 ./linux-2.6.20/drivers/kvm/kvm_main.c 文件中). 对 kvm_init 的调用会打开 /dev/kvm 设备,检查版本号(由 KVM 内核模块导出),然后分配一个 KVM 上下文对象并填充一些回调函数.kvm_create 函数会建立并映射两个内存区域,然后使用 ioctl(KVM_CREATE_VCPU)创建一个虚拟 CPU(VCPU). load_file 函数然后会将映像加载到给定的 VM 的地址空间中,然后调用 kvm_run 执行该 VM(使用 ioctl KVM_RUN).尽管这个过程非常简单,但是它解释了如何使用 KVM 实例化新客户操 作系统. 清单 1. 测试 KVM 系统管理程序的应用程序片断
KVM
安装 KVM 之后,您可以在用户空间启动客户操作系统.每个客户操作系统都是主机操作系统(或系 统管理程序)的一个单个进程. 图 2 提供了一个使用 KVM 进行虚拟化的视图.底部是能够进行虚拟 化的硬件平台(目前指的是 Intel VT 或 AMD-SVM 处理器).在裸硬件上运行的是系统管理程序(带 有 KVM 模块的 Linux 内核).这个系统管理程序与可以运行其他应用程序的普通 Linux 内核类似.但 是这个内核也可以支持通过 kvm 工具加载的客户操作系统.最后,客户操作系统可以支持主机操作系 统所支持的相同应用程序. 图 2. 使用 KVM 的虚拟化组件