如何让 QEMU 使用命名的 Docker 接口?

如何让 QEMU 使用命名的 Docker 接口?

问题

是否可以让 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(compose)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 需要哪些 network/nic/net 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 需要哪些网络/nic/net QEMU 设置才能位于同一个自定义 Docker 网络上(不使用主机上的网桥)?

在仔细阅读了有关 QEMU 网络工作原理和 Docker 网络的大量细节后,我发现 QEMU 只能使用接口tun/tap绕过内部 VM 网关和内部 VM DHCP 服务。因此,我能找到的唯一解决方案是:

添加一个名为“pxe-tap”的 tap

# sudo modprobe tap
sudo ip tuntap add mode tap pxe-tap

将 tap 连接到命名的 Docker 接口 pxe0(这是一个桥梁 - 很重要)并将其升起。

sudo ip link set pxe-tap master pxe0
sudo ip link set dev pxe-tap up

然后,来自 QEMU 的通信将在指定的 Docker 网络上进行。

相关内容