3. BCC开发环境搭建:在Ubuntu/CentOS上安装BCC工具集
BCC(BPF Compiler Collection)是构建在eBPF之上的前端工具集,它封装了C语言编写的内核探针与Python/Lua的用户态交互层。本章将指导你在Ubuntu和CentOS两大主流发行版上完成BCC的安装、验证,并编写第一个“Hello World”级别的eBPF程序。
3.1 环境准备与内核版本要求
BCC依赖较新的内核特性,安装前请确认内核版本满足最低要求。下表列出了不同发行版对内核与BCC版本的兼容性矩阵:
| 发行版 | 推荐内核版本 | BCC版本 | eBPF特性支持 |
|---|---|---|---|
| Ubuntu 20.04 LTS | ≥ 5.4.0 | 0.24.0 | kprobe/tracepoint/perf_event |
| Ubuntu 22.04 LTS | ≥ 5.15.0 | 0.28.0 | BPF CO-RE、BPF trampoline |
| CentOS 7 | ≥ 3.10.0-957(需升级内核) | 0.12.0(ELRepo) | 基础kprobe(无CO-RE) |
| CentOS 8 / Rocky 8 | ≥ 4.18.0 | 0.18.0 | CO-RE支持(需开启BTF) |
| CentOS 9 / Rocky 9 | ≥ 5.14.0 | 0.29.0 | 完整CO-RE、BPF iter |
💡 内核检查命令: 使用
uname -r 查看当前内核版本。如果内核低于推荐版本,建议先升级内核或使用容器化BCC环境。
3.2 Ubuntu系统安装BCC
Ubuntu官方仓库从20.04开始提供了预编译的BCC包,推荐使用apt安装,避免从源码编译的复杂依赖。
3.2.1 安装步骤(Ubuntu 20.04/22.04)
# 1. 更新包索引
sudo apt update
# 2. 安装BCC工具包及内核头文件
sudo apt install -y bpfcc-tools linux-headers-$(uname -r)
# 3. 安装Python3绑定(可选,用于开发)
sudo apt install -y python3-bpfcc
# 4. 验证安装
dpkg -l | grep bpfcc
安装完成后,BCC工具默认安装在 /usr/sbin/ 目录下,所有工具以 -bpfcc 后缀命名,例如 execsnoop-bpfcc、biolatency-bpfcc。
3.2.2 验证安装成功
运行一个最简单的BCC工具 hello-bpfcc(如果未安装该工具,可使用 execsnoop-bpfcc 替代):
# 测试execsnoop,监控新进程创建
sudo execsnoop-bpfcc
# 在另一个终端执行 "ls" 命令,观察输出
# 预期输出类似:
# PCOMM PID PPID RET ARGS
# ls 12345 1234 0 /usr/bin/ls
✅ 验证通过标志: 如果终端能实时捕获到新进程的创建事件,说明BCC已正确加载eBPF程序并挂载到内核tracepoint上,安装成功。
3.3 CentOS/RHEL系统安装BCC
CentOS 7默认内核较旧,需要先启用ELRepo仓库升级内核;CentOS 8/9可直接使用EPEL仓库安装。
3.3.1 CentOS 7安装流程
# 1. 安装ELRepo仓库
sudo rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
sudo rpm -Uvh https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm
# 2. 安装长期支持内核(LT版本)
sudo yum --enablerepo=elrepo-kernel install -y kernel-lt
# 3. 重启并选择新内核启动
sudo reboot
# 启动时在GRUB菜单中选择新内核
# 4. 安装BCC
sudo yum install -y bcc-tools kernel-devel-$(uname -r)
# 5. 加载BCC所需内核模块
sudo modprobe kheaders
3.3.2 CentOS 8/9安装流程
# 1. 启用EPEL和PowerTools/CRB仓库
sudo dnf install -y epel-release
sudo dnf config-manager --set-enabled powertools # CentOS 8
# 或
sudo dnf config-manager --set-enabled crb # CentOS 9
# 2. 安装BCC
sudo dnf install -y bcc-tools kernel-devel
# 3. 验证工具路径
ls /usr/share/bcc/tools/ | head -10
3.4 安装验证:运行系统诊断工具
安装完成后,建议运行几个经典BCC工具来验证内核探针是否正常工作。下表列出了推荐验证的工具及其功能:
| 工具名称 | 功能描述 | 验证命令 |
|---|---|---|
| execsnoop | 追踪新进程执行 | sudo execsnoop-bpfcc |
| biolatency | 统计块I/O延迟分布 | sudo biolatency-bpfcc -d 1 3 |
| tcpconnect | 监控TCP连接建立 | sudo tcpconnect-bpfcc |
| runqlat | 统计CPU调度延迟 | sudo runqlat-bpfcc -d 1 3 |
⚠️ 权限注意: BCC工具需要root权限或
CAP_BPF、CAP_SYS_ADMIN 能力。如果遇到 Operation not permitted 错误,请使用 sudo 执行。
3.5 编写第一个Hello World eBPF程序
我们将编写一个最简单的eBPF程序:在内核的 sys_enter_write tracepoint上挂载探针,每次进程调用write系统调用时,打印一条消息到内核trace_pipe。
3.5.1 程序结构概览
3.5.2 编写eBPF C代码
创建一个文件 hello.c,包含内核探针逻辑:
#include <linux/bpf.h>
#include <bpf/bpf_helpers.h>
SEC("tracepoint/syscalls/sys_enter_write")
int hello_world(void *ctx)
{
char msg[] = "Hello, eBPF!";
bpf_trace_printk(msg, sizeof(msg));
return 0;
}
char _license[] SEC("license") = "GPL";
3.5.3 编写Python加载器
创建 hello.py,使用BCC Python库加载并运行eBPF程序:
#!/usr/bin/env python3
from bcc import BPF
# 读取C源码文件
with open("hello.c", "r") as f:
bpf_text = f.read()
# 加载eBPF程序
b = BPF(text=bpf_text)
# 输出提示
print("Tracing write syscalls... Hit Ctrl-C to end.")
print("%-18s %-16s %-6s %s" % ("TIME(s)", "COMM", "PID", "MESSAGE"))
# 循环读取trace_pipe
while True:
try:
(task, pid, cpu, flags, ts, msg) = b.trace_fields()
print("%-18.9f %-16s %-6d %s" % (ts, task, pid, msg))
except KeyboardInterrupt:
exit()
3.5.4 运行Hello World程序
# 赋予执行权限
chmod +x hello.py
# 以root权限运行
sudo ./hello.py
# 在另一个终端执行任意write操作,例如:
echo "test" > /dev/null
# 预期输出:
# Tracing write syscalls... Hit Ctrl-C to end.
# TIME(s) COMM PID MESSAGE
# 12345.678901234 bash 12345 Hello, eBPF!
🔍 调试技巧: 如果没有任何输出,请检查
/sys/kernel/debug/tracing/trace_pipe 是否存在,以及当前用户是否有权限读取。也可以使用 sudo cat /sys/kernel/debug/tracing/trace_pipe 直接查看内核trace输出。
3.6 常见安装问题与解决方案
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
Failed to load BTF |
内核未开启BTF支持 | 升级内核至≥5.2,或使用 CONFIG_DEBUG_INFO_BTF=y 编译内核 |
libbpf: failed to find valid kernel BTF |
缺少 vmlinux.h 或BTF文件 |
安装 kernel-devel 或 linux-headers 包 |
Unable to load kheaders |
内核模块 kheaders 未加载 |
sudo modprobe kheaders |
Permission denied |
缺少CAP_BPF或root权限 | 使用 sudo 执行,或配置 CAP_BPF+CAP_SYS_ADMIN |
No such file or directory: /sys/kernel/debug/tracing/trace_pipe |
debugfs未挂载 | sudo mount -t debugfs none /sys/kernel/debug |
3.7 本章小结
通过本章的学习,你已经掌握了:
- 内核版本检查:使用
uname -r确认系统是否满足BCC运行要求。 - 多发行版安装:在Ubuntu上通过apt、在CentOS上通过EPEL/ELRepo完成BCC部署。
- 安装验证:运行
execsnoop-bpfcc等工具确认eBPF探针正常工作。 - Hello World程序:编写了完整的eBPF C代码+Python加载器,实现了内核tracepoint的挂载与输出。
现在,你的开发环境已经就绪,可以开始探索BCC工具集中更强大的性能诊断脚本了。