Как заставить QEMU использовать именованный интерфейс Docker?

Как заставить QEMU использовать именованный интерфейс Docker?

Вопрос

Можно ли заставить QEMU использовать именованный интерфейс Docker и сеть на одной хост-машине?


Мотивирующий пример:

Допустим, у меня есть DHCP-сервер в контейнере Docker со статическим IP-адресом, работающий следующим образом:

pxe_1    | Interface: eth0
pxe_1    | IP: 172.16.100.11
pxe_1    | Subnet: 172.16.100
pxe_1    | Starting PXE server...
...

DHCP-сервер Docker (compose) находится в собственной сети на том же хосте с именованным интерфейсом 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 не доходят до контейнера Docker на том же хосте.

Какие настройки сети/NIC/net QEMU необходимы для того, чтобы виртуальная машина 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

Какие настройки сети/NIC/net QEMU необходимы для того, чтобы виртуальная машина QEMU находилась в той же пользовательской сети Docker (без использования моста на хосте)?

После большого количества чепухи с чтением в тонких деталях о том, как работает сеть QEMU и сеть Docker, QEMU может использовать только интерфейс tun/tapдля обхода внутреннего шлюза виртуальной машины и внутренней службы 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.

Связанный контент