QEMU で名前付き Docker インターフェースを使用するにはどうすればよいでしょうか?

QEMU で名前付き Docker インターフェースを使用するにはどうすればよいでしょうか?

質問

QEMU で同じホスト マシン上の名前付き Docker インターフェイスとネットワークを使用することは可能ですか?


動機付けの例:

次のように、静的 IP を持つ Docker コンテナ内に DHCP サーバーがあるとします。

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が同じカスタムDockerネットワーク上にあるためには、どのようなネットワーク/NIC/ネットQEMU設定が必要ですか(ないホスト上でブリッジを使用するなど)?

私はこのようなことを考えています。

-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 を同じカスタム Docker ネットワーク (ホスト上のブリッジを使用しない) に配置するには、どのようなネットワーク/NIC/ネット QEMU 設定が必要ですか?

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 ネットワーク上で行われるようになります。

関連情報