來自在 qemu 上運行的 quest 作業系統的網路和 Samba

來自在 qemu 上運行的 quest 作業系統的網路和 Samba

我正在嘗試在大端系統上測試一些軟體以確保相容性。我的計劃是在 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 等服務。

相關內容