如何在Docker中以桥接模式运行QEMU并解决网络配置问题
QEMU-AArch64容器内桥接网络报错解决办法
问题背景
我有一条桥接模式的QEMU-AArch64启动命令:
qemu-system-aarch64 -nographic -machine virt -m 1G -smp 4 \ -cpu cortex-a53 \ -kernel ${illumos_dir}/usr/src/psm/stand/boot/aarch64/virt/inetboot.bin \ -append "-D /virtio_mmio@a003e00" \ -netdev bridge,id=net0,br=${IFACE} \ -device virtio-net-device,netdev=net0,mac=52:54:00:70:0a:e4 \ -device virtio-blk-device,drive=hd0 \ -drive file=${disk_img},format=raw,id=hd0,if=none \ -semihosting-config enable=on,target=native \ -gdb tcp::1234
在容器内执行时,-netdev bridge,id=net0,br=${IFACE}这行报错:failed to add interface 'tap0' to bridge 'eth0': Operation not supported。
我的Docker Compose配置如下:
qemu_aarch64: build: "./qemu-installer" networks: - "illumosaarchdev" volumes: - "./:/data:rw" cap_add: - ALL depends_on: - nfs_root - tftp - dhcp devices: - "/dev/net/tun:/dev/net/tun"
需求是找一个能在容器内正常运行的-netdev配置,必须不影响-append "-D /virtio_mmio@a003e00"参数的功能。
可行替代方案
下面两种方案都能正常工作,且完全不干扰原有的-append参数(该参数是传给Guest内核的,和QEMU网络配置无关):
方案1:User模式网络(简单易上手)
把原命令里的-netdev和-device替换成以下内容:
-netdev user,id=net0 \ -device virtio-net-device,netdev=net0,mac=52:54:00:70:0a:e4
如果需要访问容器所在的illumosaarchdev网络里的NFS、TFTP、DHCP服务,补充指定网段和网关:
-netdev user,id=net0,net=172.20.0.0/16,dns=172.20.0.1 \ -device virtio-net-device,netdev=net0,mac=52:54:00:70:0a:e4
(注意把网段和网关换成你实际的illumosaarchdev网络参数)
方案2:Macvtap模式(接近原生桥接性能)
如果追求更接近原生桥接的网络性能,用macvtap替代:
-netdev tap,id=net0,ifname=tap0,script=no,downscript=no \ -device virtio-net-device,netdev=net0,mac=52:54:00:70:0a:e4
需要在容器启动时提前创建macvtap接口,可在Dockerfile或entrypoint脚本里加以下命令:
ip link add link eth0 name tap0 type macvtap mode bridge ip link set tap0 up chmod 666 /dev/tap0
原配置失效原因
容器的网络命名空间默认被Docker隔离,就算加了CAP_ALL和挂载/dev/net/tun,也没法直接操作宿主机的桥接设备。上面两种方案都绕开了直接操作宿主机桥接的需求,所以能正常运行。
内容的提问来源于stack exchange,提问作者Toasterson
相关产品推荐
相关产品推荐

