这是一个从零开始学习 eBPF 的实战教程,旨在帮助开发者从基础概念到高级技术全面掌握 eBPF 编程。每节课都包含详细的讲解、完整的代码示例和实践练习。
- eBPF 基础: 理解 eBPF 架构和核心概念
- 开发环境: libbpf 工程模板搭建和使用
- 第一个程序: Hello World 示例详解
- Kprobe: 内核函数动态跟踪
- Uprobe: 用户态函数跟踪
- Tracepoint: 静态跟踪点使用
- Raw Tracepoint: 原始跟踪点高级用法
- Map 基础: 用户态和内核态数据交换
- Ring Buffer: 高效的单生产者单消费者队列
- Perf Buffer: 多 CPU 性能事件缓冲区
- C 语言开发: 基于 libbpf 的传统开发方式
- Go 语言开发:
- Cilium ebpf-go 库使用
- Aqua Security libbpfgo 库使用
- 两种方案对比分析
- BTF (BPF Type Format): 类型元数据格式
- CO-RE (Compile Once, Run Everywhere): 一次编译,到处运行
- 跨内核版本兼容性: 编写可移植的 eBPF 程序
本项目包含 Git 子模块,可以使用以下两种方式克隆:
方式一:克隆时一并初始化子模块
git clone --recursive https://github.com/haolipeng/ebpf-tutorial.git方式二:分步克隆和初始化
# 首先克隆主仓库
git clone https://github.com/haolipeng/ebpf-tutorial.git
cd ebpf-tutorial
# 然后初始化并更新子模块
git submodule update --init-
操作系统
- Linux 内核 >= 5.4
- 推荐 5.8+ 以支持 Ring Buffer
- 推荐 5.14+ 以支持完整的 BTF 功能
-
编程基础
- C 语言编程基础
- Linux 系统编程基础知识
- 了解内核基本概念(进程、系统调用等)
-
开发工具
- GCC 或 Clang 编译器
- libbpf 开发库
- bpftool 工具
- (可选) Go 1.18+ 用于 Go 语言开发
# Ubuntu/Debian
sudo apt-get update
sudo apt-get install -y \
clang \
llvm \
libbpf-dev \
linux-headers-$(uname -r) \
bpftool
# CentOS/RHEL
sudo yum install -y \
clang \
llvm \
libbpf-devel \
kernel-devel \
bpftoolebpf-tutorial/
├── Makefile # 顶层入口:用户交互主界面
├── build/ # 构建系统配置
│ ├── config.mk # 可配置选项(工具链、路径等)
│ ├── common.mk # 公共变量、函数定义
│ └── rules.mk # 公共构建规则(BPF 编译等)
├── src/ # 示例源代码
│ ├── Makefile # src 层:管理子项目
│ ├── helloworld/ # 第一课示例
│ ├── kprobe/ # 第二课示例
│ ├── uprobe/ # 第三课示例
│ └── ... # 更多示例
├── libbpf/ # libbpf 子模块
├── bpftool/ # bpftool 子模块
├── vmlinux/ # 内核类型头文件
│ └── x86/vmlinux.h
└── .output/ # 构建输出目录(自动生成)
├── libbpf.a # 预构建的 libbpf 静态库
└── bpftool/ # 预构建的 bpftool
# 1. 克隆项目(包含子模块)
git clone --recursive https://github.com/haolipeng/ebpf-tutorial.git
cd ebpf-tutorial
# 2. 查看可用命令
make help
# 3. 首次使用:预构建依赖库
make prebuild
# 4. 构建所有示例
make all
# 5. (可选) 从当前内核生成 vmlinux.h
make vmlinux| 命令 | 说明 |
|---|---|
make help |
显示帮助信息 |
make prebuild |
预构建 libbpf 和 bpftool |
make vmlinux |
从当前内核生成 vmlinux.h |
make all |
构建所有示例 |
make clean |
清理子项目构建文件 |
make clean-all |
清理所有构建文件(包括 libbpf/bpftool) |
make install-deps |
安装系统依赖(Ubuntu/Debian) |
# 方式一:在根目录构建(推荐)
make prebuild # 首次需要
make all
# 方式二:进入子目录单独构建
cd src/helloworld
make# 显示详细构建命令
make V=1 all
# 指定目标架构(交叉编译)
make ARCH=arm64 prebuild-
入门阶段 (第 1-3 课)
- 从 第一课:Hello World 开始
- 学习基本的 eBPF 程序结构
- 掌握 kprobe 和 uprobe 的使用
-
进阶阶段 (第 4-7 课)
- 学习数据通信机制(Map、Ring Buffer、Perf Buffer)
- 尝试使用 Go 语言开发 eBPF 程序
- 理解不同数据结构的使用场景
-
高级阶段 (第 8-10 课)
- 深入学习各种跟踪点机制
- 掌握 BTF 和 CO-RE 技术
- 编写可移植的 eBPF 程序
- 循序渐进: 建议按照课程顺序学习,每节课都为后续课程打下基础
- 动手实践: 每节课都包含完整代码示例,建议自己动手编写和运行
- 理解原理: 不要只关注代码实现,要理解背后的原理和设计思想
- 查阅文档: 遇到问题时查阅官方文档和内核源码
- 持续学习: eBPF 技术在快速发展,保持学习最新特性
我们欢迎任何形式的贡献!
-
报告问题
- 发现文档错误或代码 bug
- 提出改进建议
- 分享使用中遇到的问题
-
改进文档
- 修正拼写或语法错误
- 补充说明或示例
- 翻译文档到其他语言
-
贡献代码
- 修复 bug
- 添加新的示例
- 优化现有代码
-
分享经验
- 分享学习笔记
- 编写实战案例
- 参与讨论交流
- Fork 本仓库
- 创建您的特性分支 (
git checkout -b feature/AmazingFeature) - 提交您的更改 (
git commit -m 'Add some AmazingFeature') - 推送到分支 (
git push origin feature/AmazingFeature) - 提交 Pull Request
本教程采用开源协议,可自由用于学习和教学目的。
感谢所有为 eBPF 技术发展做出贡献的开发者和社区成员。
持续学习,不断进步!
如果本教程对您有帮助,欢迎 ⭐ Star 支持!