如何列出所有加载到内核中的 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,然后再次重复调用它以获得以下 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 and can be easily compiled. It is packaged for Fedora 28, but not for Debian/Ubuntu or other distributions as of this writing. (You could also get a Debian .deb package with a statically linked binary from this page。它还有一个指南,其中包含有关构建 bpftool 等内容的详细说明。免责声明:我在那家公司工作。)
至于删除作为 tc 过滤器附加的程序,您可以简单地删除过滤器,不一定要删除整个 qdisc,如下所示:
tc filter del dev eth0 ingress
[2022 年 1 月编辑] 如果您想避免下载整个内核存储库来编译该工具,则在 https://github.com/libbpf/bpftool 有一个 bpftool 的 GitHub 镜像。如今,bpftool 也被打包在主要发行版中。
我知道 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)
manual page,但现在它已经严重过时并且没有在我的系统上描述这些命令。
实际上,这一切都已经实现了。您应该搜索 bpftool 程序:运行 sudo bpftool prog
将列出您系统上的所有程序。
bpftool sources are within the Linux kernel tree and can be easily compiled. It is packaged for Fedora 28, but not for Debian/Ubuntu or other distributions as of this writing. (You could also get a Debian .deb package with a statically linked binary from this page。它还有一个指南,其中包含有关构建 bpftool 等内容的详细说明。免责声明:我在那家公司工作。)
至于删除作为 tc 过滤器附加的程序,您可以简单地删除过滤器,不一定要删除整个 qdisc,如下所示:
tc filter del dev eth0 ingress
[2022 年 1 月编辑] 如果您想避免下载整个内核存储库来编译该工具,则在 https://github.com/libbpf/bpftool 有一个 bpftool 的 GitHub 镜像。如今,bpftool 也被打包在主要发行版中。