【IT168 专稿】QEMU是一套由Fabrice Bellard]所编写的仿真处理器的自由软件。它与Bochs,PearPC近似,但其具有某些后两者所不具备的特性,如高速度及跨平台的特性。经由kqemu这个开源的加速器,QEMU能仿真至接近真实计算机的速度。本文所介绍的一种有趣的虚拟化应用程序 QEMU 并非目前的热门技术。QEMU 应用程序适用于各种设置。可用于来宾操作系统的虚拟化,或作为完整的机器仿真器使用,运行使用主机 CPU 或其他 CPU 架构的操作系统。
一、QEMU简介
QEMU有两种主要运作模式:
QEMU应用程序适用于各种设置。可用于来宾操作系统的虚拟化,或作为完整的机器仿真器使用,运行使用主机CPU或其它CPU架构的操作系统。一种有用的技术称为仿真。仿真,顾名思义,通过模拟完整的硬件环境来虚拟化来宾平台。仿真可通过多种方法实现,即使在同一个解决方案中也是如此。通过仿真实现虚拟化的技术有QEMU和Bochs。
QEMU的优点
可以仿真 IA-32 (x86)个人计算机,AMD64个人计算机, MIPS R4000,升阳的 SPARC sun3 与 PowerPC(PReP 及 Power Macintosh)架构
支持其它架构,不论在主机或虚拟系统上(请参看QEMU主页以获取完整的清单)
增加了仿真速度,某些程序甚至可以实时运行
可以在其它平台上运行Unix、Linux的程序
可以储存及还原运行状态(如运行中的程序)
可以虚拟网络卡
可模拟多CPU
QEMU架构如图-1
图-1 QEMU架构
1.QEMU两种模式的基本操作
QEMU支持两种操作模式:用户模式仿真(User mode)和系统模式仿真(System mode)。
用户模式仿真
QEMU能启动那些为不同中央处理器编译的Linux程序。而Wine及Dosemu是其主要目标。用户模式仿真允许一个CPU构建的进程在另一个CPU上执行(执行主机CPU指令的动态翻译并相应地转换Linux系统调用)。
系统模式仿真
系统模式仿真允许对整个系统进行仿真,包括处理器和配套的外围设备。在x86主机系统上仿真x86代码时,使用QEMU加速器可以实现近似本地的性能。这让我们能够直接在主机CPU上执行仿真代码(在Linux上通过kernel模块执行)。但是从技术角度看,QEMU的有趣之处在于其快速、可移植的动态翻译程序。动态翻译程序允许在运行时将用于目标(来宾)CPU的指令转换为用于主机CPU,从而实现仿真。这可以通过一种强制方法实现(将指令从一个CPU映像到另一个CPU)。但是情况并非总是这样简单,在某些情况下,根据所翻译的架构,可能需要使用多个指令或行为更改。QEMU实现动态翻译的方法是,首先将目标指令转换为微操作。这些微操作是一些编译成对象的C代码。然后构建核心翻译程序。它将目标指令映像到微操作以进行动态翻译。这不仅可产生高效率,而且可以移植。QEMU的动态翻译程序还缓存了翻译后的代码块,使翻译程序的内存开销最小化。当初次使用目标代码块时,翻译该块并将其存储为翻译后的代码块。QEMU将最近使用的翻译后的代码块缓存在一个16MB的块中。QEMU甚至可以通过在缓存中将翻译后的代码块变为无效来支持代码的自我修改。
要了解QEMU及其动态翻译程序的更多内部细节,请参阅QEMU的作者所撰写的有趣文章(Fabrice Bellard的"QEMU, a Fast and Portable Dynamic Translator"(PDF),了解QEMU动态翻译的内部细节)。
二 、OpenSolaris下使用QEMU进行系统仿真
1.构建和安装QEMU
构建和安装QEMU与使用标准的GNU工具一样简单。下载并打开QEMU for Solaris版本之后,configure,然后make install,任务就完成了。具体操作如下:
使用命令行下载安装gcc
#pkg install SUNWgcc
也可以使用IPS图形化工具安装gcc,映像包管理系统 (Image Packaging System, IPS) 是与网络系统信息库进行交互的一种软件交付系统。IPS 软件是为进行软件生命周期管理(包括安装、升级和删除)而提供的一种框架。是用于提供软件包的安装、升级和删除等软件生命周期管理的框架。使用 IPS,用户还可以创建自己的软件包、创建和管理打包系统信息库以及镜像现有的打包系统信息库。OpenSolaris发行版使用 IPS 作为其打包系统。在初始安装 OpenSolaris操作系统之后,您会发现不能立即使用许多常用的软件应用程序。您可以通过映像包管理系统 CLI 和 GUI(软件包管理器)客户端从打包系统信息库安装这些软件应用程序。在系统中安装软件包之后,可以使用 IPS 客户端对其进行搜索、升级和管理。IPS 客户端还可用来将整个系统升级到 OpenSolaris 的新发行版、创建和管理系统信息库以及镜像现有的系统信息库。映像包管理系统软件是以网络为中心的打包系统。
使用IPS图形化工具安装gcc界面如图-2 。
图-2 使用IPS图形化工具安装gcc
软件包管理器的主窗口包含以下几个组成部分:
菜单条: 可以使用菜单条上的菜单来执行与软件包管理器相关的所有命令。
工具栏: 工具栏包含可以使用菜单条上的菜单来执行的部分命令的图标。搜索框也位于工具栏中。
按类别显示的软件包列表:此下拉式菜单会显示可用类别(如桌面应用程序、基于 Web 的应用程序和操作系统)的列表。
按状态显示的软件包列表
软件包详细信息:单击某个软件包名称即可将其选中。此窗口中将显示选定软件包的详细信息,如名称、版本、文件相关项和许可证。
系统信息库下拉式菜单:可用系统信息库的列表显示在系统信息库下拉式菜单中。单击某个系统信息库名称即可将其选中。
搜索框
#wget http://www.opensolaris.org/os/project/qemu/downloads/qemu-src-CVSdrop- 12112007-pluspatches.tar.bz2
#bunzip2 qemu-src-CVSdrop-12112007-pluspatches.tar.bz2
# tar fvz qemu-src-CVSdrop-12112007-pluspatches.tar
# cd qemu
设置路径
32位系统:
#PATH=/usr/sfw/bin:/usr/bin:/usr/ccs/bin:/usr/perl5/bin
64位系统:
#PATH=/usr/bin/amd64:/usr/sfw/bin:/usr/ccs/bin:/usr/perl5/bin
编译
32位系统:
# ./configure --prefix=/opt/qemu --target-list=i386-softmmu --disable-gcc- check
#gmake install
64位系统:
# ./configure --prefix=/opt/qemu --target-list=x86_64-softmmu,i386-softmmu --disable-gcc- check
# gmake install
2.构建QEMU加速器
#wget http://www.opensolaris.org/os/project/qemu/downloads/kqemu_1.0.3pre11- 20070520. tar.bz2
#bunzip2 kqemu_1.0.3pre11-20070520.tar.bz2
#tar vxf kqemu_1.0.3pre11-20070520.tar
#./configure
#gmake kqemu32
# gmake install32
#chmod 666 /dev/kqemu
三、使用QEMU
现在考察一下使用QEMU虚拟化另一台带典型的桌面环境的机器的情况。仿真另一台机器与处理新计算机类似。第一步是安装操作系统。新计算机必须要有安装操作系统的空间,因此需要一个硬盘。QEMU提供了一条特殊的命令创建硬盘,此命令称为qemu-img。此工具可以创建各种格式的映象,但非常好的的格式(对于qemu)称为qcow(或qemu写时复制)。这种格式的优点在于磁盘映象的大小与表示映象的物理文件的大小不同。换言之,该格式允许实现更紧凑的磁盘映象。例如,一个空的4GB磁盘映象只需要16KB的空间。对于qemu-img,您需要提供操作类型(create创建新磁盘映象)、格式(qcow用于qemu映象格式)、大小和磁盘映象的名称。下面仿真的机器用于建立一个Windows XP系统。因此,将6GB的磁盘映象创建:
#/opt/qemu/bin/qemu-img create /data/winxp.img 6GB
#/opt/qemu/bin/qemu -m 256 -k en-gb -boot d -hda /data/winxp.img -cdrom /dev/dsk/ c2t0d0s2
ISO 映像是常见的 CD-ROM 格式(在其他地方称为 ISO 9660 文件系统)。现在,您已经仿真了硬盘(disk.img)和 CD-ROM,您可以在上面安装操作系统。下一步是在硬盘上安装操作系统。简单地使用 qemu 即可完成此任务:
下面系统开始安装,完成后从硬盘文件启动:
#/opt/qemu/bin/qemu -m 256 -k en-gb -boot c -hda /data/winxp.img
使用 qemu 时,您使用 hda 选项指定硬盘映像,使用 cdrom 选项指定 cdrom(ISO 映像所在的文件)。boot 选项指定从 CD-ROM 引导。参数 d 指定从 CD-ROM 引导,其中 a 指定从软盘引导,c 指定从硬盘引导(默认),而 n 指定从网络引导。图-3所示是OpenSolaris下运行Windows XP系统截图。
图-3 Opensolaris 下运行Windows XP系统截图
使用图形化工具:JQEMU
JQEMU是QEMU图形(GUI)界面,使用Java编写,需要先安装JDK和QEMU,非常容易使用。作为QEMU x86 PC模拟器的GTK前端程序,相信会给用户带来一些方便。JQemu具有创建并保存多个VM配置、直接从GUI创建磁盘映象文件、将配置存储在用户主目录中、将磁盘映象存储在任何位置、可在GUI中控制多数QEMU命令行选项等特性。功能简介:
- 使用简单,可以轻松通过用户界面实现QEMU模拟器操作。
- 可以简便地通过向导来创建模拟机。
- 使用友好的界面来实现Qemu的所有任务。
使用方法:
#wget http://cdnetworks-kr-2.dl.sourceforge.net/project/jqemu/jqemu/1.0.4/JQEMU. jar
#java -jar JQEMU.jar
JQemu常规设置的工作界面主如图-4 所示。
图-4 JQEMU常规设置工作界面
JQemu常规设置的工作界面用来设置硬盘、光驱、处理器等。
另外JQemu包括常规、网络如图-5、调试、USB几个设置界面。
图-5 JQemu网络设置界面
JQemu网络设置界面包括几种上网方式:
user mode :
这种方式实现虚拟机上网很简单,类似vmware里的nat,qemu启动时加入-user-net参数,虚拟机里使用dhcp方式,即可与互联网通信,但是这种方式虚拟机与主机的通信不方便。
tap:
这种方式要比user mode复杂一些,但是设置好后 虚拟机<-->互联网 虚拟机<-->主机 通信都很容易,这种方式设置上类似vmware的host-only,qemu使用tun/tap设备在主机上增加一块虚拟网络设备(tun0),然后就可以象真实网卡 一样配置它。
在计算机网络中,TUN与TAP是操作系统内核中的虚拟网络设备。不同于普通靠硬件网路板卡实现的设备,这些虚拟的网络设备全部用软件实现,并向运行与操作系统上的软件提供与硬件的网络设备完全相同的功能。
TAP 等同于一个以太网设备,它操作第二层数据包如以太网数据帧。TUN模拟了网络层设备,操作第三层数据包比如IP数据封包。操作系统通过TUN/TAP设备向绑定该设备的用户空间的程序发送数据,反之,用户空间的程序也可以像操作硬件网络设备那样,通过 TNU/TAP设备发送数据。在后种情况下,TUN/TAP设备向操作系统的网络栈投递(或"注入")数据包,从而模拟从外部接受数据的过程。
Socket:
创建一个VLAN n,并使用UDP 多址通信套掊口与其他的QEMU虚拟机进 行共享,尤其是对于每一个使用多址通信地址和端口的QEMU使用同一 个总线. 在这里我们要注意以下几点:
" 几个QEMU可以运行在不同的主机上但却使用同一个总线(在这里假设 为这些主机设置了正确的多址通信)
" mcast支持是与用户模式Linux相兼容的.
" 使用fd=h指定一个已经打开的UDP 多址通信套接口
JQemu调试设置界面如图-6 。
图-6 JQemu调试设置界面
JQemu调试设置界面包括是否关闭KQemu linux启动选项等。下面也要建立一个磁盘映像。如图-7 。
图-7 建立一个磁盘映像
设置完成后单击lanuch按钮即可开始安装,如图-8所示。
图-8设置完成后单击lanuch按钮即可开始安装
安装过程从略。
四、Solaris 10 下使用QEMU
1 配置gcc
与solaris 9不同的是,solaris 10已经默认安装GNU开发工具(GCC,make等)。但版本比较低要重新安装一下最新版本,并且把make和gcc,路径写进文件/etc/profile,:从Solaris 10安装光盘中安装如下工具包
# pkgadd -d /cdrom/Solaris_10/Product SUNWwgetr
# pkgadd -d /cdrom/Solaris_10/Product SUNWwgetu
# pkgadd -d /cdrom/Solaris_10/Product SUNWwgetS
# pkgadd -d /cdrom/Solaris_10/Product SUNWgcmn
2. 下载gcc软件
# wget
ftp://ftp.sunfreeware.com/pub/freeware/intel/10/gcc-3.4.6-sol10-x86-local.gz
# wget
ftp://ftp.sunfreeware.com/pub/freeware/intel/10/libiconv-1.11-sol10-x86-local.gz
# wget
ftp://ftp.sunfreeware.com/pub/freeware/intel/10/libgcc-3.4.6-sol10-x86-local
.gz
# wget
ftp://ftp.sunfreeware.com/pub/freeware/intel/10/libintl-3.4.0-sol10-x86-local.gz
注:第一个为gcc的应用程序,下面3个为gcc的库文件包
3. 解压和安装
# gunzip gcc-3.4.6-sol10-x86-local.gz
# gunzip libiconv-1.11-sol10-x86-local.gz
# gunzip libgcc-3.4.6-sol10-x86-local.gz
# gunzip libintl-3.4.0-sol10-x86-local.gz
#pkgadd -d gcc-3.4.6-sol10-x86-local
#pkgadd -d libiconv-1.11-sol10-x86-local.gz
#pkgadd -d libgcc-3.4.6-sol10-x86-local.gz
#pkgadd -d libintl-3.4.0-sol10-x86-local.gz
4. 修改 .profile文件
在 .profile文件中增加如下内容
export LD_LIBRAEY_PATH=/usr/local/lib:.
export CC=gcc
5 安装配置qemu
过程和上面相同从略。
五、总结
1 其他仿真器简介
虽然 QEMU 是一种极好的仿真环境,但是其他环境也值得研究一下。 Wine 是 Windows API 的一个开源实现,允许您在没有 Windows 操作系统的情况下运行 Windows 程序。但是如 Wine 缩略词所表示的那样,Wine 不是仿真器。相反,Wine 实现了一组 API,这些 API 允许执行 x86 架构的应用程序。因此,运行在 Wine 上的应用程序可以很好地执行。
与 QEMU 类似的仿真器是 Bochs。Bochs 是一种机器仿真器,它不仅可以仿真 Intel? 的 i386?、i486?、Pentium?、Pentium Pro 和 Advanced Micro Devices 的 AMD64 CPU,还可以仿真常见 PC 外围设备,如磁盘、内存、显示器和网络设备。Bochs 已被用于仿真 Linux、DOS 和 Windows 95/98/XP/2000/NT? 操作系统。
QEMU和OPensolaris 下其他虚拟机比较
表-1 Sun几种虚拟化技术的比较
比较项目 | 资源管理 | Zone | xVM Hypervisor | LDoms | VirtualBox | QEMU |
性能 | 高 | 高 | 中等 | 中等 | 低 | 低 |
效率 | 高 | 高 | 中等 | 中等 | 低 | 低 |
可伸缩性 | 高 | 高 | 中等 | 中等 | 低 | 中 |
隔离程度 | 低 | 中等 | 高 | 高 | 高 | 高 |
灵活性 | 低 | 中等 | 高 | 高 | 高 | 高 |
可移植性 | 中等 | 中等 | 低 | 低 | 高 | 高 |
使用难易 | 低 | 中等 | 低 | 低 | 高 | 中 |