最近系统地学习了 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 文件的时候,有两种方式。

  1. 使用 bpftool gen min_core_btf 生成一份最小的 BTF 文件,并内嵌在应用程序中。
  2. 针对命令行工具,可以提供 --kernel-btf 这样的选项来指定需要使用的 BTF 文件。

对于方式 2,可以参考 pwru / Run with specified kernel BTF file 这个 PR 中的源代码。其中使用函数 btf.LoadSpec(btfFile) 来加载提供的外部 BTF 文件,使用 btf.LoadKernelSpec() 来加载当前内核中的 BTF 文件。

小结

对 eBPF 了解得越多,越是想投身于 eBPF 的潮流中。可惜受限于工作内容,我接触到更多 的是 Linux 网络方向上 eBPF 的应用。只能通过业余时间去深挖 eBPF 这个大坑了。