跳轉到內容

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 ///someshare /mnt/qemu -o user=test,pass=test,dom=workgroup,port=5556
firefox https://: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日.
華夏公益教科書