使用bpftool struct_ops加载bpf_cubic.o时遇libbpf Kconfig打开失败错误
加载BPF_CUBIC示例时libbpf报错无法打开系统Kconfig
我尝试将Linux内核中的bpf_cubic示例通过bpftool struct_ops命令加载到内核,代码编译成功,但执行bpftool struct_ops register bpf_cubic.o时出现如下错误:
libbpf: failed to open system Kconfig libbpf: failed to load object 'bpf_cubic.o'
补充信息
strace -f -ebpf bpftool struct_ops register bpf_cubic.o输出:
bpf(BPF_PROG_LOAD, {prog_type=BPF_PROG_TYPE_SOCKET_FILTER, insn_cnt=2, insns=0x7ffd21f7caf0, license="GPL", log_level=0, log_size=0, log_buf=NULL, kern_version=KERNEL_VERSION(0, 0, 0), prog_flags=0, prog_name="", prog_ifindex=0, expected_attach_type=BPF_CGROUP_INET_INGRESS, prog_btf_fd=0, func_info_rec_size=0, func_info=NULL, func_info_cnt=0, line_info_rec_size=0, line_info=NULL, line_info_cnt=0, attach_btf_id=0, attach_prog_fd=0, fd_array=NULL}, 144) = 3 bpf(BPF_PROG_LOAD, {prog_type=BPF_PROG_TYPE_SOCKET_FILTER, insn_cnt=2, insns=0x7ffd21f7c8e0, license="GPL", log_level=0, log_size=0, log_buf=NULL, kern_version=KERNEL_VERSION(0, 0, 0), prog_flags=0, prog_name="", prog_ifindex=0, expected_attach_type=BPF_CGROUP_INET_INGRESS, prog_btf_fd=0, func_info_rec_size=0, func_info=NULL, func_info_cnt=0, line_info_rec_size=0, line_info=NULL, line_info_cnt=0, attach_btf_id=0, attach_prog_fd=0}, 116) = 3 bpf(BPF_PROG_LOAD, {prog_type=BPF_PROG_TYPE_SOCKET_FILTER, insn_cnt=2, insns=0x7ffd21f7caf0, license="GPL", log_level=0, log_size=0, log_buf=NULL, kern_version=KERNEL_VERSION(0, 0, 0), prog_flags=0, prog_name="", prog_ifindex=0, expected_attach_type=BPF_CGROUP_INET_INGRESS, prog_btf_fd=0, func_info_rec_size=0, func_info=NULL, func_info_cnt=0, line_info_rec_size=0, line_info=NULL, line_info_cnt=0, attach_btf_id=0, attach_prog_fd=0, fd_array=NULL}, 128) = 3 libbpf: failed to open system Kconfig libbpf: failed to load object 'bpf_cubic.o' +++ exited with 255 +++
uname -r输出:
6.1.45-8-esx
ls -l /boot/config*输出:
-rw-r--r-- 1 root root 125476 Sep 20 07:09 /boot/config-6.1.45-8.ph5-esx
/boot目录内容:
config-6.1.45-8.ph5-esx linux-6.1.45-8.ph5-esx.cfg System.old efi photon.cfg vmlinuz grub systemd.cfg vmlinuz-6.1.45-8.ph5-esx grub2 System.map vmlinuz.old initrd.img-6.1.45-8.ph5-esx System.map-6.1.45-8.ph5-esx
注:我通过menuconfig启用了BTF等bpftool相关特性,编译新内核后修改了/boot/grub2/grub.cfg指向新生成的vmlinuz,但/boot下的config文件是旧版本,未启用相关特性。
问题原因
- Kconfig文件路径不匹配:libbpf默认会查找
/boot/config-$(uname -r)文件验证内核配置,但你的uname -r输出是6.1.45-8-esx,而/boot下的config文件名为config-6.1.45-8.ph5-esx,文件名不匹配导致libbpf无法找到对应配置文件。 - 现有config配置不全:即使路径匹配,当前
/boot下的config是旧版本,没有包含新内核中启用的BTF、BPF_STRUCT_OPS等必要特性,libbpf验证BPF程序依赖的内核特性时会失败。 - 新内核config未正确安装:编译新内核后,未将新生成的
.config文件复制到/boot并命名为对应内核版本的文件名,导致libbpf无法读取正确的内核配置信息。
解决方法
- 找到内核源码目录下编译新内核时生成的
.config文件,复制到/boot目录并命名为config-6.1.45-8-esx:cp /path/to/kernel/source/.config /boot/config-6.1.45-8-esx - 确保新的config文件中开启了以下必要配置项:
CONFIG_DEBUG_INFO_BTF=y CONFIG_BPF=y CONFIG_BPF_SYSCALL=y CONFIG_BPF_STRUCT_OPS=y CONFIG_TCP_CUBIC=y - 重启系统确认新内核正常运行后,重新执行
bpftool struct_ops register bpf_cubic.o命令。
内容的提问来源于stack exchange,提问作者theseeker
相关产品推荐
相关产品推荐

