这是一个基于 CO-RE
(一次编译,到处运行)的 libbpf
的 eBPF 的开发教程,提供了从入门到进阶的 eBPF 开发实践指南,包括基本概念、代码实例、实际应用等内容。我们主要提供了一些 eBPF 工具的案例,帮助开发者学习 eBPF 的开发方法和技巧。教程内容可以在目录中找到,每个目录都是一个独立的 eBPF 工具案例。
在学习 eBPF 的过程中,我们受到了 tutorial_bcc_python_developer 的许多启发和帮助,但从 2022 年的角度出发,使用 libbpf 开发 eBPF 的应用是目前相对更好的选择。但目前似乎很少有基于 libbpf 和 BPF CO-RE 出发的、通过案例和工具介绍 eBPF 开发的教程,因此我们发起了这个项目。
本项目主要基于 libbpf-boostrap 和 eunomia-bpf 两个框架完成,并使用 eunomia-bpf 帮助简化一部分 libbpf eBPF 用户态代码的编写。
教程主要关注于可观察性,并简要介绍了 eBPF 的其他应用,例如网络、安全等等。
教程的详细文档可以在这里找到:
- https://github.com/yunwei37/bpf-developer-tutorial
- https://gitee.com/yunwei37/bpf-developer-tutorial/tree/main
让 chatGPT 来帮助我们
本教程大部分内容由 chatGPT 生成,我们尝试教会 chatGPT 编写 eBPF 程序:
- 告诉它基本的 eBPF 编程相关的常识
- 告诉它一些案例:hello world,eBPF 程序的基本结构,如何使用 eBPF 程序进行追踪,并且让它开始编写教程
- 手动调整教程,并纠正代码和文档中的错误
- 把修改后的代码再喂给 chatGPT,让它继续学习
- 尝试让 chatGPT 自动生成 eBPF 程序和对应的教程文档!例如
完整的对话记录可以在这里找到: chatGPT.md
目录
- lesson 0-introduce 介绍 eBPF 的基本概念和常见的开发工具
- lesson 1-helloworld 使用 eBPF 开发最简单的「Hello World」程序,介绍 eBPF 的基本框架和开发流程
- lesson 2-kprobe-unlink 在 eBPF 中使用 kprobe 捕获 unlink 系统调用
- lesson 3-fentry-unlink 在 eBPF 中使用 fentry 捕获 unlink 系统调用
- lesson 4-opensnoop 使用 eBPF 捕获进程打开文件的系统调用集合,使用全局变量在 eBPF 中过滤进程 pid
- lesson 5-uprobe-bashreadline 在 eBPF 中使用 uprobe 捕获 bash 的 readline 函数调用
- lesson 6-sigsnoop 捕获进程发送信号的系统调用集合,使用 hash map 保存状态
- lesson 7-execsnoop 捕获进程执行时间,通过 perf event array 向用户态打印输出
- lesson 8-execsnoop 捕获进程退出事件,使用 ring buffer 向用户态打印输出
- lesson 9-runqlat 捕获进程调度延迟,以直方图方式记录
- lesson 10-hardirqs 使用 hardirqs 或 softirqs 捕获中断事件
- lesson 11-bootstrap 使用 libbpf-boostrap 为 eBPF 编写原生的的用户态代码
- lesson 12-profile 使用 eBPF 进行性能分析
- lesson 13-tcpconnlat 记录 TCP 连接延迟
- lesson 14-tcpstates 记录 TCP 连接状态
- lesson 15-tcprtt 以直方图方式记录 TCP RTT
- lesson 16-memleak 检测内存泄漏
- lesson 17-biopattern 捕获磁盘 IO 模式
- lesson 18-further-reading 更进一步的相关资料?
- lesson 19-lsm-connect 使用 LSM 进行安全检测防御
- lesson 20-tc 使用 eBPF 进行 tc 流量控制
- lesson 21-xdp 使用 eBPF 进行 XDP 报文处理
为什么需要基于 libbpf 和 BPF CO-RE 的教程?
eunomia-bpf
eunomia-bpf 是一个开源的 eBPF 动态加载运行时和开发工具链,是为了简化 eBPF 程序的开发、构建、分发、运行而设计的,基于 libbpf 的 CO-RE 轻量级开发框架。
使用 eunomia-bpf ,可以:
- 在编写 eBPF 程序或工具时只编写 libbpf 内核态代码,自动获取内核态导出信息;
- 使用 WASM 进行用户态交互程序的开发,在 WASM 虚拟机内部控制整个 eBPF 程序的加载和执行,以及处理相关数据;
- eunomia-bpf 可以将预编译的 eBPF 程序打包为通用的 JSON 或 WASM 模块,跨架构和内核版本进行分发,无需重新编译即可动态加载运行。
eunomia-bpf 由一个编译工具链和一个运行时库组成, 对比传统的 BCC、原生 libbpf 等框架,大幅简化了 eBPF 程序的开发流程,在大多数时候只需编写内核态代码,即可轻松构建、打包、发布完整的 eBPF 应用,同时内核态 eBPF 代码保证和主流的 libbpf, libbpfgo, libbpf-rs 等开发框架的 100% 兼容性。需要编写用户态代码的时候,也可以借助 Webassembly 实现通过多种语言进行用户态开发。和 bpftrace 等脚本工具相比, eunomia-bpf 保留了类似的便捷性, 同时不仅局限于 trace 方面, 可以用于更多的场景, 如网络、安全等等。
本文链接:https://my.lmcjl.com/post/10313.html
4 评论