QEMU:多宿主、多目标模拟器
几个月前,我突然发现自己遇到了一个“我需要运行一个 Windows 应用程序”的问题。当我开始目前的工作时,我决心最终在工作中摆脱 Windows,就像我在家里的几年一样。为此,在我拆开闪亮的新工作电脑后,我擦除了 Windows,安装了我目前最喜欢的 Linux 发行版,并设置了 Ximian Evolution 以连接到 Microsoft Exchange 服务器。我以为我终于到达了 Linux 的涅槃。
事与愿违。
微软的 Exchange 邮件服务器具有一项功能,即团队或一组人员可以访问共享邮箱。我的经理认为为我们的团队设置一个共享邮箱,并让客户将电子邮件发送到该地址而不是发送给我们每个人,这将是一个好主意。有了共享收件箱,我发现自己每天需要检查几次。
Evolution 可以连接到共享邮箱,但不能以我必须连接到我的邮箱的方式连接。我的部门对 Linux 友好且注重安全,不在公司网络中,因此我部门中使用基于 Windows 的系统的人员需要将其 Outlook 电子邮件客户端配置为通过 HTTP 连接到 Exchange 服务器。Evolution 似乎仅在您与 Exchange 服务器位于同一网络上时才支持连接到共享邮箱,而不是通过 HTTP 方法。
别无选择。我必须运行 Outlook。而且不仅仅是任何版本。我必须运行 Outlook 2003,这是可以使用 HTTP 连接方法的版本。Outlook 2003 与旧版本 Outlook 的不同之处在于,它与 CodeWeavers 的 Wine 或 CrossOver Office 不兼容,这排除了我认为是在 Linux 上运行它的显而易见的首选解决方案。
因此我的选择是
回到使用 Windows。
找到另一种运行 Outlook 2003 的方法。
我不想仅仅为了一个应用程序而回到使用 Windows,所以我开始寻找其他选择的答案。我的要求很简单:它必须能够运行 Outlook 2003,它必须便宜,它必须可用,而且它必须可靠——不会崩溃。VMware 是此类事情的显而易见的选择,但由于费用由我自己承担,VMware 不是一个选择。经过一番搜索,我找到了一个出色的 VMware 替代品:QEMU。
根据其主页:“QEMU 是一个快速的!处理器模拟器,使用动态翻译来实现良好的模拟速度。”
QEMU 是一个多宿主、多目标模拟器。QEMU 将在 x86、x86-64 和 PowerPC 系统上运行,并且可以模拟 x86、x86-64、ARM、SPARC、PowerPC 和 MIPS 架构。对于大多数这些架构,它可以通过两种方式运行:全系统模拟和用户模式模拟。有关哪些架构支持哪些模式的详细信息,请查看在线资源中的链接。
用户模式模拟允许您在您的机器上运行为其他架构编译的 Linux 二进制文件。这非常适合应用程序开发和测试,但我对全系统模拟更感兴趣。
全系统模拟模拟了一个完整的计算机系统,从 BIOS 一直到视频和声卡等组件。对于 x86 系统模拟,QEMU 模拟一台具有以下外围设备的机器
i440FX 主机 PCI 桥和 PIIX3 PCI 到 ISA 桥。
Cirrus CLGD 5446 PCI VGA 卡或带有 Bochs VESA 扩展的虚拟 VGA 卡(硬件级别,包括所有非标准模式)。
PS/2 鼠标和键盘。
两个带有硬盘和 CD-ROM 支持的 PCI IDE 接口。
软盘驱动器。
NE2000 PCI 网络适配器。
串行端口。
SoundBlaster 16 声卡。
来自 Bochs 项目的 PC BIOS。
Plex86/Bochs LGPL VGA BIOS。
从上面的列表中,您可能会看出 QEMU 并不是终极 Linux Box 的竞争者。但是,Linux 和 Windows 都很好地支持每个模拟设备,这使得虚拟机 (VM) 安装变得容易,并且无需寻找驱动程序,这是一件“非常好的事情”。
我自己使用的是基于 x86 的机器,并且不需要运行需要甚至使用 x86-64、ARM、SPARC、PowerPC 或 MIPS 处理器的操作系统,因此我无法保证 QEMU 在这方面的性能。我测试了一些 DebianPPC、Gentoo for SPARC 和 MenuetOS_64 的磁盘映像,后者是用 x86-64 汇编语言编写的。它们都启动并运行没有问题,但我无法将其性能与真实硬件进行比较。这些以及许多其他 QEMU 就绪的磁盘映像可从 FreeOS Zoo(参见资源)获得。
我使用 QEMU 的目的是在我选择的基于 x86 的操作系统(目前是 Ubuntu Linux 5.10)内运行基于 x86 的操作系统——Microsoft Windows XP。这种特定设置的好处在于,QEMU 可以在其标准模拟引擎之上使用一个名为 KQEMU 加速器的虚拟化层,该层将速度提高到 QEMU 网站声称的“接近原生速度”。无论是否接近原生速度,我可以这么说,安装了 KQEMU 加速器后,速度肯定更快了。
加速器尽可能多地将处理传递给真实处理器,并且仅模拟必要的位。这完全有道理。为什么要模拟 x86 上的 x86?如果有什么充分的理由这样做,我想不出任何理由。
要安装 QEMU,请从 QEMU 主网站(参见资源)下载源代码包和二进制 kqemu 包。还有一个可用的二进制 QEMU 包。如果您下载并安装二进制文件,您将无法使用 KQEMU,因为它需要编译到 QEMU 中才能工作。与 QEMU 不同,KQEMU 仅作为二进制包提供。它不是开源的。有关更多信息,请参阅 KQEMU 侧边栏。在撰写本文时,QEMU 的版本为 0.8.0,KQEMU 的版本为 0.7.2。由于它们正在积极开发中,因此在您阅读本文时可能已有更新的版本可用。
下载这两个软件包后,我首先使用以下命令解压缩 QEMU:
tar -zxvf qemu-0.8.0.tar.gz
接下来,我将目录更改为我刚刚创建的 qemu-0.8.0 目录,并执行了以下操作:
tar -zxvf ../path/to/kqemu-0.7.2.tar.gz
这在我的 qemu-0.8.0 目录中创建了一个 kqemu 目录。
当我从源代码编译应用程序时,./configure, make, make install此时通常是我需要做的所有事情才能安装一个软件。QEMU 需要更多的人工干预。
为了让 QEMU 在我的机器上成功编译,我不得不对 configure 脚本进行一些更改。更改本身非常简单。首先,QEMU 与 4.x 版本的 gcc 不兼容,因此我不得不将 cc= 和 host_cc= 行更改为专门使用 gcc-3.4。然后,我不得不更改kqemu="no"为kqemu="yes"。最后,有必要在kernel_path=""中输入我的内核源代码树的路径。注意:QEMU 使用 SDL 进行输出,因此尽管我的特定设置不需要安装任何额外的组件,但其他人可能必须安装一些 SDL 库,configure 脚本才能正常工作。
一旦我能够运行./configure而没有报错,我就运行了make然后运行了make install将 QEMU 安装到我的 /usr/local/ 目录中。要安装 KQEMU 加速器内核模块,我在打开的终端中键入了以下内容:
modprobe kqemu
关于 KQEMU
与开源的 QEMU 不同,KQEMU 是一个闭源的专有产品。原因是钱。QEMU 开发人员 Fabrice Bellard 表示,他愿意开源 KQEMU,但有一个条件:如果一家企业赞助商承担其持续开发的费用。在此之前,尽管您可以免费下载它,但 KQEMU 仍将是其他开源产品中的专有组件。
有一个项目正在创建一个名为 qvm86 的开源替代品来替代 KQEMU(参见资源)。我没有使用过它,但我读到一些声明说它与 KQEMU 一样好甚至更好。
安装 QEMU 后,我想看看它的实际效果。尝试它的最简单方法是启动一个 Live CD ISO 映像,如 KNOPPIX、Ubuntu、SimplyMepis、DSL、Puppy 或其他许多映像之一。要从可启动 CD 映像启动 QEMU,我只需在命令行中输入以下内容:
qemu -boot d -cdrom path/to/distro.iso
-boot d 参数告诉 QEMU 从 CD 驱动器启动,-cdrom path/to/distro.iso 告诉 QEMU CD-ROM“驱动器”的位置,在本例中,它只是一个 ISO 映像。我也可以将 QEMU 指向我的实际 CD-ROM 驱动器——/dev/cdrom——当我安装 Windows 时,我就是这样做的。
在安装操作系统之前,我首先需要准备一个虚拟硬盘来安装。QEMU 理解各种磁盘映像格式,包括 VMware 的 vmdk,如果我手头有一些 vmdk,这将派上用场。事实证明,默认的“原始”格式效果很好。原始格式磁盘映像就像一个未格式化的硬盘驱动器,这非常适合我的需求。
我使用以下命令创建了一个名为 winxp.img 的映像,大小为 5GB,我认为这足够大,可以安装 Windows XP 和 Outlook,并为我提供充足的电子邮件存储空间:
qemu-img create winxp.img 5120M
现在回想起来,更好的尺寸应该是 4GB,因为这将使创建 DVD 备份更容易。
现在我有了虚拟硬盘驱动器,我将 Windows XP Pro 安装 CD 放入我的 CD-ROM 驱动器,并使用适当的参数启动了 QEMU:
qemu -boot d -hda path/to/winxp.img -cdrom /dev/cdrom -m 256 -localtime
-m 256 选项将分配给 VM 的内存设置为 256MB——默认值为 128MB,对于 Windows XP Pro 来说有点小。-localtime 选项将虚拟 BIOS 时钟设置为主机上的本地时间——默认是将 BIOS 时钟设置为协调世界时。
我发现将 Windows 安装到虚拟机上与将其安装到“真实”计算机上非常相似。安装程序会弹出,让您选择安装 Windows 的位置。它会询问您是否要格式化硬盘驱动器,提示您输入许可证密钥等等。基本安装完成后,我关闭了 VM,将我的 Windows XP Pro 安装 CD 替换为我的 Microsoft Outlook 安装 CD,并像这样启动了 QEMU:
qemu -boot c -hda path/to/winxp.img -cdrom /dev/cdrom -m 256 -localtime
唯一的区别是从 winxp.img 而不是从 /dev/cdrom 启动。Outlook 安装就像典型的 Outlook 安装一样——没有什么真正的意外。Outlook 安装完成后,我就有了一台功能正常的 Windows 机器,可以随时调用它。
现在我有了基本的操作系统和需要的应用程序,我关闭了机器并创建了一个 GNOME 启动器,这样我就可以启动我的虚拟 Windows 机器,而无需每次都在终端中键入它。正如您可以从图 4 中看到的那样,我基本上从命令中删除了 CD-ROM 信息,因为在正常操作期间我不需要 CD-ROM。有关如何创建自定义应用程序启动器的信息,请参阅您的发行版的文档。
有几种方法可以从 QEMU 中榨取额外的性能:
更多 RAM:我做的第一件事是添加更多 RAM。我不希望 QEMU 有任何理由访问我的交换分区。交换分区非常有用,但对于资源密集型任务(如模拟)来说太慢了。有了更多 RAM,您不仅可以从 VM 获得更好的性能,还可以同时运行多个 VM(有关示例,请参见图 5)。
KQEMU:我为获得更好性能所做的第二件事是编译 KQEMU 加速器模块。
设置 RAM 磁盘:即使使用额外的内存,QEMU 有时也需要将内容缓存到磁盘。为了加快此过程,我设置了一个 RAM 磁盘。RAM 磁盘是从可用 RAM 创建的虚拟磁盘驱动器。要创建它,我在我的 /etc/fstab 中输入了以下内容,然后重新启动了我的机器:
tmpfs /dev/shm tmpfs defaults 0 0
在我开始使用 QEMU 后遇到的一个难题是如何将文件从我的 QEMU VM 中导出以进行备份。我尝试的第一个方法是为 Windows 安装 SSH 安全复制 (scp) 客户端,然后使用它将文件传输给自己。这可行,但它不像我希望的过程那样简单。
我尝试的第二种方法效果好得多。启动 QEMU 时,有一个选项可以指定共享目录。QEMU 通过 Samba 使其可用于 VM,因此您需要安装 Samba 才能使其工作。该选项是 -smb dir——其中 dir 是我的主机上我希望我的 Windows XP VM 访问的目录。然后,我在我的 Windows XP VM 上的 C:\WINNT\SYSTEM32\DRIVERS\ETC\LMHOSTS 中添加了以下行:
10.0.2.4 smbserver
然后,从我的 VM 中访问我的共享文件夹就像导航到 \\smbserver\qemu 一样容易。
QEMU 可能缺乏像 VMware 这样的商业程序的图形配置和 VM 设置工具,但我发现它是解决“我需要运行一个 Windows 应用程序”问题的绝佳解决方案。从我在 QEMU 论坛和 Freenode IRC 网络上的 #qemu 频道上看到的评论来看,QEMU 非常适合解决许多其他问题。试一试,我想你会喜欢的。
本文的资源: /article/8884。
Daniel Bartholomew 自 20 世纪 80 年代初他的父母带回家一台 Apple IIe(带 80 列卡!)以来一直在使用计算机。在 Mac 和 Windows 机器上工作过一段时间后,他于 1996 年发现了 Linux (Slackware),并且此后一直在使用各种发行版。他与妻子和孩子住在北卡罗来纳州。