使用 KVM 进行虚拟化
在过去十年中,虚拟化技术取得了长足的进步,这主要归功于无数开源虚拟机监控程序的开发。这一进步几乎消除了操作系统之间的障碍,并显着提高了强大服务器的利用率,为企业带来了立竿见影的好处。直到最近,焦点始终集中在软件模拟虚拟化上。软件模拟虚拟化最常见的两种方法是完全虚拟化和准虚拟化。在完全虚拟化中,一个层(通常称为虚拟机监控程序或虚拟机监视器)存在于虚拟化操作系统和硬件之间。此层在竞争的操作系统实例之间多路复用系统资源。准虚拟化则有所不同,因为虚拟机监控程序以更协作的方式运行,因为每个客户操作系统都知道它正在虚拟化环境中运行,因此每个操作系统都与虚拟机监控程序协作以虚拟化底层硬件。
两种方法都有优点和缺点。准虚拟化方法的主要优点是它允许最快的基于软件的虚拟化,但代价是不支持专有操作系统。当然,完全虚拟化方法没有此限制;但是,完全虚拟化虚拟机监控程序是非常复杂的软件。商业虚拟化解决方案 VMware 就是完全虚拟化的一个例子。准虚拟化由 Xen、用户模式 Linux (UML) 等提供。
随着基于硬件的虚拟化的引入,这些界限变得模糊。随着英特尔的 VT 和 AMD 的 SVM 的出现,编写虚拟机监控程序变得容易得多,现在可以在最大限度地降低虚拟机监控程序的复杂性的同时享受完全虚拟化的好处。
经典的准虚拟化引擎 Xen 现在借助基于硬件的虚拟化,支持完全虚拟化的 MS Windows。KVM 是一个相对较新且简单但功能强大的虚拟化引擎,它已进入 Linux 内核,从而为 Linux 内核提供了原生虚拟化功能。由于 KVM 使用基于硬件的虚拟化,因此它不需要修改后的客户操作系统,因此,只要部署在受支持的处理器上,它就可以从 Linux 内核内部支持任何平台。
KVM 是一个独特的虚拟机监控程序。KVM 开发人员没有像其他虚拟机监控程序那样创建操作系统内核的主要部分,而是设计了一种将 Linux 内核本身转变为虚拟机监控程序的方法。这是通过一种最小侵入性的方法实现的,即将 KVM 开发为内核模块。将虚拟机监控程序功能集成到主机 Linux 内核中作为可加载模块可以简化管理并提高虚拟化环境中的性能。这可能是开发人员将 KVM 添加到 Linux 内核的主要原因。
这种方法有许多优点。通过向标准 Linux 内核添加虚拟化功能,虚拟化环境可以从 Linux 内核本身正在进行的全部工作中受益。在此模型下,每个虚拟机都是一个常规 Linux 进程,由标准 Linux 调度程序调度。传统上,一个普通的 Linux 进程有两种执行模式:内核模式和用户模式。用户模式是应用程序的默认模式,当应用程序需要内核的某些服务(例如写入硬盘)时,它会进入内核模式。KVM 添加了第三种模式,即访客模式。访客模式进程是从虚拟机内部运行的进程。访客模式与正常模式(非虚拟化实例)一样,具有自己的内核和用户空间变体。正常的 kill 和 ps 命令在访客模式下工作。从非虚拟化实例来看,KVM 虚拟机显示为一个普通进程,可以像任何其他进程一样被终止。KVM 利用硬件虚拟化来虚拟化处理器状态,虚拟机的内存管理在内核内部处理。当前版本的 I/O 在用户空间中处理,主要通过 QEMU。
典型的 KVM 安装包括以下组件
用于管理虚拟化硬件的设备驱动程序;此驱动程序通过字符设备 /dev/kvm 公开其功能。
用于模拟 PC 硬件的用户空间组件;目前,这在用户空间中处理,并且是一个经过轻微修改的 QEMU 进程。
I/O 模型直接源自 QEMU,支持写时复制磁盘映像和其他 QEMU 功能。
如何确定您的系统是否可以运行 KVM?首先,您需要一个支持虚拟化的处理器。有关更详细的列表,请查看 wiki.xensource.com/xenwiki/HVM_Compatible_Processors。此外,您可以检查 /proc/cpuinfo,如果您在 cpu flags 字段中看到 vmx 或 smx,则您的系统支持 KVM。
与竞争对手相比,KVM 是一个相当新的项目。在对主要开发人员 Avi Kivity 的采访中,他将 KVM 与其他替代解决方案进行了比较
在许多方面,VMware 是一项具有突破性的技术。VMware 仅使用软件技术就能完全虚拟化出名的复杂 x86 架构,并实现非常好的性能和稳定性。因此,VMware 是一个非常庞大且复杂的软件。另一方面,KVM 依赖于最近出现的新硬件虚拟化技术。因此,它非常小(大约 10,000 行代码)并且相对简单。另一个很大的区别是 VMware 是专有的,而 KVM 是开源的。
Xen 是一个相当大的项目,提供准虚拟化和完全虚拟化。它被设计为独立的内核,只需要 Linux 执行 I/O。这使其相当庞大,因为它有自己的调度程序、内存管理器、计时器处理和机器初始化。
相比之下,KVM 使用标准的 Linux 调度程序、内存管理和其他服务。这使 KVM 开发人员可以专注于虚拟化,在核心内核的基础上进行构建,而不是替换它。
QEMU 是用户空间模拟器。这是一个非常了不起的项目,它在多个主机处理器上模拟各种客户处理器,并且性能相当不错。但是,用户空间架构不允许它在没有内核加速器的情况下接近本机速度。KVM 认识到 QEMU 的实用性,并将其用于 I/O 硬件模拟。尽管 KVM 不绑定到任何特定的用户空间,但 QEMU 代码太好了,不能不使用——所以我们使用了它。
然而,KVM 由于其新颖性而并非完美;它有一些限制,包括以下内容
在撰写本文时,KVM 仅支持英特尔和 AMD 虚拟化,而 Xen 还支持 IBM PowerPC 和 Itanium。
当前版本中缺少对主机的 SMP 支持。
性能调优。
但是,该项目正在快速推进,根据 Avi Kivity 的说法,KVM 在某些领域已经领先于 Xen,并且将来肯定会在其他领域赶上。
虚拟化工作原理
平台虚拟化是一项古老的技术;但是,近年来,硬件和操作系统已经成熟到足以使虚拟化的承诺成为现实的程度。虚拟化最基本的部分是虚拟机监控程序。虚拟机监控程序充当虚拟化客户操作系统和真实硬件之间的层。在某些情况下,虚拟机监控程序是一个操作系统,例如 Xen;在其他情况下,它是用户级软件,例如 VMware。虚拟化客户操作系统或虚拟化实例是一个隔离的操作系统,它将底层硬件平台视为属于它。但是,实际上,虚拟机监控程序为它提供了这种错觉。
处理器对虚拟化的支持
由于对虚拟化技术的兴趣再次高涨,微处理器制造商已更新其处理器以使其具有对虚拟化的原生支持。这样做允许处理器直接支持虚拟机监控程序,并简化编写虚拟机监控程序的任务,就像 KVM 的情况一样。处理器管理主机和客户操作系统的处理器状态,并且还代表虚拟化操作系统管理 I/O 和中断。
KVM 已添加到许多特定于发行版的存储库中,包括 OpenSUSE/SUSE、Fedora 7(自带 KVM)、Debian 和 Ubuntu (Feisty)。
对于其他发行版,您需要下载 2.6.20 及更高版本的内核。在编译自定义内核时,配置内核时选择“设备驱动程序”→“虚拟化”,并启用对基于硬件的虚拟化的支持。您还可以从 sourceforge.net/project/showfiles.php?group_id=180599 获取 KVM 模块以及所需的用户空间实用程序。
我已经安装了 OpenSUSE 软件包;因此,本文示例中使用的文件名可能与您的版本中的文件名不同。
使用启用了虚拟化支持的已编译内核,下一步是为客户操作系统创建磁盘映像。您可以使用 qemu-img 执行此操作,如下所示。请注意,映像的大小为 6GB,但是使用 QEMU 的写时复制格式 (qcow),文件将根据需要增长,而不是占用完整的 6GB
# qemu-img create -f qcow image.img 6G
新客户操作系统的实例化由名为 qemu-kvm 的实用程序提供。此实用程序与 kvm 模块一起使用,使用 /dev/kvm 加载客户机,将其与虚拟磁盘(主机操作系统中的常规 QEMU qcow 文件)关联,然后启动它。在某些发行版中,此实用程序可能称为 kvm。
创建虚拟磁盘后,将客户操作系统加载到其中。以下示例假定客户操作系统位于 CD-ROM 上。除了使用 CD-ROM ISO 映像填充虚拟磁盘外,您还必须在完成后启动映像
# qemu-kvm -m 384 -cdrom guestos.iso -hda image.img -boot d
当前版本的 KVM 中的 I/O 由 QEMU 处理,因此让我们看一下一些重要的 QEMU 开关
-m:内存大小,以兆字节为单位。
-cdrom:该文件(理想情况下是 ISO 映像)充当 VM 的 CD-ROM 驱动器。如果未指定 cdrom 开关,则 ide1 master 充当 CD-ROM。
-hda:指向 QEMU 写时复制映像文件。对于更多硬盘,我们可以指定
#qemu-kvm -m 384 -hda vmdisk1.img -hdb vmdisk2.img -hdc vmdisk3.img
-boot:允许我们自定义启动选项;-d 开关从 CD-ROM 启动。
默认命令在子窗口中启动客户操作系统,但是您可以通过传递以下开关以全屏模式启动
-full-screen
此外,KVM 允许对虚拟化环境的硬件进行低级控制。您可以通过指定适当的开关将串行端口、并行端口和 USB 端口重定向到特定设备。VM 中也支持声音,您可以通过 -soundhw 开关将您的声卡传递到 VM 以启用声音。
以下是一些键盘快捷键
Ctrl-Alt-F:切换全屏。
Ctrl-Alt-N:切换到虚拟控制台 N。
Ctrl-Alt:切换鼠标和键盘。
Irfan Habib 是巴基斯坦国立科技大学的软件工程专业学生。他喜欢用 Python 编码,他认为 Python 是有史以来最高效的语言之一。