我正在嘗試在大端系統上測試一些軟體以確保相容性。我的計劃是在 Ubuntu 12.04 上使用 qemu 來模擬 MIPS 系統。到目前為止,我已經能夠成功建立任務系統,但我還無法將其與主機系統聯網。我可以從訪客系統存取外部世界(例如 wget 或 apt-get),但我嘗試設定 samba 失敗了。
根據這,在 QEmu 1.1 及更高版本中,網橋助理可以為您設定 tun/tap,而無需額外的腳本。我正在嘗試使用它,因為我見過不同版本的腳本。現將情況qemu-system-mips -version
通報如下:
QEMU emulator version 1.0.50 (Debian 1.0.50-2012.03-0ubuntu2.1), Copyright (c) 2003-2008 Fabrice Bellard
我從 1.4.1 原始碼編譯並使用apt-get
.兩者都報道了同樣的事情。我假設我擁有 1.1 或更高版本,儘管-version
有什麼告訴我的。無論如何,下一個指令是開啟預設網路助理的 setuid 屬性:
sudo chmod u+s /usr/local/libexec/qemu-bridge-helper
接下來,我在和中創建了一個bridge.conf
文件以獲取權限。該文件的內容是:/etc/qemu/
/usr/local/etc/qemu
-rw-r--r--
allow br0
如果我使用以下命令啟動 QEmu:
qemu-system-mips -M malta -kernel vmlinux-2.6.32-5-4kc-malta -hda disk.img -append "root=/dev/sda1 console=ttyS0" -nographic -net nic -net bridge,br=br0 -smb /home/uli/samba
或與
qemu-system-mips -M malta -kernel vmlinux-2.6.32-5-4kc-malta -hda disk.img -append "root=/dev/sda1 console=ttyS0" -nographic -netdev bridge,id=hn0 -device virtio-net-pci,netdev=hn0,id=nic1
或與
qemu-system-mips -M malta -kernel vmlinux-2.6.32-5-4kc-malta -hda disk.img -append "root=/dev/sda1 console=ttyS0" -nographic -netdev tap,helper=/usr/local/libexec/qemu-bridge-helper,id=hn0 -device virtio-net-pci,netdev=hn0,id=nic1
我收到以下錯誤:
failed to get mtu of bridge `br0': No such device
failed to launch bridge helper
qemu-system-mips: -net bridge,br=br0: Device 'bridge' could not be initialized
公平地說,我沒有創建 br0 橋。我嘗試使用我不理解的腳本創建一個,但隨後我的任務 MIPS QEmu 系統不再連接到任何東西。它看到 br0,但沒有獲得 IP 位址。顯然我在這裡做錯了什麼:
ifconfig br0 down
brctl delbr br0
ifconfig eth2 0.0.0.0 promisc up
brctl addbr br0
brctl setfd br0 0
brctl addif br0 eth2
echo 1 > /proc/sys/net/ipv4/conf/br0/proxy_arp
echo 1 > /proc/sys/net/ipv4/conf/eth2/proxy_arp
echo 1 > /proc/sys/net/ipv4/ip_forward
dhclient br0
ifconfig br0 up
有沒有更簡單的方法來做到這一點?就我個人而言,我只需使用所描述的 \10.0.2.4\qemu 上的 SMB 伺服器就可以了這裡,但這對我來說也不起作用(當我嘗試安裝共享時出現 115 錯誤,大概是因為網路問題)。
更新
建立橋接後,我會在主機上看到 ifconfig 的以下輸出:
br0 Link encap:Ethernet HWaddr XX:XX:XX:XX:XX:XX
inet addr:10.2.32.101 Bcast:10.2.32.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:85 errors:0 dropped:0 overruns:0 frame:0
TX packets:51 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:8235 (8.2 KB) TX bytes:9227 (9.2 KB)
eth2 Link encap:Ethernet HWaddr XX:XX:XX:XX:XX:XX
UP BROADCAST RUNNING PROMISC MULTICAST MTU:1500 Metric:1
RX packets:196581 errors:0 dropped:0 overruns:0 frame:0
TX packets:44205 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:139517339 (139.5 MB) TX bytes:3365206 (3.3 MB)
檢查brctl show
輸出,我看到以下內容:
bridge name bridge id STP enabled interfaces
br0 8000.XXXXXXXXXXXX no eth2
現在我啟動QEmu中的任務系統。如果我執行 ifconfig,我會看到以下內容:
eth0 Link encap:Ethernet HWaddr XX:XX:XX:XX:XX:XX
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:536 errors:1 dropped:51 overruns:0 frame:0
TX packets:13 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:55083 (53.7 KiB) TX bytes:2862 (2.7 KiB)
Interrupt:10 Base address:0x1020
這座橋看起來像這樣:
bridge name bridge id STP enabled interfaces
br0 8000.XXXXXXXXXXXX no eth2
tap0
不幸的是,透過這種設置,任務系統失去了它曾經擁有的有限的「用戶模式」網路(即 wget 和 apt-get 不再工作)。我看到的唯一 IP 位址是網橋的 IP 位址,所以我不確定任務將如何出現在網路上。該主機仍然顯示,其 IP 位址與 br0 相同。
更新
這是 iptables -L 的輸出
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
答案1
當您執行網橋時,網橋 (eth2) 中的成員不應再指派 IP 位址。 br0 現在應該取得 IP。
例子
這是使用 KVM 的系統的輸出。它在底層使用 qemu-kvm,因此它的設定應該與您想要執行的操作類似。
$ ifconfig -a
br0 Link encap:Ethernet HWaddr XX:XX:XX:XX:XX:XX
inet addr:192.168.1.1 Bcast:192.168.1.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:2929289877 errors:0 dropped:0 overruns:0 frame:0
TX packets:842023980 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1992305504701 (1.8 TiB) TX bytes:3609403664141 (3.2 TiB)
eth0 Link encap:Ethernet HWaddr XX:XX:XX:XX:XX:XX
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:3737819958 errors:0 dropped:168 overruns:0 frame:0
TX packets:1233468235 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:2735097151685 (2.4 TiB) TX bytes:4313257594064 (3.9 TiB)
Interrupt:177
看看eth0怎麼沒有IP位址?這也是我的 br0 裝置的樣子:
$ brctl show
bridge name bridge id STP enabled interfaces
br0 8000.XXXXXXXXXXXX no vnet2
vnet1
vnet0
eth0
我有 3 個虛擬機器位於 br0 裝置之上,因此它們可以像真正的實體系統一樣完全參與我的網路。這意味著他們可以提供諸如運行 Samba 等服務。