QEMU 快速使用指南 (译)

  2014-02-14 00:00:00 CST

  Jingwen Peng

  Linux

Linux-Penguin

本文翻译自 Linux for You 网站上的文章 The Quick Guide to QEMU Setup (2011.5)

正文如下


在接下来的一系列文章中,我们将逐一介绍 QEMU 的基本使用、操作系统安装、QEMU 的网络设置 以及 利用 QEMU 针对 ARM 架构进行嵌入式开发。下面我们从 QEMU 基础开始我们的第一部分。

当我最初使用电脑的时候,我惊呆了。只需要点一下鼠标就能放音乐、看电影、玩游戏,这对于当时的我来说很神奇。时过变迁,我了解了编译和代码。我的好奇心激起了我对代码热情。即使已经编译好的软件包越来越容易获取,但我还是倾向于源码安装。我对 QEMU 就这么做。 QEMU 是最好的模拟器之一。当然,仍然没有多少人能够物尽其用。本篇文章内容比较基础,但是可以期待在后面有一些有趣的东西。

源码安装 QEMU

第一步,下载 QEMU 源码;目前最新版本是 0.14,这里 有下载地址。解压源码包,进入 QEMU 目录:

1
2
$ tar -zxvf qemu-0.14.0.tar.gz
$ cd qemu-0.14.0

运行配置脚本。我们将针对 i386 架构进行编译。 (它也可为其他架构编译,如 ARM、PPC、SPARC 等。) 接下来我们要在虚拟机里面安装 Ubuntu 发行版——这就是我们为什么选择针对 i386 架构编译 QEMU:

1
$ ./configure –target-list=i386-softmmu

希望你在运行 configure 脚本的时候没有碰到什么错误。如果出现问题,可能是因为缺少了某个库或者头文件。去找到它然后安装就能解决问题。

当 configure 脚本执行完毕,使用 make 命令编译代码。编译完成后,QEMU 的二进制文件应该安装到合适的位置。在我的 Fedora 系统上,我使用 su 命令来获得必要的 root 权限,然后使用 make install 来安装。

使用 qemu 命令来检查一下 QEMU 是否安装成功,如果运行时弹出一个像图1一样的窗口那么说明安装成功。

Install-Test

图 1:测试QEMU的安装

创建新虚拟机

如果你熟悉其他的虚拟化软件,你可能好奇如何使用 QEMU 创建一个新的虚拟机。第一步是为虚拟机创建一个硬盘镜像。然后就可以安装 Ubuntu 9.10 了;这里我们创建一个 10GB 的硬盘镜像就足够了。使用以下命令创建:

1
2
3
$ qemu-img create ubuntu.img 10G
$ ls -lh ubuntu.img
-rw-r--r--. 1 root root 10G Mar 11 11:54 ubuntu.img

下一步是安装 Ubuntu (我已经下载好了 Ubuntu 9.10 (Karmic) 的 ISO 镜像,放在我的工作目录下) :

1
$ qemu -hda ubuntu.img -boot d -cdrom ./ubuntu-9.10-desktop-i386.iso -m 512

在上面的命令中,-hda 选项用来指定磁盘镜像文件;-cdrom 用来指定 CD-ROM 或者 ISO 镜像来作为虚拟机的光驱。-m 选项指定虚拟机所使用的内存大小 (此种情况下,内存大小我申请为 512MB;你可以根据自己的需要和硬件状况来决定) 。最后,我们使用 -boot d 选项让 QEMU 从 ISO 镜像启动虚拟机。运行上述命令后,虚拟机启动,然后出现 Ubuntu 启动菜单 (见图2) 。

Install-Ubuntu

图 2:使用QEMU安装Ubuntu

下面就像你在真机上安装系统一样的操作。安装完成后,你可以直接使用以下命令从硬盘镜像启动虚拟机。

1
$ qemu -m 512 -hda ubuntu.img

图3为从硬盘镜像启动的虚拟机

Boot-Ubuntu

图 3:启动已安装的操作系统

下一步我们要做的是设置网络。 ## QEMU 网络设置 设置 QEMU 虚拟机的网络是很麻烦的事情。我们使用与硬件以太网设备不同的内核虚拟网络设备 TAP 和 TUN;TAP 和 TUN 只有内核支持 (如,只在软件中) 。TAP 工作在数据链层,而 TUN 工作在网络层。

QEMU 可以使用 TAP 接口为虚拟机提供完整的网络支持。在此之前,我们需要在宿主机上安装 VPN (虚拟专用网) 软件包,然后在 host 和 guest 之间建立桥接。安装 openvpnbridge-utils 软件包:

1
2
$ yum install openvpn
$ yum install bridge-utils

现在,用以下内容创建 qemu—qemu-ifupqemu-ifdown 两个脚本:

1
2
3
4
5
6
7
8
9
10
11
#qemu-ifup
/sbin/ifconfig eth1 down
/sbin/ifconfig eth1 0.0.0.0 promisc up
openvpn --mktun --dev tap0
ifconfig tap 0 0.0.0.0 up
brctl addbr br0
brctl addif br0 eth1
brctl addif br0 tap0
brctl stp br0 off
ifconfig br0 10.10.10.2 netmask
255.255.255.0

上面这个脚本用来开启 QEMU 网络设置,第一行,禁用 Ethernet 设备,由于 Ethernet 接口是桥接网络的一部分,所以我们在第二行将其 IP 地址设置为 0.0.0.0。在第三、四行,我们创建了并且启动了 TAP/tap0。下面几步,使用 eth1 和 tap0 创建桥接。最后,给桥指定一个 IP 地址。

下面是 qemu-ifdown 脚本:

1
2
3
4
5
6
7
#qemu-ifdown
ifconfig eth1 down
ifconfig eth1 -promisc
ifup eth1
ifconfig br0 down
brctl delbr br0
openvpn --rmtun --dev tap0

这个脚本用来关闭 QEMU 网络;见文知义,关闭两个接口,删除网桥,和 tap0 设备。

把这两个脚本复制到你的 /etc 目录下,然后进行测试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$ /etc/qemu-ifup
Wed Apr 6 15:53:50 2011 TUN/TAP device tap0 opened
Wed Apr 6 15:53:50 2011 Persist state set to: ON

$ ifconfig br0
br0       Link encap:Ethernet HWaddr 00:25:11:74:5B:0C
          inet addr:10.10.10.2 Bcast:10.10.10.255 Mask:255.255.255.0
          inet6 addr: fe80::225:11ff:fe74:5b0c/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:29 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 b)  TX bytes:7539 (7.3 KiB)

$ ifconfig tap0
tap0      Link encap:Ethernet HWaddr C2:10:27:8C:B8:35
          UP BROADCAST MULTICAST MTU:1500 Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

虚拟设备 tap0 和网桥 br0 都启动了,脚本运行正常。

1
2
3
4
$ /etc/qemu-ifdown
Error: Connection activation failed: Device not managed by NetworkManager
Wed Apr 6 15:56:44 2011 TUN/TAP device tap0 opened
Wed Apr 6 15:56:44 2011 Persist state set to: OFF

一切设置正常;是时候启动完整网络支持的 Ubuntu 虚拟机了。 开启网络 (使用 root 用户) :

1
$ /etc/qemu-ifup

然后启动虚拟机 (使用普通用户) :

1
$ qemu -m 512 -hda ubuntu.img -net nic -net tap,ifname=tap0,script=no

当机器启动之后,在虚拟机里设置 eth0 接口的IP地址:

1
$ sudo ifconfig eth0 10.10.10.100 netmask 255.255.255.0

试着 ping 以下网桥的 IP (结果见图4) :

1
$ ping 10.10.10.2

QEMU-Networking 图4:QEMU 使用内核网络虚拟设备

现在虚拟机的网络正常了,可以做一些实验了。试着在 host 上建立一个代理服务器,然后从 guest 连接到网络。

上述为 QEMU 的简单介绍。你可以期待接下来的更多文章!

相关文章

QEMU快速使用指南 (译)

使用QEMU进行嵌入式系统开发 第1部分 (译)

使用QEMU进行嵌入式系统开发 第2部分 (译)

使用QEMU进行嵌入式系统开发 第3部分 (译)

如果您有疑问或建议,请在下方评论区域留言

遵循 BY-NC-ND 协议

评论功能加载中...