内容


使用 QEMU 进行跨平台开发

在一台计算机上进行多平台开发

Comments

虚拟化的一个优势就是扩展了计算硬件的功能,可允许一台计算机(主机)通过运行多个客户 操作系统实现多个角色。然而当今很多流行的虚拟化工具在体系结构上还有所限制 — 只允许在同一架构下运行多个操作系统,如在单一的 x86-64 计算机上运行多 x86-64 操作系统。这种功能 QEMU 也能实现,但它还能以跨平台方式运行操作系统。这项功能能够在不增加计算机的条件下测试程序的平台相关特性!

要使用 QEMU 进行跨平台开发,首先必须安装好 QEMU,然后安装客户操作系统。可能需要跳过一些额外步骤进行跨平台开发。当模拟器安装运行后,您可以访问一些能帮助管理跨平台开发的 QEMU 特性,例如允许文件在模拟器和主机之间传输或共享。

安装 QEMU

通过安装包的方式安装 QEMU 会很容易,但如果您打算将该程序用于跨平台软件开发,应该再深入研究一些。例如,应该懂得 QEMU 安装选项,以及必要支持文件如固件的安装。还应懂得系统模拟与用户空间模拟的区别,因为二者都需安装各自的附加软件。

获取 QEMU 安装包和支持软件

对于大多数 Linux 软件包,您都能以下列两种方式安装 QEMU:使用安装包方式或从源代码编译软件。使用如下命令 apt-get install qemu(在 Debian 或 Ubuntu 上)、yum install qemu(在 Red Hat 或 Fedora 上) 或 emerge qemu(在 Gentoo 上)在通用的发行包上安装(可从发行包说明文档中获得详细信息)。

随发行包提供的 QEMU 安装包运行良好,但似乎落后于最新的版本,而且可能未提供一些重要文件,如用于非 x86 系统的固件。因此,可以从源代码安装软件,这可以从 QEMU 网站获得(参见 参考资料 部分的链接)。在根目录输入 ./configure--help 将出现一个配置选项列表,可以根据需要定制 QEMU。然后,使用常见的 makemake install 命令编译并安装软件。

撰写此文时,QEMU 的稳定版本是 0.11.1,但 0.12 候选版本也已经可用。我使用 0.11.1 版本作为本文参考。

如果您正使用 QEMU 在 x86 或 x86-64 计算机上进行同样模拟,您也许会对 KQEMU 感兴趣。这是一个 Linux 内核模块,它能提供加速的 CPU 虚拟化,与 Xen 或 Kernel-based Virtual Machine (KVM) 提供的一样。KQEMU 却不是标准 Linux 内核的一部分;必须从 QEMU 网站下载或从单独的安装包安装。要注意 QEMU 与 KQEMU 版本匹配;KQEMU 1.3 用于 QEMU 0.9.1 及更早版本,KQEMU 1.4 用于QEMU 的更新的版本。

QEMU 主站点包含若干现成的 QEMU 磁盘镜像文件。其中包含不同平台如 FreeBSD 和 FreeDOS 的基本的 Linux 安装程序。可以下载这些文件测试基本安装。当系统运行后,既可以扩展原有系统,又可以重新安装一个新的系统。

随 QEMU 安装包发放的有用于 x86、x86-64、PowerPC、SPARC 32 和 SPARC 64 平台的固件,以及用于模拟视频卡、 Preboot Execution Environment (PXE) 启动和其他选项的单独的固件文件。查看主安装包的 pc-bios 子目录,或已安装系统的 /usr/share/qemu 获取相关文件。

有时候随 QEMU 提供的固件并不合适。例如,用于 x86 和 x86-64 系统的固件是传统的基本输入输出系统(BIOS)。如果您想测试或开发那些依赖较新的 Extensible Firmware Interface (EFI) 或更高级固件的软件,可能需要到别处寻找。QEMU 网站提供 EFI 镜像,因此这种特殊条件能够满足。其他情况可能更困难。如果想要运行特定类型的固件,可能需要用相关的关键词上网搜索。

系统与用户空间模拟

QEMU 提供两种模拟模式。第一种,系统模拟,安装完全的虚拟机。运行在该系统的软件看到的计算机与主机系统完全不同 — 例如,可以在实际的 x86-64 openSUSE 计算机上运行 PowerPC Debian 系统。用户模式模拟没有这么完整。这种方式下,QEMU 模拟库会用于每个二进制文件,他们将主计算机看成自己的,因此 PowerPC 二进制文件能看到主机 x86-64 openSUSE 系统的 /etc 目录和其他配置文件。用户模式模拟能简化对本地资源、网络等的访问。

每个模拟方式都有其安装要求。对于系统模拟,安装客户操作系统就像安装一台单独的计算机(下载并使用预先配置的磁盘镜像是一个替代方法)。对于用户空间模拟,不需要安装整个系统,但要考虑安装使用软件所需的支持库。也许还需要配置跨编译器以生成想要测试的二进制文件。

由于本文重点是使用 QEMU 开发测试跨平台软件,可能会包含少量的硬件交互,我重点介绍系统模拟。如果用户空间模拟更满足您的需要,您可以深入研究。

安装客户操作系统

在使用 QEMU 系统模拟模式之前,必须安装一个客户操作系统。根据上文所述,可以使用预先安装的磁盘镜像或准备一个磁盘镜像进行全新安装。后一种情况,必须首先准备一个磁盘镜像用于安装,但安装过程本身就和在普通计算机上安装一样。任何情况下,都必须了解重要的 QEMU 启动选项,它们会影响安装及系统使用。

准备磁盘镜像

通常,当使用 QEMU 时,用磁盘文件代替硬盘。作为替代方案,可以留出硬盘分区或网络空间用于部分或全部存储;尽管如此,磁盘文件还是很方便灵活,因此我推荐使用磁盘文件。QEMU 支持几种不同的文件格式用于模拟磁盘,最有用的是原始磁盘镜像,VMware 3/4 格式和 QEMU 的原有的 Copy-On-Write 版本 1(QCOW)和 2(QCOW2)格式。

qemu-img 命令生成磁盘镜像。该命令有很多选项,但基本使用相当简单:传递给它 create 参数、-f fmt 参数来设置格式、文件名和镜像大小。原始镜像(-f raw)对于与其他模拟器交换数据非常有用;然而,QCOW2(-f qcow2)支持压缩,能够利用相对小的空间生成看上去很大的磁盘。

例如,以下命令将生成 200GB 的磁盘镜像文件。一开始,该文件占用主机很小的磁盘空间(只有 256KB);随着使用,大小逐渐增长:

qemu-img create -f qcow2 linuxppc.qcow2 200G

除了生成硬盘镜像,还需要生成包含安装中介的镜像文件。既可以指定 QEMU 作为真实光驱,也可以指定包含光盘镜像的文件,例如从网上下载的或从物理光盘生成的。

QEMU 启动选项

当开始安装或使用 QEMU 时,必须以合适的选项启动程序,以能够使用模拟器。QEMU 文档提供了一些模糊的选项的信息,但还是能够理解一二的。尤其是,必须指定硬盘镜像以及安装中介或镜像。还有选项是选择不同的固件文件,设置各种硬件特性,等等。可以从简单的开始,然后逐渐进行复杂的配置。

完整的 QEMU 安装包含若干二进制文件,其中每个都模拟不同的 CPU 架构。二进制文件名采用 qemu-system-arch 的格式,其中 arch 是架构代码,ppc 表示 PowerPC 以及 x86_64 表示 x86-64。一个例外是 x86 系统,它通过 qemu 二进制文件模拟。采用 qemu-arch 格式名称的二进制文件提供各自架构的用户模式模拟。

为指定硬盘,使用 -hda-hdb-hdc-hdd 来引用 Parallel ATA (PATA) 硬盘,-cdrom 指定 CD 或 DVD 镜像文件或设备。这些选项都采用文件名作为参数。光驱占用了 -hdc 的位置,因此不能同时使用这两个选项。

另一个重要的 QEMU 启动选项是 -boot,它指定了启动设备。使用 -boot c 从第一个硬盘启动,-boot d 从 CD-ROM 设备启动。

默认情况下,QEMU 提供给用户操作系统仅 128MB RAM。可以在 -m 选项中增加可使用的内存,它的值以兆字节为单位。

这些选项都设置好后,使用 QEMU 安装 Debian 的 PowerPC 系统会像这样:

qemu-system-ppc -hda linuxppc.qcow2 -cdrom debian-ppc.iso -boot d -m 512

本例假设 debian-ppc.iso 文件包含 Debian PowerPC 安装盘的拷贝,并且可使用默认固件启动。我使用的是 QEMU 0.11.1 和 Debian 5.02a;然而,QEMU 会很苛刻,因此要找到一个解决问题的措施。但系统安装后,可以使用几乎一致的命令来启动系统 — 只要将 -boot d 改成 -boot c

警告、陷阱和解决措施

一个常见的障碍是,尤其是如果您正试图启动一个不熟悉的架构,安装盘可能无法启动。此问题的一个解决方法是通过 -bios 选项指定一个不同的固件文件,它以固件文件名作为选项。读取 /usr/local/share/qemu(或 /usr/share 中的相似的文件夹,如果是用发行包安装)中的固件文件。还可以通过网络搜索找到其他固件选项。

一个相似的解决方法是使用 -M 选项指定一个架构子类型。输入 qemu-system-arch -M ? 来了解有哪些值可用于您的架构。

另一种替代方法是使用 -kernel 选项;将用于主机磁盘上的用户平台的 Linux 内核文件名传递给它,QEMU 将会加载并运行,这将会忽略任何平台相关启动加载器或固件特性可能带来的问题。

由于 QEMU 模拟目标平台的 CPU,它可能会行动迟缓,因此应做好准备花费比一般安装用户操作系统更长的时间。如果可能,应当坚持最小安装需求并避免 X Window System。

当 QEMU 准备好运行,它会以文字模式窗口中的图形模式在本机系统下运行。 图 1 显示了有三个 QEMU 会话的桌面, Windows XP 运行在 x86 模拟器下,FreeBSD 运行在 x86-64 模拟器下,Debian Linux 运行在 PowerPC 模拟器下。

图 1. QEMU 允许在多个模拟平台上运行多个操作系统
带有三个 QEMU 会话的桌面的图像,Windows XP 运行在 x86 模拟器下,FreeBSD 运行在 x86-64 模拟器下,Debian Linux 运行在 PowerPC 模拟器下
带有三个 QEMU 会话的桌面的图像,Windows XP 运行在 x86 模拟器下,FreeBSD 运行在 x86-64 模拟器下,Debian Linux 运行在 PowerPC 模拟器下

高效使用 QEMU

安装完客户操作系统后,就可以开始用于软件开发或测试。您需要能够在客户和主机之间传输文件。有三种方法实现这项任务,但使用模拟网络是最灵活的方法。还应考虑 QEMU 模拟与软件开发相关的功能和限制,以发挥模拟器的最大优势。

管理文件传输

QEMU 提供若干网络选项。默认是用户模式网络,它与网络地址翻译(NAT)配置类似:用户操作系统可以使用网络客户端连接其他计算机,包括主机操作系统和其他网络服务器,但其他系统需要特别配置才能连接客户操作系统。QEMU 提供自身的动态主机配置协议(DHCP)和域名系统(DNS)服务器用于客户操作系统本身。对于客户操作系统,主机就是一个网关系统。

如果您打算使用 Network File System (NFS)、Server Message Block (SMB)/Common Internet File System(CIFS)、Secure Shell (SSH) 或其他客户端从用户与主机传递文件,默认配置已经足够。但是,必须在主机端运行合适的服务器。如果想要初始化其他方向的连接,必须使用 -redir 选项将主机系统上的端口重新指向客户操作系统。例如,以下命令将主机的 2222 端口重新指向客户的 22 端口:

qemu-system-ppc -hda linuxppc.qcow2 -boot c -m 512 -redir tcp:2222::22

执行该命令的结果是可以使用 SSH 通过输入 ssh localhost -p 2222 从主机端登录客户端。也可以从网络中其他计算机访问客户端。因此要设定新的固件规则。当然,需要在客户操作系统运行 SSH 服务器。您可用同样的方式重定向 NFS、SMB/CIFS 或其他端口。

软件开发技巧

现在 QEMU 已安装并运行客户操作系统,现在可以开始开发软件。既可用模拟器下的原有编译器,也可用主机上的跨编译器。对于需要在客户操作系统反复编译和测试软件的大型开发项目,跨编译器可能更快,但其安装配置已超出本文范围。模拟器下运行的编译器适合于小型项目,或不经常编译软件的项目。

对于软件,计算机就像是目标平台的真实例子,可用于最实际的用途。一些特性,如字节顺序、CPU 一致性以及其他硬件基本特性就像在一台真实计算机上一样运行正常。我使用过真实的 PowerPC Apple iMac 和基于 QEMU 的 PowerPC 系统开发和测试全局惟一标识符(GUID)分区表(GPT) fdisk 程序的 PowerPC 版本,该程序需要知道 CPU 的字节顺序,在我看来,基于 QEMU 的系统与真实的 iMac 别无二致,除了 QEMU 系统有些慢。

这说明,如果深入探究,确实有些差异。例如,QEMU 的模拟硬盘会返回 “QEMU HARDDISK” 的模式字符串,与真实的硬盘驱动器不同。总的来说,QEMU 的虚拟硬盘有些过时;硬盘都是 PATA 或 Small Computer System Interface (SCSI) 设备,这根据具体平台,视频硬件也过时了。可以在 QEMU 文档中找到虚拟硬件的详细信息。请注意各个版本的详细信息都不同。

在 Linux 下,QEMU 会话占用很少的 CPU 时间,除了客户操作系统工作时。但 QEMU 会话会占用指定给它的 RAM 容量。因此,从实际出发,需要给主机系统大量内存,尤其是打算同时运行多于一个或两个 QEMU 会话时。

更深入的内容

QEMU 是个有多个选项的大安装包,其中很多让一些开发人员很感兴趣。例如,可以更改模拟网卡的模式,给客户机器一个真实网络中单独的 Internet Protocol(IP) 地址 ,将各种硬件端口重新定向到客户操作系统,组合选取各种硬件选项。如果这些特性对您很重要,那么这些 QEMU 文档将会非常重要。


相关主题


评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Linux, Open source
ArticleID=478157
ArticleTitle=使用 QEMU 进行跨平台开发
publish-date=03292010