명명된 Docker 인터페이스를 사용하도록 QEMU를 얻는 방법은 무엇입니까?

명명된 Docker 인터페이스를 사용하도록 QEMU를 얻는 방법은 무엇입니까?

질문

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(작성) 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 네트워크에 있으려면 어떤 network/nic/net 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 네트워크(호스트에서 브리지를 사용하지 않음)에 있으려면 어떤 network/nic/net 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 네트워크에서 이루어집니다.

관련 정보