内核 BTF
dae / daed 用 CO-RE eBPF,加载时必须有当前内核的 BTF 信息。没有它,服务就是起不来 —— 这是新装失败最常见的原因,而且报错通常只说加载失败,看不出是 BTF 缺了。
先确认缺不缺
[ -e /sys/kernel/btf/vmlinux ] && echo "已有 BTF,无需处理" || echo "缺 BTF,要补"
| 内核情况 | /sys/kernel/btf/vmlinux | dae / daed |
|---|---|---|
开了 CONFIG_DEBUG_INFO_BTF(ImmortalWrt 25.12 等) | 有 | 正常 |
| 官方 OpenWrt、在线 ImageBuilder 等固件 | 没有 | 启动失败 |
两条补救路
- 装匹配内核的 vmlinux-btf 包 —— 一键安装脚本会自动检测并拉匹配你内核 + 架构的包,也可以手动下
- 换一份开了 BTF 的固件 —— 用 kenzok8/imagebuilder 在线生成,内核默认已开
手动装 vmlinux-btf
先查内核与架构,再挑对应的包:
uname -r # 例如 6.12.112
uname -m
| 内核版本 | 固件 / 包管理 | 格式 |
|---|---|---|
6.6.x | 24.10(opkg) | .ipk |
6.12.x | 25.12(apk) | .apk |
opkg install ./vmlinux-btf_*.ipk # 24.10
apk add --allow-untrusted ./vmlinux-btf-*.apk # 25.12
包里就一个分离式 BTF blob,装到/usr/lib/debug/boot/vmlinux,并按uname -r建软链。内核找不到/sys/kernel/btf/vmlinux时,cilium/ebpf 会自动回落到这里。所以同一条 6.12 stable 线的小版本差异,一个包基本都能覆盖。
装完怎么验
ls -l /usr/lib/debug/boot/
head -c 4 /usr/lib/debug/boot/vmlinux | hexdump -C # 前两字节应为 9f eb
然后重启服务:
/etc/init.d/daede restart
还是起不来,就去看核心日志,别继续猜 —— 日志里会明确写出是 BTF 加载失败还是别的原因。
为什么同系列能通用
BTF 描述的是结构体布局与类型关系。6.12.x 这条 stable 线里,回移补丁极少动结构体布局,所以 6.12.112 的 BTF 用在 6.12.103 固件上一般没问题;真遇到「类型不匹配」,就得针对那个内核重编一份。生成方式是拿对应内核源码 + 固件配置,开 DEBUG_INFO_BTF 编一遍影子内核,再用 pahole 编码出分离式 BTF。