eBPF Talk: 为当前内核提供外部 BTF 文件
文章目录
最近系统地学习了 eBPF CO-RE(Compile Once, Run Everywhere,一次编译,到处运行),其中包括了 BTF。
BTF,BPF Type Format,是 eBPF 中专门用来存储调试信息的格式,是一种二进制格式。详细的格式介绍,请查看内核文档 BPF Type Format (BTF)。
业界里的大牛人士为了真正地实现 CO-RE 做出了不懈的努力,特别是 bpftool gen min_core_btf 的开创者们。bpftool gen min_core_btf
是用来给多个 eBPF 程序生成一份最小的 BTF 文件,以便将该份最小的 BTF 文件内嵌到用户应用程序中。
在使用 BTF 文件的时候,有个神奇的地方是,如果当前内核在编译的时候没有开启 CONFIG_DEBUG_INFO_BTF
选项,即内核不自带对应的 BTF 文件 /sys/kernel/btf/vmlinux
,则用户应用程序需要为此专门提供外部的 BTF 文件,譬如 BTFHub 中收集的多个没开启 CONFIG_DEBUG_INFO_BTF
的 Linux 发行版内核对应的 BTF 文件。
而在用户应用程序为内核提供外部 BTF 文件的时候,有两种方式。
- 使用
bpftool gen min_core_btf
生成一份最小的 BTF 文件,并内嵌在应用程序中。 - 针对命令行工具,可以提供
--kernel-btf
这样的选项来指定需要使用的 BTF 文件。
对于方式 2,可以参考 pwru / Run with specified kernel BTF file 这个 PR 中的源代码。其中使用函数 btf.LoadSpec(btfFile)
来加载提供的外部 BTF 文件,使用 btf.LoadKernelSpec()
来加载当前内核中的 BTF 文件。
小结
对 eBPF 了解得越多,越是想投身于 eBPF 的潮流中。可惜受限于工作内容,我接触到更多 的是 Linux 网络方向上 eBPF 的应用。只能通过业余时间去深挖 eBPF 这个大坑了。
文章作者 Leon Hwang
上次更新 2022-11-06