繁体   English   中英

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

[英]How to list all bpf program which is loaded into kernel ? (e.g. tc-bpf)

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

我想知道是否有接口或某种东西可以通过它获取我加载的所有bpf程序? 如果没有,那么如果我留下一些可能会更改网络数据的bpf程序,是否有危险?

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

为了列出您系统上的所有BPF程序,并且从Linux内核4.13开始,您可以使用bpf()系统调用及其BPF_PROG_GET_NEXT_ID命令来获取第一个程序的ID,然后再次BPF_PROG_GET_NEXT_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 / Ubuntu或其他发行版打包。 (您也可以从此页面上获得带有静态链接的二进制文件的Debian .deb软件包。它还提供了一个指南,其中包含有关构建bpftool的详细说明。免责声明:我在该公司工作。)

至于删除附加为tc过滤器的程序,只需删除过滤器,不必删除整个qdisc,如下所示:

tc filter del dev eth0 ingress

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM