Skip to content

Latest commit

 

History

History
executable file
·
298 lines (225 loc) · 11.4 KB

File metadata and controls

executable file
·
298 lines (225 loc) · 11.4 KB

eBPF 入门教程

en zh-CN

从零开始系统学习 eBPF 编程


📚 关于本教程

这是一个从零开始学习 eBPF 的实战教程,旨在帮助开发者从基础概念到高级技术全面掌握 eBPF 编程。每节课都包含详细的讲解、完整的代码示例和实践练习。

📖 教程目录

课程 主题 文档 配套视频
1 Hello World 入门 lesson_1_helloworld.md 【【硬核入门1】eBPF Hello World 实战:零基础编写你的第一个内核追踪程序!】 https://www.bilibili.com/video/BV1JmVjzaEVX/?share_source=copy_web&vd_source=39a73ab5740e6db6ffee63c6e52211c6
2 Kprobe 内核探针 lesson_2_kprobe.md 【【硬核入门2】eBPF kprobe 实战:监控unlink文件删除】 https://www.bilibili.com/video/BV1NNEgzvEnM/?share_source=copy_web&vd_source=39a73ab5740e6db6ffee63c6e52211c6
3 Uprobe 用户态探针 lesson_3_uprobe.md 【【硬核入门3】eBPF uprobe 实战】 https://www.bilibili.com/video/BV1WduFz7EED/?share_source=copy_web&vd_source=39a73ab5740e6db6ffee63c6e52211c6
4 用户态 Map 操作 lesson_4_user_map.md 【【硬核入门4】 eBPF map用户态操作】 https://www.bilibili.com/video/BV1g2pXzGE2g/?share_source=copy_web&vd_source=39a73ab5740e6db6ffee63c6e52211c6
5 内核态与用户态 Map 通信 lesson_5_kernel_user_map.md 【【硬核入门5】 eBPF 内核态和用户态 map实战】 https://www.bilibili.com/video/BV1NEpRzuE76/?share_source=copy_web&vd_source=39a73ab5740e6db6ffee63c6e52211c6
6 使用cilium ebpf-go库开发eBPF程序程序 lesson_6_golang_develop.md 【【硬核入门6】ebpf go开发之使用cilium ebpf-go库】 https://www.bilibili.com/video/BV16JnPzmEs7/?share_source=copy_web&vd_source=39a73ab5740e6db6ffee63c6e52211c6
7 使用libbpfgo库开发eBPF程序程序 lesson_6_golang_develop.md 【【硬核入门7】eBPF实战之libbpfgo开发eBPF程序】 https://www.bilibili.com/video/BV1KrnpzjEmn/?share_source=copy_web&vd_source=39a73ab5740e6db6ffee63c6e52211c6
8 eBPF Perf Buffer实战 lesson_7_ringbuffer_perfbuffer.md 【【硬核入门8】eBPF实战之perf buffer示例】 https://www.bilibili.com/video/BV1zL4jzhEF8/?share_source=copy_web&vd_source=39a73ab5740e6db6ffee63c6e52211c6
9 eBPF Ring Buffer实战 lesson_7_ringbuffer_perfbuffer.md 【【硬核入门9】eBPF实战之ring buffer实战】 https://www.bilibili.com/video/BV1774jzFE2V/?share_source=copy_web&vd_source=39a73ab5740e6db6ffee63c6e52211c6
10 Tracepoint 静态跟踪点 lesson_8_tracepoint.md 【【硬核入门10】eBPF实战之tracepoint】 https://www.bilibili.com/video/BV1tb4cziESu/?share_source=copy_web&vd_source=39a73ab5740e6db6ffee63c6e52211c6
11 Raw Tracepoint 原始跟踪点 lesson_9_raw_tracepoint.md 【【硬核入门11】eBPF实战之raw tracepoint原始跟踪点】 https://www.bilibili.com/video/BV1aQ4bzsEC5/?share_source=copy_web&vd_source=39a73ab5740e6db6ffee63c6e52211c6
12 BTF 与 CO-RE 技术 lesson_10_btf.md 【【硬核入门12】eBPF实战BTF和CORE】 https://www.bilibili.com/video/BV1q5WDzEECm/?share_source=copy_web&vd_source=39a73ab5740e6db6ffee63c6e52211c6
13 TC Ingress 入站流量控制 lesson_11_tc_ingress.md 【【硬核入门13】eBPF实战之tc ingress过滤入站ICMP包】 https://www.bilibili.com/video/BV1sMs6ziE1b/?share_source=copy_web&vd_source=39a73ab5740e6db6ffee63c6e52211c6
14 TC Egress 出站流量控制 lesson_12_tc_egress.md 【【硬核入门14】eBPF实战之tc egress过滤出站ICMP包】 https://www.bilibili.com/video/BV1wsyBBdEUQ/?share_source=copy_web&vd_source=39a73ab5740e6db6ffee63c6e52211c6

🎯 学习内容

基础篇

  • 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

前置要求

  1. 操作系统

    • Linux 内核 >= 5.4
    • 推荐 5.8+ 以支持 Ring Buffer
    • 推荐 5.14+ 以支持完整的 BTF 功能
  2. 编程基础

    • C 语言编程基础
    • Linux 系统编程基础知识
    • 了解内核基本概念(进程、系统调用等)
  3. 开发工具

    • 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 \
    bpftool

📁 项目结构

ebpf-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. 入门阶段 (第 1-3 课)

  2. 进阶阶段 (第 4-7 课)

    • 学习数据通信机制(Map、Ring Buffer、Perf Buffer)
    • 尝试使用 Go 语言开发 eBPF 程序
    • 理解不同数据结构的使用场景
  3. 高级阶段 (第 8-10 课)

    • 深入学习各种跟踪点机制
    • 掌握 BTF 和 CO-RE 技术
    • 编写可移植的 eBPF 程序

💡 学习建议

  1. 循序渐进: 建议按照课程顺序学习,每节课都为后续课程打下基础
  2. 动手实践: 每节课都包含完整代码示例,建议自己动手编写和运行
  3. 理解原理: 不要只关注代码实现,要理解背后的原理和设计思想
  4. 查阅文档: 遇到问题时查阅官方文档和内核源码
  5. 持续学习: eBPF 技术在快速发展,保持学习最新特性

📝 贡献指南

我们欢迎任何形式的贡献!

如何贡献

  1. 报告问题

    • 发现文档错误或代码 bug
    • 提出改进建议
    • 分享使用中遇到的问题
  2. 改进文档

    • 修正拼写或语法错误
    • 补充说明或示例
    • 翻译文档到其他语言
  3. 贡献代码

    • 修复 bug
    • 添加新的示例
    • 优化现有代码
  4. 分享经验

    • 分享学习笔记
    • 编写实战案例
    • 参与讨论交流

贡献流程

  1. Fork 本仓库
  2. 创建您的特性分支 (git checkout -b feature/AmazingFeature)
  3. 提交您的更改 (git commit -m 'Add some AmazingFeature')
  4. 推送到分支 (git push origin feature/AmazingFeature)
  5. 提交 Pull Request

🔗 相关资源

官方文档

推荐阅读

工具链

📄 许可证

本教程采用开源协议,可自由用于学习和教学目的。

🙏 致谢

感谢所有为 eBPF 技术发展做出贡献的开发者和社区成员。


持续学习,不断进步!

如果本教程对您有帮助,欢迎 ⭐ Star 支持!