【问题标题】:fail to attach eBPF blob无法附加 eBPF blob
【发布时间】:2017-11-22 05:34:40
【问题描述】:

我刚刚从内核 tools/testing/selftests/bpf 编译了 BPF 示例,并尝试按照 http://cilium.readthedocs.io/en/v0.10/bpf/ 中的说明进行加载:

% tc filter add dev enp0s1 ingress bpf \
    object-file ./net-next.git/tools/testing/selftests/bpf/sockmap_parse_prog.o \
    section sk_skb1 verbose 
Program section 'sk_skb1' not found in ELF file!
Error fetching program/map!

这发生在 Ubuntu 16.04.3 LTS 上,内核为 4.4.0-98,llvmclang 3.8 版从软件包安装,iproute2 是来自 github 的最新版本。

我怀疑我遇到了一些工具链/内核版本/功能不匹配的问题。

我做错了什么?

【问题讨论】:

    标签: linux-kernel bpf ebpf


    【解决方案1】:

    我不知道为什么 tc 抱怨。在我的设置中,使用类似的命令,程序会加载。不过,这里有一些提示:

    • 认为问题可能来自于内核头文件版本和 iproute2 之间的一些不兼容,并且某些重定位失败,尽管在快速调查中我没有找出它拒绝加载该部分的确切原因。在我这边,我使用的是 clang-3.8、最新的 iproute2,以及最新的内核(一些提交接近 4.14)。

    • 如果您设法以某种方式加载该部分,我相信您在尝试将程序附加到内核时仍然会遇到问题。名为“direct packet access”的功能仅存在于kernels 4.7 and higher。这就是让您能够在程序中使用skb->dataskb->data_end 的原因。

    • 然后作为旁注,这个程序sockmap_parse_prog.c 不打算与 tc 一起使用。它应该直接连接到套接字(在同一目录中的文件test_maps.c 中搜索SOCKMAP_PARSE_PROG 以查看它是如何加载到那里的)。从技术上讲,这并不妨碍将程序作为 tc 过滤器附加,但它可能无法按预期工作。特别是,程序返回的值可能没有 tc 分类器钩子能够理解的含义。

    所以我建议尝试使用最近的内核,看看你是否有更多的成功。或者,尝试编译和运行您可以在自己的内核源代码中找到的示例。祝你好运!

    【讨论】:

    • 感谢您的 cmets。我将不得不尝试构建和安装最新的内核/你能告诉我应该尝试哪个 TC 友好的 bpf 示例而不是 sockmap_parse_prog.c 吗?
    • 或者,您可以安装一个具有最新发行版的虚拟机,我认为例如 Ubuntu 17.04 具有内核 4.8?对于示例,也许您可​​以从运行samples/bpf/parse_simple.c 开始,它是一个非常基本的程序,似乎会丢弃具有给定目标端口号的 UDP 数据包。请注意,tools/testing/selftests/bpf 下还有其他示例。您可以 grep for TC_ACT_ 返回码来查找为 tc 编写的程序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-06
    • 1970-01-01
    • 1970-01-01
    • 2019-04-22
    • 2016-10-01
    • 2021-08-18
    • 1970-01-01
    相关资源
    最近更新 更多