一次编译到处运行(简称 CO-RE),解决了内核数据结构在不同版本差异导致的兼容性问题。不过在使用 CO-RE 之前,内核需要开启 CONFIG_DEBUG_INFO_BTF=y
和 CONFIG_DEBUG_INFO=y
这两个编译选项。
系统 ubuntu 20.10
以上版本已经默认开启了这些编译选项,我安装的是 ubuntu 22.04
。
1 | sudo apt-get install -y make clang llvm libelf-dev libbpf-dev bpfcc-tools libbpfcc-dev |
二、开发 eBPF 的过程
这个过程分为 5 步
- 第一步,使用 C 语言开发一个 eBPF 程序
- 第二步,借助 LLVM 把 eBPF 程序编译成 BPF 字节码
- 第三步,通过 bpf 系统调用,把 BPF 字节码提交给内核
- 第四步,内核验证并运行 BPF 字节码,并把相应的状态保存到 BPF 映射中
- 第五步,用户程序通过 BPF 映射查询 BPF 字节码的运行状态
BCC 是一个 BPF 编译器集合,包含了用于构建 BPF 程序的编程框架和库,并提供了大量可以直接使用的工具。使用 BCC 的好处是,它把上述的 eBPF 执行过程通过内置框架抽象了起来,并提供了 Python、C++ 等编程语言接口。这样,你就可以直接通过 Python 语言去跟 eBPF 的各种事件和数据进行交互。