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



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

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

还有一个小问题,如何卸载tc-bpf程序,我真的每次都要删除qdisc吗?

为了列出系统上的所有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)手册页,但现在它已经严重过时,并且没有描述我的系统上的那些命令。

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

bpftool源代码位于Linux内核树中,可以轻松编译。它是为Fedora 28打包的,但在撰写本文时不适用于Debian/Ubuuntu或其他发行版。(你也可以从这个页面上获得一个带有静态链接二进制文件的Debian.deb包。它还有一个指南,里面有构建bpftool的详细说明等。免责声明:我在那家公司工作。(

至于删除作为tc过滤器附加的程序,您可以简单地删除过滤器,而不一定是整个qdisc,如下所示:

tc filter del dev eth0 ingress

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

最新更新