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 错误。
QEMU 可以使用 TAP 接口为客户机操作系统提供完整的网络功能。当客户机操作系统运行多个网络服务并必须通过标准端口连接时,这很有用;当需要除 TCP 和 UDP 之外的协议时;以及当 QEMU 的多个实例需要相互连接时(尽管这也可以通过用户模式网络通过端口重定向或套接字来实现)。
在 QEMU 1.1 及更高版本中,网络桥接助手 可以为您设置 tun/tap,无需额外的脚本。
对于旧版本,设置 TAP 接口比用户模式网络复杂一些。它需要在主机操作系统上安装虚拟专用网络 (VPN),然后在主机网络和虚拟网络之间建立桥接。
以下是使用 Fedora 8 以静态 IP 地址分配执行此操作的方法。该过程在其他 Linux 发行版上应该非常相似,在其他 *nix 系统上可能也不太不同。
根据 tuntap.txt,我们首先创建 TAP/TUN 设备
$ sudo mkdir /dev/net $ sudo mknod /dev/net/tun c 10 200 $ sudo /sbin/modprobe tun
首先,设置一个脚本以创建桥接并启动 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 退出后重置您的网络。为了保持一致,我们将它称为 /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
现在创建一个脚本以使用 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 保持已知连接的列表,如果它找到该列表中不存在的网络连接,它将提示用户指示这是一个“家庭”、“工作”还是“公共”网络。网络由其默认网关的 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 客户机系统。
如果主机系统安装了 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 桥接到 Linux 的论坛帖子
- 无需桥接真实网络接口即可创建虚拟专用网络的脚本。使用类似于此处所示的 tap 设备,但不触及真实的网络接口。类似于 Vmware 中的 vmnet1-vmnet7。然后,使用 iptables 配置子网,就像在 LAN 上配置真实的物理专用子网一样。
- ↑ "qemu git". 提交信息. 2012年9月14日.