問題
是否可以讓 QEMU 在同一主機上使用命名的 Docker 介面和網路?
激勵範例:
假設我在 Docker 容器中有一個 DHCP 伺服器,其靜態 IP 運行如下:
pxe_1 | Interface: eth0
pxe_1 | IP: 172.16.100.11
pxe_1 | Subnet: 172.16.100
pxe_1 | Starting PXE server...
...
Docker(組成)DHCP 伺服器位於同一主機上的自己的網路中,具有命名介面 pxe0:
networks:
pxenet:
driver: bridge
ipam:
driver: default
config:
- subnet: 172.16.100.0/24
gateway: 172.16.100.1
driver_opts:
com.docker.network.bridge.name: pxe0
假設我想在 QEMU 中運行引導程序,並使 DHCP 廣播到達上面的 Docker 容器。這是我的命令:
qemu-system-aarch64 \
-serial stdio \
-machine virt,gic-version=3 \
-cpu cortex-a53 \
-m 256M \
-smp 4 \
-bios u-boot.bin
引導程式啟動如下所示:
U-Boot 2021.01-rc1-g896cc5aa (Nov 06 2020 - 23:33:35 -0800)
...
BOOTP broadcast 1
DHCP client bound to address 10.0.2.15 (2 ms)
Using virtio-net#32 device
TFTP from server 10.0.2.2; our IP address is 10.0.2.15
...
來自 QEMU VM 的封包未到達同一主機上的 Docker 容器。
QEMU VM 需要哪些網路/網卡/網路 QEMU 設定才能位於相同自訂 Docker 網路上(不是在主機上使用網橋)?
我正在思考這樣的事情,
-netdev tap,id=pxe0,ifname=pxe0,script=no,downscript=no \
-device e1000,netdev=pxe0,mac=52:55:00:d1:55:01
但失敗了
qemu-system-aarch64:無法配置 /dev/net/tun (pxe0):參數無效
儘管ip a
揭露
477: pxe0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:8f:81:41:e3 brd ff:ff:ff:ff:ff:ff
inet 172.16.100.1/24 brd 172.16.100.255 scope global pxe0
valid_lft forever preferred_lft forever
inet6 fe80::42:8fff:fe81:41e3/64 scope link
valid_lft forever preferred_lft forever
答案1
QEMU VM 需要哪些網路/網卡/網路 QEMU 設定才能位於相同自訂 Docker 網路(不使用主機上的網橋)?
在詳細閱讀了大量有關 QEMU 網路如何運作和 Docker 網路的廢話之後,QEMU 只能使用tun/tap
介面來繞過內部 VM 閘道和內部 VM DHCP 服務。因此,我能找到的唯一解決方案是:
加上一個名為“pxe-tap”的水龍頭
# sudo modprobe tap
sudo ip tuntap add mode tap pxe-tap
將水龍頭連接到指定的 Docker 介面 pxe0(這是一個橋接 - 很重要)並將其抬起。
sudo ip link set pxe-tap master pxe0
sudo ip link set dev pxe-tap up
來自 QEMU 的通訊將在指定的 Docker 網路上進行。