bpftrace 运行报 libbpf failed to load 的权限/内核版本兼容坑

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 的权限/内核版本兼容坑

bpftrace 报 libbpf failed to load:先看内核是否支持 BPF_PROG_TYPE_TRACING

这个错误绝大多数时候不是权限问题,而是内核太老或未启用关键配置。bpftrace 依赖 BPF_PROG_TYPE_TRACING(即 fentry/fexit 类型),它在 Linux 5.5+ 才稳定可用,且要求内核编译时开启 CONFIG_BPF_JITCONFIG_BPF_SYSCALL(通常默认开),但 CONFIG_BPF_EVENTS(对应 tracing program 支持)在某些发行版裁剪内核里是关闭的。

快速验证方式:

  • 运行 cat /boot/config-$(uname -r) | grep -E "BPF_(JIT|SYSCALL|EVENTS)",确认三者均为 ym
  • 检查内核版本: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_BPF socket)

libbpf 版本不匹配导致的符号缺失

bpftrace 静态链接 libbpf,但部分发行版(如 CentOS Stream 9、Debian 12)预装的 libbpf 过旧,或系统中存在多个版本冲突,导致运行时找不到 bpf_link__createbtf__parse_vmlinux 等符号 —— 此时错误仍显示为泛泛的 “failed to load”,实际是 dlopen 失败。

SpeechEasy

SpeechEasy

SpeechEasy是一种合成语音解决方案,可以让用户从文本生成高质量、易于理解的音频。

下载

排查步骤:

  • 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 更有效。

https://www.php.cn/faq/2025995.html

发表回复

Your email address will not be published. Required fields are marked *