linux - 如何列出加载到内核中的所有 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/Ubuntu 或其他发行版打包。(您还可以从此页面获取带有静态链接二进制文件的 Debian .deb 软件包。它还有一个指南,其中包含构建 bpftool 的详细说明等。免责声明:我为那家公司工作。)
至于删除附加为 tc 过滤器的程序,您可以简单地删除过滤器,不一定是整个 qdisc,如下所示:
tc filter del dev eth0 ingress
[编辑 2022 年 1 月] https://github.com/libbpf/bpftool上有一个 bpftool 的 GitHub 镜像,如果您想避免下载整个内核存储库来编译该工具。如今,bpftool 也被打包在主要发行版中。
推荐阅读
- excel - VBA UserForms noModal和Modal交互问题
- javascript - chrome 扩展通过共享本地存储将多条消息传递到外部站点
- html - 使用固定位置滚动左侧菜单
- javascript - Node.js Express.js 发送 Jquery Ajax Post 抛出常量错误 - 我被卡住了
- reactjs - 是什么导致 ReactJS 中出现以下 Firestore 错误?使用无效数据调用的函数 DocumentReference .update()。不支持的字段值:
- linux - 通过 SPI (Linux) 刷新 Atmel SAM3X8E ARM Cortex-M3
- amazon-web-services - 如何将现有 CodePipeline 导出到 CloudFormation 模板
- python - Python使用for循环对齐文本
- python - Python regex - 为什么匹配'e42dsf425'?
- powershell - 通过 winrm 在远程服务器上执行命令失败