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 程序结构概览

Hello World eBPF 程序架构 用户态 Python 脚本 BCC Python库 加载 & 读取输出 bpf_load 内核 eBPF 程序 C 语言编写 挂载到 tracepoint bpf_trace_printk trace_pipe /sys/kernel/ debug/tracing/ 📋 程序执行流程: 1. Python脚本调用BCC库,将C语言eBPF源码编译为BPF字节码 2. BCC通过bpf()系统调用将字节码加载到内核,并挂载到sys_enter_write tracepoint 3. 每次进程调用write()时,eBPF程序执行,通过bpf_trace_printk()输出消息 4. Python脚本读取trace_pipe内容并打印到终端

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工具集中更强大的性能诊断脚本了。