如何开始学习和使用 BPF/eBP
现在让我们来谈谈如何开始学习和使用 BPF/eBPF。学习和使用 BPF 可以分为几个阶段,从基础概念到实际应用再到高级开发。
第一阶段:理解核心概念
在动手实践之前,先打好理论基础非常重要。
- 什么是 BPF/eBPF?
- 历史: 了解 BPF 的起源(最初用于数据包过滤)和演进(扩展为 eBPF,用于通用内核编程)。
- 核心思想: 理解它是一个安全的、在内核中运行的虚拟机。程序由用户态编写,加载到内核,经过验证后运行。
- 为什么使用 eBPF?
- 性能: 程序在内核态运行,避免了用户态/内核态切换的开销。
- 安全性: 内核验证器确保程序不会导致系统崩溃或死循环。
- 动态性: 程序可以动态加载和卸载,无需修改或重启内核。
- 可观测性: 强大的跟踪和监控能力。
- 基本组件:
- BPF 程序: 用 C 编写,编译成 BPF 字节码,在内核中运行。
- **BPF 映射 **(Maps) 用户态和内核态 BPF 程序之间,或多个 BPF 程序之间共享数据的高效键值存储。
- **BPF 挂钩点 **(Hooks) BPF 程序可以附加到的内核事件点,如系统调用、网络包接收、函数进入/退出等。
- **BPF 辅助函数 **(Helper Functions) BPF 程序可以调用的内核提供的安全函数,如打印日志、访问映射、获取当前时间等。
- **BPF 验证器 **(Verifier) 内核中的一个关键组件,负责在程序加载时检查其安全性。
- BPF JIT 编译器: 将 BPF 字节码编译成本机机器码,以获得最佳性能。
第二阶段:搭建学习环境
- Linux 内核: 你需要一个相对较新的 Linux 内核(建议 5.4 或更高版本)。大多数现代发行版(Ubuntu 20.04+, Debian 11+, Fedora 33+, CentOS/RHEL 8+)都满足要求。
- 权限:
- 许多 BPF 操作需要
root
权限或特定的 Linux Capabilities(如CAP_SYS_ADMIN
,CAP_BPF
,CAP_PERFMON
)。 - 在开发环境中,使用
sudo
运行程序通常是最简单的方法。
- 许多 BPF 操作需要
- 必要工具:
- LLVM/Clang: 用于将 C 语言编写的 BPF 程序编译成 BPF 字节码。安装
clang
和llvm
包。# Ubuntu/Debian sudo apt install clang llvm # CentOS/RHEL/Fedora sudo dnf install clang llvm
- libbpf: 现代 BPF 应用程序的标准 C 库。它封装了底层的
bpf
系统调用,简化了开发。# Ubuntu/Debian (可能需要 libbpf-dev 或 libbpf1) sudo apt install libbpf-dev # CentOS/RHEL/Fedora sudo dnf install libbpf-devel
- bpftool: 一个强大的命令行工具,用于检查、调试和操作 BPF 程序和映射。强烈推荐安装。
# Ubuntu/Debian sudo apt install linux-tools-common linux-tools-generic # 可能包含 bpftool # 或者从源码编译最新版 # CentOS/RHEL/Fedora sudo dnf install bpftool
- 文本编辑器/IDE: 你喜欢的任何编辑器。VS Code 配合 C/C++ 和 BPF 插件很好用。
- 调试工具:
gdb
,perf
(用于性能分析)。
- LLVM/Clang: 用于将 C 语言编写的 BPF 程序编译成 BPF 字节码。安装
第三阶段:动手实践入门
从最简单的例子开始,逐步增加复杂度。
1. 学习使用 bpftool
bpftool
是最好的起点之一,它能让你直观地看到系统中正在运行的 BPF 程序和映射。
# 列出所有 BPF 程序
sudo bpftool prog list# 列出所有 BPF 映射
sudo bpftool map list# 查看特定程序的详细信息
sudo bpftool prog show