bpftrace 报 libbpf failed to load 主因是内核不支持 BPF_PROG_TYPE_TRACING:需 Linux 5.5+、CONFIG_BPF_EVENTS=y/m、BTF 可用,且 kernel.unprivileged_bpf_disabled=0(非 root 时),同时确保 libbpf 版本匹配。

bpftrace 报 libbpf failed to load:先看内核是否支持 BPF_PROG_TYPE_TRACING
这个错误绝大多数时候不是权限问题,而是内核太老或未启用关键配置。bpftrace 依赖 BPF_PROG_TYPE_TRACING(即 fentry/fexit 类型),它在 Linux 5.5+ 才稳定可用,且要求内核编译时开启 CONFIG_BPF_JIT 和 CONFIG_BPF_SYSCALL(通常默认开),但 CONFIG_BPF_EVENTS(对应 tracing program 支持)在某些发行版裁剪内核里是关闭的。
快速验证方式:
- 运行
cat /boot/config-$(uname -r) | grep -E "BPF_(JIT|SYSCALL|EVENTS)",确认三者均为y或m - 检查内核版本:
uname -r,低于 5.5 的内核即使配置全开,也可能因缺少btf_vmlinux或 fentry 注入逻辑而失败 - 运行
bpftrace -e 'kprobe:do_sys_open { printf("hit\n"); }'—— 如果报libbpf failed to load且无更具体提示,大概率是内核不支持
权限不足时的真实表现和绕过方式
真正因权限失败时,错误通常附带 EPERM 或明确提到 cap_sys_admin,而不是笼统的 “failed to load”。bpftrace 默认需要 CAP_SYS_ADMIN(root 或 capability 授权),普通用户即使加了 sudo,若系统启用了 kernel.unprivileged_bpf_disabled=1(常见于 Ubuntu 22.04+、RHEL 9+),也会静默拒绝。
检查与临时放开(仅调试用):
- 查看当前设置:
sysctl kernel.unprivileged_bpf_disabled,返回1即禁用 - 临时允许非特权加载:
sudo sysctl kernel.unprivileged_bpf_disabled=0 - 注意:该开关不影响 root 用户,只控制普通用户能否调用 bpf() 系统调用
- 若仍失败,检查是否被 seccomp 或容器限制(如 Docker 默认禁用
AF_BPFsocket)
libbpf 版本不匹配导致的符号缺失
bpftrace 静态链接 libbpf,但部分发行版(如 CentOS Stream 9、Debian 12)预装的 libbpf 过旧,或系统中存在多个版本冲突,导致运行时找不到 bpf_link__create、btf__parse_vmlinux 等符号 —— 此时错误仍显示为泛泛的 “failed to load”,实际是 dlopen 失败。
排查步骤:
- 用
ldd $(which bpftrace) | grep bpf看链接的是哪个libbpf.so - 运行
bpftrace --version,对比其构建时的 libbpf commit(如 v1.3.0)与系统库版本 - 最稳妥解法:从源码编译 bpftrace,确保与系统 libbpf 头文件和 so 一致;或使用官方预编译二进制(自带静态 libbpf)
- 避免混用包管理器安装的 libbpf-dev 和手动编译的 bpftrace
内核 BTF 缺失或路径不对
bpftrace 在加载 tracing program 前会尝试读取内核 BTF(/sys/kernel/btf/vmlinux),用于参数解析和类型安全。若该文件不存在(常见于未启用 CONFIG_DEBUG_INFO_BTF=y 的内核),或路径被覆盖(如通过 BTF_DIR 环境变量指定错误路径),libbpf 会在加载阶段直接退出,并报 “failed to load”。
确认与修复:
- 检查 BTF 是否可用:
ls /sys/kernel/btf/vmlinux,无输出则内核未编译 BTF 支持 - Ubuntu/Debian 用户需安装
linux-image-$(uname -r)-dbgsym包(含 BTF) - CentOS/RHEL 用户需启用
debuginfo仓库并安装kernel-debuginfo - 可临时跳过 BTF 加载(功能受限):
bpftrace -v -e 'kprobe:do_sys_open { @ = count(); }' 2>&1 | grep -A5 "BTF"观察是否卡在此处
最容易被忽略的是:同一个错误信息背后,可能是内核版本、BTF、libbpf、权限四者中任意一个环节断掉。建议按 “内核版本 → BTF 存在性 → unprivileged_bpf_disabled 开关 → libbpf 符号版本” 顺序逐项排除,比反复加 sudo 更有效。










