基于Cilium加载BPF代码失败:BTF加载报错-22求助
基于Cilium的BPF代码加载BTF报错排查思路
问题背景
我正基于Cilium向内核插入BPF代码,严格遵循官方教程编译,使用提供的Makefile编译后,通过bpftool加载目标文件至内核时持续报错。已安装所有相关依赖并升级内核至最新版本,报错信息如下:
$ sudo bpftool prog load bpf/custom/bytecount.o /sys/fs/bpf/tc/globals/bytecounter /sys/fs/bpf/tc/globals/bytecounter_maps libbpf: Error loading BTF: Invalid argument(22) libbpf: magic: 0xeb9f version: 1 flags: 0x0 hdrlen: 24 type_off: 0 type_len: 1164 stroff: 1164 str_len: 1234 btf_total_size: 2422 [1] STRICT (anon) size=32 vlen=4 type typeid=2 bitsoffset=0 key typeid=6 bitsoffset=64 value typeid=9 bitsoffset=126 max_entries type_id=12 bits_offset=192 ... [25] INT unsigned char size=1 bits_offset=0 nr_bits=8 encoding=(none) [26] FUNC_PROTO (anon) return=3 args=(15 ctx) [27] FUNC custom_hook type_id=26 vlen != 0 libbpf: Error loading .BTF into kernel: -22. Error: failed to open object file
排查思路
- 检查BTF版本兼容性:报错中BTF版本为1,需确认内核是否支持该版本。运行
bpftool btf dump file /sys/kernel/btf/vmlinux format raw | head -10查看内核BTF版本,若内核版本过新或过旧可能存在版本不匹配,建议切换到Cilium官方推荐的LTS内核(如5.15、6.1系列)。 - 验证编译工具链版本:确保
clang、llvm版本符合Cilium要求,推荐使用LLVM 14及以上版本。运行clang --version和llvm-config --version检查版本,旧版本生成的BTF可能存在格式问题。 - 检查BPF对象文件的BTF完整性:用
bpftool btf dump file bpf/custom/bytecount.o查看生成的BTF内容,对比内核导出的BTF(/sys/kernel/btf/vmlinux),排查是否存在类型定义冲突或缺失。针对报错里的FUNC custom_hook type_id=26 vlen != 0,需确认代码中custom_hook函数的定义是否符合BPF规范,参数、返回值是否与内核BTF兼容。 - 修正加载命令逻辑:Cilium自定义BPF程序通常需要通过Cilium专属工具链加载,而非直接用原生
bpftool。尝试使用cilium bpf load命令替代手动bpftool命令,避免参数遗漏或格式错误。 - 确认内核BTF相关配置:检查内核是否开启
CONFIG_DEBUG_INFO_BTF=y和CONFIG_DEBUG_INFO_BTF_MODULES=y,运行zcat /proc/config.gz | grep CONFIG_DEBUG_INFO_BTF验证配置,若未开启需重新编译内核开启对应选项。 - 清理编译缓存重新编译:删除
bpf/custom/目录下的.o文件及编译临时文件,重新执行Makefile编译,避免旧BTF缓存导致的格式异常。
内容的提问来源于stack exchange,提问作者Xuan Tuoba
相关产品推荐
相关产品推荐

