¿Cómo hacer que QEMU utilice una interfaz Docker con nombre?

¿Cómo hacer que QEMU utilice una interfaz Docker con nombre?

Pregunta

¿Es posible hacer que QEMU utilice una interfaz y una red Docker con nombre en la misma máquina host?


Ejemplo motivador:

Digamos que tengo un servidor DHCP en un contenedor Docker con IP estática que se ejecuta de la siguiente manera:

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

El servidor DHCP Docker (compose) está en su propia red en el mismo host con una interfaz denominada 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

Digamos que quiero ejecutar un gestor de arranque en QEMU y que las transmisiones DHCP lleguen al contenedor Docker anterior. Este es mi comando:

qemu-system-aarch64 \
-serial stdio \
-machine virt,gic-version=3 \
-cpu cortex-a53 \
-m 256M \
-smp 4 \
-bios u-boot.bin

El inicio del gestor de arranque se ve así:

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
...

Los paquetes de QEMU VM no llegan al contenedor Docker en el mismo host.

¿Qué configuraciones de red/nic/net QEMU son necesarias para que la VM QEMU esté en la misma red Docker personalizada (nousando un puente en el host)?

Estoy pensando en algo como esto,

-netdev tap,id=pxe0,ifname=pxe0,script=no,downscript=no \
-device e1000,netdev=pxe0,mac=52:55:00:d1:55:01

pero falla con

qemu-system-aarch64: no se pudo configurar /dev/net/tun (pxe0): argumento no válido

aunque ip arevela

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

Respuesta1

¿Qué configuraciones de red/nic/net QEMU son necesarias para que la VM QEMU esté en la misma red Docker personalizada (sin usar un puente en el host)?

Después de muchas tonterías con la lectura detallada sobre cómo funcionan las redes QEMU y las redes Docker, QEMU solo puede usar una tun/tapinterfaz para omitir la puerta de enlace interna de la VM y el servicio DHCP interno de la VM. Por lo tanto, la única solución que puedo encontrar es:

Añade un grifo llamado 'pxe-tap'

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

Conecte el grifo a la interfaz Docker denominada pxe0 (que es un puente, importante) y levántelo.

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

La comunicación desde QEMU se realizará entonces en la red Docker nombrada.

información relacionada