eBPF dae / daed OpenWrt 24.10+
GitHub ↗

内核 BTF

dae / daed 用 CO-RE eBPF,加载时必须有当前内核的 BTF 信息。没有它,服务就是起不来 —— 这是新装失败最常见的原因,而且报错通常只说加载失败,看不出是 BTF 缺了。

先确认缺不缺

[ -e /sys/kernel/btf/vmlinux ] && echo "已有 BTF,无需处理" || echo "缺 BTF,要补"
内核情况/sys/kernel/btf/vmlinuxdae / daed
开了 CONFIG_DEBUG_INFO_BTF(ImmortalWrt 25.12 等)有正常
官方 OpenWrt、在线 ImageBuilder 等固件没有启动失败

两条补救路

  1. 装匹配内核的 vmlinux-btf 包 —— 一键安装脚本会自动检测并拉匹配你内核 + 架构的包,也可以手动下
  2. 换一份开了 BTF 的固件 —— 用 kenzok8/imagebuilder 在线生成,内核默认已开

手动装 vmlinux-btf

先查内核与架构,再挑对应的包:

uname -r        # 例如 6.12.112
uname -m
内核版本固件 / 包管理格式
6.6.x24.10(opkg).ipk
6.12.x25.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。