You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确执行bpftool struct_ops register命令及环境搭建咨询

问题翻译

我在Linux主线版本(commit 2d1bcbc6cd70)中编译了bpftool与BPF自测套件,但在Ubuntu 22.04客户机系统执行bpftool struct_ops register bpf_cubic.bpf.o命令时失败,报错信息为:

libbpf: struct_ops init_kern: struct tcp_congestion_ops data is not found in struct bpf_struct_ops_tcp_congestion_ops
libbpf: failed to load object 'bpf_cubic.bpf.o'

编译内核与BPF的宿主机系统为Ubuntu 23.04。此外,我希望了解可成功运行bpftool struct_ops register xxx.o命令的环境配置(含OS版本示例、内核.config示例)。我已执行bpftool btf dump file /sys/kernel/btf/vmlinux命令,得到bpf_struct_ops_tcp_congestion_ops的结构信息如下:

[64291] STRUCT 'bpf_struct_ops_tcp_congestion_ops' size=256 vlen=3
        'refcnt' type_id=298 bits_offset=0
        'state' type_id=64117 bits_offset=32
        'data' type_id=63569 bits_offset=512

问题原因分析

核心问题是宿主机编译的BPF目标文件与客户机内核的BTF结构不匹配:

  • 你在Ubuntu23.04宿主机编译的bpf_cubic.bpf.o,依赖的是主线内核(commit 2d1bcbc6cd70)中bpf_struct_ops_tcp_congestion_ops的结构定义,其中包含与tcp_congestion_ops的字段映射关系。
  • 但Ubuntu22.04客户机默认内核(5.15版本)的bpf_struct_ops_tcp_congestion_ops结构,与编译时依赖的主线内核结构不一致。从你提供的客户机BTF信息看,data字段的类型ID与宿主机编译时预期的tcp_congestion_ops结构不匹配,导致libbpf加载失败。

解决方法

1. 统一内核版本

在Ubuntu22.04客户机上安装与编译BPF程序时相同的主线内核(commit 2d1bcbc6cd70):

  • 下载该commit的内核源码,在Ubuntu22.04环境下编译安装(保留编译时的.config配置)
  • 重启客户机切换到该内核后,再执行bpftool struct_ops register命令

2. 客户机本地编译BPF程序

直接在Ubuntu22.04客户机上编译bpftool和BPF自测套件:

  • 安装编译依赖:sudo apt install build-essential libelf-dev zlib1g-dev flex bison
  • 下载主线commit 2d1bcbc6cd70的内核源码,编译bpftool:cd tools/bpf/bpftool && make
  • 编译BPF自测套件中的bpf_cubic.bpf.o:进入内核源码的tools/testing/selftests/bpf目录执行make

可成功运行的环境配置示例

OS版本示例

  • 宿主机/客户机统一使用Ubuntu23.04(默认内核6.2,或自行编译主线commit 2d1bcbc6cd70)
  • 或统一使用Ubuntu22.04 + 自行编译的主线内核(commit 2d1bcbc6cd70)

内核.config关键配置项

确保内核编译时开启以下BPF相关配置(必须项):

# BPF基础支持
CONFIG_BPF=y
CONFIG_BPF_SYSCALL=y

# BPF Struct Ops支持
CONFIG_BPF_STRUCT_OPS=y
CONFIG_BPF_STRUCT_OPS_TCP_CONGESTION=y

# BTF支持(结构类型匹配必备)
CONFIG_DEBUG_INFO_BTF=y
CONFIG_DEBUG_INFO=y

# 辅助配置
CONFIG_BPF_JIT=y
CONFIG_CGROUP_BPF=y
CONFIG_NET_CLS_BPF=y
CONFIG_NET_ACT_BPF=y

验证配置:编译内核后,执行zcat /proc/config.gz | grep -E "(BPF|BTF)"确认上述配置已开启。

内容的提问来源于stack exchange,提问作者Zhouyi Zhou

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 07:00:01