【问题标题】:Failed to load XDP program inside a QEMU VM with custom (bridged) tap device无法使用自定义(桥接)tap 设备在 QEMU VM 中加载 XDP 程序
【发布时间】:2020-11-08 08:04:39
【问题描述】:

我最近尝试在 QEMU VM 中加载 XDP 程序(使用virtio-net-pci 作为 NIC 驱动程序,并使用设备作为后端)。这样做似乎需要我的 NIC 具有队列的 vCPU*2 功能,这可以通过在 QEMU 启动命令 (... -netdev tap,queues=<N> ...) 中声明它来完成。如果我没有使用足够数量的队列声明 NIC 并尝试加载 XDP 程序,我会收到以下内核消息和错误:

[    8.663795] virtio_net virtio0 eth0: request 2 queues but max is 1
RTNETLINK answers: Cannot allocate memory

到目前为止,这完全不是问题,尽管我不知道为什么需要这样做(我已经成功地在我的主机上加载了相同的 XDP 程序,它只有一个队列)。

但我的目标是让 QEMU 使用我的自定义 Tap 设备,该设备已连接到主机上的网桥。而不是让 QEMU 为我创建一个新的。

为了使用自定义 Tap 设备,我使用以下命令启动 VM:

sudo qemu-system-x86_64 -hda output/images/node_rootfs.ext2  -enable-kvm -echr 2 --nographic \
 -netdev tap,script=no,downscript=no,id=xcxc,ifname=tap0,queues=4 -device virtio-net-pci,netdev=xcxc,mq=on \
 -cpu host \
 -smp 2 \
 -m 512 \
 -kernel output/images/bzImage -append "root=/dev/sda rw nokaslr"

其中tap0 是所谓的自定义点击设备。

上面的QEMU命令不会启动VM,报错信息是:

qemu-system-x86_64: could not configure /dev/net/tun (tap0): Invalid argument

通过删除选项ifname=tap0queues=4,它可以正常启动。

似乎它告诉我我不能同时声明具有多队列和桥接分接设备的 NIC。但尴尬的是我需要在桥接分接头设备上执行 XDP 程序。

有人知道为什么桥接分路设备不能与启用多队列的 NIC 一起使用吗?

附:内核版本:5.4.33 QEMU 版本:4.2.0 (Debian 1:4.2-3ubuntu6.2)

感谢您阅读我的问题!

【问题讨论】:

    标签: linux qemu xdp-bpf tun-tap


    【解决方案1】:

    原来 QEMU 不允许在选项中直接指定 ifname。相反,这应该通过脚本来完成(选项script=/path/to/scriptdownscript=/path/to/script)。

    IOW,tap 设备应该在脚本中配置,而不是手动创建一个并使用选项ifname 传递它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-13
      • 1970-01-01
      • 1970-01-01
      • 2015-05-28
      • 1970-01-01
      相关资源
      最近更新 更多