如何列出加载到内核中的所有 bpf 程序? (例如 tc-bpf)

Posted

技术标签:

【中文标题】如何列出加载到内核中的所有 bpf 程序? (例如 tc-bpf)【英文标题】:How to list all bpf program which is loaded into kernel ? (e.g. tc-bpf) 【发布时间】:2018-08-01 07:29:28 【问题描述】:

我知道 bpf 程序可以通过不同的方式加载到内核中,tc/kprobe/socket ...

我想知道有没有接口什么的,通过它我可以得到我加载的所有bpf程序?如果没有这样的事情,如果我单独留下一些可能会改变我的网络数据的 bpf 程序是否危险?

再问一个小问题,如何卸载tc-bpf程序,真的每次都必须删除qdisc吗?

【问题讨论】:

欢迎来到 Stack Overflow!像这样的问题是too broad。试着问minimal specific questions about programming issues,把你的问题分解成更小的问题。 【参考方案1】:

为了列出系统上的所有 BPF 程序,从 Linux 内核 4.13 开始,您可以使用bpf() 系统调用及其BPF_PROG_GET_NEXT_ID 命令来获取第一个程序的 id,然后重复调用再次获取以下 id,直到您拥有系统上加载的所有 BPF 程序的 id 列表。然后,您可以使用相同的系统调用及其BPF_PROG_GET_FD_BY_ID 命令来检索每个程序的文件描述符,并第三次使用BPF_OBJ_GET_INFO_BY_FD 来获取给定程序的信息(例如程序类型)。我通常会将您重定向到bpf(2) manual page,但现在它已经严重过时并且没有描述我系统上的这些命令。

实际上,所有这些都已经实施。您应该搜索 bpftool 程序:运行 sudo bpftool prog 将列出您系统上的所有程序。

bpftool sources are within the Linux kernel tree 并且可以轻松编译。它是为 Fedora 28 打包的,但在撰写本文时还没有为 Debian/Ubuntu 或其他发行版打包。 (您还可以从this page 获得一个带有静态链接二进制文件的 Debian .deb 软件包。它还有一个指南,其中包含构建 bpftool 的详细说明等。免责声明:我为那家公司工作。)

至于删除附加为tc过滤器的程序,你可以简单的删除过滤器,不一定是整个qdisc,像这样:

tc filter del dev eth0 ingress

[2022 年 1 月编辑] 如果您想避免下载整个内核存储库来编译该工具,则在 https://github.com/libbpf/bpftool 有一个 bpftool 的 GitHub 镜像。如今,bpftool 也被打包在各大发行版中。

【讨论】:

以上是关于如何列出加载到内核中的所有 bpf 程序? (例如 tc-bpf)的主要内容,如果未能解决你的问题,请参考以下文章

如何从内核树中构建BPF程序

eBPF理解

eBPF理解

Linux内核BPF的简单工作原理

eBPF verifier常见错误浅析

使用EBPF追踪LINUX内核