Wie bringt man QEMU dazu, eine benannte Docker-Schnittstelle zu verwenden?

Wie bringt man QEMU dazu, eine benannte Docker-Schnittstelle zu verwenden?

Frage

Ist es möglich, QEMU dazu zu bringen, eine benannte Docker-Schnittstelle und ein benanntes Netzwerk auf demselben Hostcomputer zu verwenden?


Motivierendes Beispiel:

Nehmen wir an, ich habe einen DHCP-Server in einem Docker-Container mit statischer IP, der wie folgt läuft:

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

Der Docker (Compose) DHCP-Server befindet sich in seinem eigenen Netzwerk auf demselben Host mit einer benannten Schnittstelle 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

Angenommen, ich möchte einen Bootloader in QEMU ausführen und die DHCP-Broadcasts den oben genannten Docker-Container erreichen lassen. Dies ist mein Befehl:

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

Der Start des Bootloaders sieht dann folgendermaßen aus:

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

Die Pakete von der QEMU-VM erreichen den Docker-Container auf demselben Host nicht.

Welche Netzwerk-/NIC-/Net-QEMU-Einstellungen sind erforderlich, damit sich die QEMU-VM im selben benutzerdefinierten Docker-Netzwerk befindet (nichtmithilfe einer Bridge auf dem Host)?

Ich denke dabei an so etwas wie:

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

scheitert aber mit

qemu-system-aarch64: /dev/net/tun (pxe0) konnte nicht konfiguriert werden: Ungültiges Argument

obwohl ip aoffenbart

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

Antwort1

Welche Netzwerk-/NIC-/Net-QEMU-Einstellungen werden benötigt, damit sich die QEMU-VM im selben benutzerdefinierten Docker-Netzwerk befindet (ohne dass eine Bridge auf dem Host verwendet wird)?

Nach viel Unsinn und ausführlichem Lesen der Funktionsweise von QEMU-Netzwerken und Docker-Netzwerken kann QEMU nur eine tun/tapSchnittstelle verwenden, um das interne VM-Gateway und den internen VM-DHCP-Dienst zu umgehen. Daher ist die einzige Lösung, die ich finden kann, folgende:

Fügen Sie einen Tap mit dem Namen „pxe-tap“ hinzu.

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

Befestigen Sie den Tap an der benannten Docker-Schnittstelle pxe0 (eine Brücke – wichtig) und heben Sie ihn an.

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

Die Kommunikation von QEMU erfolgt dann über das benannte Docker-Netzwerk.

verwandte Informationen