bpftool 是 Linux 内核自带的 eBPF 程序管理工具,功能非常强大。以下是常用命令分类整理:


一、程序管理 (prog)

命令 说明
bpftool prog show 列出所有已加载的 eBPF 程序
bpftool prog show id <ID> 查看指定 ID 的程序详情
bpftool prog show pinned /sys/fs/bpf/xxx 查看 pinned 的程序
bpftool prog dump xlated id <ID> 查看程序的字节码(经过 JIT 翻译后)
bpftool prog dump jited id <ID> 查看 JIT 编译后的机器码
bpftool prog load <file.o> /sys/fs/bpf/xxx 加载程序并 pin 到文件系统
bpftool prog loadall <file.o> /sys/fs/bpf/dir 加载 ELF 中所有程序
bpftool prog attach id <ID> <attach_type> <target> 附加程序到目标
bpftool prog detach id <ID> <attach_type> <target> 分离程序
bpftool prog run id <ID> data_in <file> data_out <file> 手动运行程序(测试用)
bpftool prog pin id <ID> /sys/fs/bpf/xxx 将程序 pin 到文件系统
bpftool prog help 查看子命令帮助

示例

# 查看所有程序,带标签和 map 信息
bpftool prog show

# 详细查看某个程序
bpftool prog show id 42 --pretty

# 查看反汇编代码
bpftool prog dump xlated id 42 opcodes

# 加载 XDP 程序
bpftool prog load xdp_prog.o /sys/fs/bpf/xdp_prog type xdp

二、映射管理 (map)

命令 说明
bpftool map show 列出所有已加载的 map
bpftool map show id <ID> 查看指定 map 详情
bpftool map dump id <ID> 导出 map 中所有数据
bpftool map lookup id <ID> key <hex> 查询指定 key
bpftool map update id <ID> key <hex> value <hex> 更新键值对
bpftool map delete id <ID> key <hex> 删除键值对
bpftool map getnext id <ID> key <hex> 获取下一个 key(遍历用)
bpftool map create /sys/fs/bpf/xxx type <type> key <n> value <n> entries <n> 创建 map
bpftool map pin id <ID> /sys/fs/bpf/xxx pin map 到文件系统
bpftool map event_pipe id <ID> 读取 perf/ring buffer 事件

示例

# 查看所有 map
bpftool map show

# 导出 map 数据(自动解析 key/value 类型)
bpftool map dump id 10

# 更新 map(key/value 用十六进制)
bpftool map update id 10 key 0x01 0x00 0x00 0x00 value 0x0a 0x00 0x00 0x00

# 创建数组类型的 map
bpftool map create /sys/fs/bpf/my_map type array key 4 value 4 entries 1024 name my_map

三、链路管理 (link)

命令 说明
bpftool link show 列出所有 BPF link
bpftool link show id <ID> 查看指定 link
bpftool link pin id <ID> /sys/fs/bpf/xxx pin link
bpftool link detach id <ID> 分离 link

四、BTF 管理 (btf)

命令 说明
bpftool btf show 列出所有 BTF 对象
bpftool btf dump id <ID> 导出 BTF 信息
bpftool btf dump file <vmlinux> format c 从 vmlinux 生成 C 头文件
bpftool btf dump file <vmlinux> format raw 导出原始 BTF 数据

示例

# 生成 vmlinux.h 头文件(开发 eBPF 必备)
bpftool btf dump file /sys/kernel/btf/vmlinux format c > vmlinux.h

五、特性查询 (feature)

命令 说明
bpftool feature probe 探测内核 eBPF 特性支持情况
bpftool feature probe kernel 探测内核特性
bpftool feature probe libbpf 探测 libbpf 特性
bpftool feature probe macro 输出为 C 宏定义形式

示例

# 查看内核支持的 eBPF 特性
bpftool feature probe kernel

# 生成特性宏(用于条件编译)
bpftool feature probe macro > bpf_features.h

六、网络程序管理 (net)

命令 说明
bpftool net show 显示所有网络附加的 eBPF 程序
bpftool net list 同上
bpftool net attach xdp id <ID> dev <eth0> 附加 XDP 程序到网卡
bpftool net attach xdpgeneric id <ID> dev <eth0> 以 generic 模式附加 XDP
bpftool net attach xdpoffload id <ID> dev <eth0> 以硬件卸载模式附加 XDP
bpftool net detach xdp dev <eth0> 从网卡卸载 XDP 程序

示例

# 查看网卡上的 eBPF 程序
bpftool net show

# 附加 XDP 程序
bpftool net attach xdp pinned /sys/fs/bpf/xdp_prog dev eth0

# 卸载 XDP
bpftool net detach xdp dev eth0

七、性能监控 (perf)

命令 说明
bpftool perf show 列出 perf_event 附加的 eBPF 程序
bpftool perf list 同上

八、cgroup 管理

命令 说明
bpftool cgroup show <path> 显示 cgroup 上附加的程序
bpftool cgroup tree <path> 显示整个 cgroup 树
bpftool cgroup attach <path> <attach_type> id <ID> 附加程序到 cgroup
bpftool cgroup detach <path> <attach_type> id <ID> 分离程序

九、常用技巧

# 1. 查看程序加载的 map
bpftool prog show id <ID> --json | jq '.maps'

# 2. 同时查看程序和关联的 map
bpftool prog show

# 3. 格式化输出(JSON)
bpftool prog show --json --pretty

# 4. 查看程序统计信息(如果内核支持)
bpftool prog show id <ID> stats

# 5. 批量操作:加载并附加
bpftool prog load prog.o /sys/fs/bpf/prog
bpftool net attach xdp pinned /sys/fs/bpf/prog dev eth0

十、attach_type 常用值

类型 用途
xdp 网络包处理
tc / tc_ingress / tc_egress 流量控制
kprobe / kretprobe 内核函数探针
tracepoint 内核跟踪点
raw_tracepoint 原始跟踪点
perf_event 性能事件
cgroup_skb / cgroup_sock cgroup 网络控制
socket_filter 套接字过滤
sk_msg / sk_skb socket 消息处理
lirc_mode2 红外遥控
flow_dissector 流解析