跳转到内容

QEMU/网络

来自维基教科书,开放的书籍,开放的世界

QEMU 通过模拟一些流行的网络卡 (NIC) 并建立 虚拟局域网 (VLAN) 来支持网络功能。QEMU 客户机有四种连接方式:用户模式、套接字重定向、Tap 和 VDE 网络。

用户模式网络

[编辑 | 编辑源代码]

如果未指定网络选项,QEMU 将默认模拟单个 Intel e1000 PCI 卡,该卡具有桥接到主机网络的用户模式网络堆栈。以下三条命令行是等效的

qemu -m 256 -hda disk.img &
qemu -m 256 -hda disk.img -net nic -net user &
qemu-system-i386 -m 256 -hda disk.img -netdev user,id=network0 -device e1000,netdev=network0,mac=52:54:00:12:34:56 &

要将此网络设置与 Linux 内核一起使用,在编译时必须设置配置选项 CONFIG_E1000=y。

-net 选项在较新的 QEMU 版本中已被 -netdev 替代。[1]

客户机操作系统将看到一个 E1000 NIC,其虚拟 DHCP 服务器位于 10.0.2.2,并将被分配一个从 10.0.2.15 开始的地址。虚拟 DNS 服务器将可通过 10.0.2.3 访问,虚拟 SAMBA 文件服务器(如果存在)将可通过 10.0.2.4 访问,允许您通过 SAMBA 文件共享访问主机上的文件。

用户模式网络非常适合允许访问网络资源,包括 Internet。特别是,它允许从客户机到主机的 ssh。但是,默认情况下,它充当防火墙,不允许任何传入流量。它也不支持除 TCP 和 UDP 之外的协议 - 因此,例如,ping 和其他 ICMP 实用程序将无法正常工作。

端口重定向

[编辑 | 编辑源代码]

要允许在用户模式网络下对客户机操作系统的网络连接,您可以将主机操作系统上的端口重定向到客户机操作系统上的端口。这对于支持客户机操作系统的文件共享、Web 服务器和 SSH 服务器很有用。

以下是使用用户模式网络设置 QEMU 并共享 Windows XP 客户机的文件和网页的方法。主机上的 TCP 端口 5555 重定向到客户机的端口 80(Web 服务器),主机上的 TCP 端口 5556 重定向到客户机的端口 445(Windows 网络)

qemu -m 256 -hda disk.img -redir tcp:5555::80 -redir tcp:5556::445 &
...
mkdir -p /mnt/qemu
mount -t cifs //127.0.0.1/someshare /mnt/qemu -o user=test,pass=test,dom=workgroup,port=5556
firefox https://127.0.0.1:5555/

注意:当通过 Windows 网络共享从客户机到主机的文件夹时,您必须为 mount 将用于登录的用户指定一个密码;如果您尝试使用无密码,mount 将失败并出现 I/O 错误。

TAP 接口

[编辑 | 编辑源代码]

QEMU 可以使用 TAP 接口为客户机操作系统提供完整的网络功能。当客户机操作系统运行多个网络服务并必须通过标准端口连接时,这很有用;当需要除 TCP 和 UDP 之外的协议时;以及当 QEMU 的多个实例需要相互连接时(尽管这也可以通过用户模式网络通过端口重定向或套接字来实现)。

在 QEMU 1.1 及更高版本中,网络桥接助手 可以为您设置 tun/tap,无需额外的脚本。

对于旧版本,设置 TAP 接口比用户模式网络复杂一些。它需要在主机操作系统上安装虚拟专用网络 (VPN),然后在主机网络和虚拟网络之间建立桥接。

以下是使用 Fedora 8 以静态 IP 地址分配执行此操作的方法。该过程在其他 Linux 发行版上应该非常相似,在其他 *nix 系统上可能也不太不同。

TAP/TUN 设备

[编辑 | 编辑源代码]

根据 tuntap.txt,我们首先创建 TAP/TUN 设备

   $ sudo mkdir /dev/net
   $ sudo mknod /dev/net/tun c 10 200
   $ sudo /sbin/modprobe tun

qemu-ifup

[编辑 | 编辑源代码]

首先,设置一个脚本以创建桥接并启动 TAP 接口。我们将此脚本称为 /etc/qemu-ifup

#!/bin/sh 
# 
# script to bring up the tun device in QEMU in bridged mode 
# first parameter is name of tap device (e.g. tap0)
#
# some constants specific to the local host - change to suit your host
#
ETH0IPADDR=192.168.0.3
MASK=255.255.255.0
GATEWAY=192.168.0.1
BROADCAST=192.168.0.255
#
# First take eth0 down, then bring it up with IP address 0.0.0.0 
#
/sbin/ifdown eth0
/sbin/ifconfig eth0 0.0.0.0 promisc up
#
# Bring up the tap device (name specified as first argument, by QEMU)
#
/usr/sbin/openvpn --mktun --dev $1 --user `id -un`
/sbin/ifconfig $1 0.0.0.0 promisc up
#
# create the bridge between eth0 and the tap device
#
/usr/sbin/brctl addbr br0
/usr/sbin/brctl addif br0 eth0
/usr/sbin/brctl addif br0 $1
# 
# only a single bridge so loops are not possible, turn off spanning tree protocol
#
/usr/sbin/brctl stp br0 off 
# 
# Bring up the bridge with ETH0IPADDR and add the default route 
#
/sbin/ifconfig br0 $ETH0IPADDR netmask $MASK broadcast $BROADCAST
/sbin/route add default gw $GATEWAY
#
# stop firewall - comment this out if you don't use Firestarter
#
/sbin/service firestarter stop 

qemu-ifdown

[编辑 | 编辑源代码]

您还需要一个脚本在 QEMU 退出后重置您的网络。为了保持一致,我们将它称为 /etc/qemu-ifdown

#!/bin/sh 
# 
# Script to bring down and delete bridge br0 when QEMU exits 
# 
# Bring down eth0 and br0 
#
/sbin/ifdown eth0
/sbin/ifdown br0
/sbin/ifconfig br0 down 
# 
# Delete the bridge
#
/usr/sbin/brctl delbr br0 
# 
# bring up eth0 in "normal" mode 
#
/sbin/ifconfig eth0 -promisc
/sbin/ifup eth0 
#
# delete the tap device
#
/usr/sbin/openvpn --rmtun --dev $1
#
# start firewall again
# 
/sbin/service firestarter start 

允许用户调用脚本

[编辑 | 编辑源代码]

在 qemu 1.1 及更高版本中,只需使用 助手程序,它不需要任何脚本并且可以设置为 root。

对于旧版本,上面的两个脚本需要以超级用户身份运行,以便它们可以修改系统的网络设置。实现这一点最方便的方法是允许 QEMU 的用户使用 sudo 命令调用这些脚本。要设置它,请将以下内容添加到文件 /etc/sudoers

User_Alias QEMUERS = fred, john, milly, ...

Cmnd_Alias QEMU = /etc/qemu-ifup, /etc/qemu-ifdown

QEMUERS ALL=(ALL) NOPASSWD: QEMU

使用 TAP 接口启动 QEMU

[编辑 | 编辑源代码]

现在创建一个脚本以使用 VLAN 启动 QEMU,并在它退出时清理自身。此脚本使用 tap0。指定 script=no 表示告诉 QEMU 只使用 tap 设备,不调用脚本 - 我们这样做是为了让 QEMU 可以作为普通用户运行,而不是 root。

#!/bin/sh 
sudo /etc/qemu-ifup tap0
qemu -m 256 -hda disk.img -net nic -net tap,ifname=tap0,script=no,downscript=no
sudo /etc/qemu-ifdown tap0

运行该脚本,它将创建一个 TAP 接口,将其桥接到 eth0,运行 QEMU,并在退出时再次删除桥接和 TAP 接口。

Windows Vista 及更高版本 - 网络位置

[编辑 | 编辑源代码]

Windows Vista 及更高版本将网络连接分类为公共或私有。分类决定了将应用于该连接的防火墙规则。Windows 保持已知连接的列表,如果它找到该列表中不存在的网络连接,它将提示用户指示这是一个“家庭”、“工作”还是“公共”网络。网络由其默认网关的 MAC 地址标识,QEMU 似乎每次启动时都会随机分配该地址。结果是,每次使用 QEMU 启动 Windows 会话时,都会弹出一个窗口,要求您指示“网络位置”。这通常不是一个严重的问题,但它可能很烦人。

解决方案是强制 netdev 接口始终使用相同的 MAC 地址。QEMU 似乎没有提供设置此选项的选项,但可以在 ifup 脚本中设置。使用 Iproute2(已取代 ifconfig),命令

ip link set dev tapn address 52:54:00:12:34:56

将主机端接口的 MAC 地址更改为给定的地址,该地址可以是本地网络中唯一的任何合法 MAC 地址。

套接字

[编辑 | 编辑源代码]

QEMU 可以使用 TCP 或 UDP 套接字在 VLAN 上连接多个 QEMU 客户机系统。


Clipboard

要做到
完成本节


此处描述

SMB 服务器

[编辑 | 编辑源代码]

如果主机系统安装了 SMB 服务器(*nix 上的 SAMBA/CIFS),QEMU 可以使用 -smb 选项为客户机系统模拟虚拟 SMB 服务器。指定要共享的文件夹,它将可供客户机以 \\10.0.2.4\qemu 的形式访问(或者您可以将 10.0.2.4 放入 hosts 或 lmhosts 文件中作为 smbserver 并映射到 \\smbserver\qemu)。

qemu -m 256 disk.img -smb /usr/workspace/testing01

这并非严格必要,因为 QEMU 中的访客通常可以访问主机环境中的 SMB 服务器。然而,这对于为每个 QEMU 访客设置独立的工作区非常有用,而无需为每个访客配置 SMB 共享。

[编辑 | 编辑源代码]

参考文献

[编辑 | 编辑源代码]
  1. "qemu git". 提交信息. 2012年9月14日.
华夏公益教科书