Openwrt固件编译问题汇总

openwrt固件编译总体不复杂,但其中还是会或多或少的约到一些问题。常见的问题及解决办法如下:

不兼容官方源

自编译固件在使用openwrt官方源安装软件(kmod*)的时候会提示内核版本不一致,这是由于自己编译的固件的内核MD5值和官方固件的内核MD5不一致造成的。生成内核hash的代码位置在 include/kernel-defaults.mk 里:

grep '=[ym]' $(LINUX_DIR)/.config.set | LC_ALL=C sort | mkhash md5 > $(LINUX_DIR)/.vermagic

所以只要.config.set有变动和openwrt官方的不一致都会造成MD5 hash值的不一致。怎么解决这个问题呢:

1、排除修改的内核选项。比如调整了CONFIG_XXX,那么修改hash代码如下:

grep '=[ym]' $(LINUX_DIR)/.config.set | grep -v CONFIG_XXX | LC_ALL=C sort | mkhash md5 > $(LINUX_DIR)/.vermagic

这种方法对于少量修改还行,量大了就会比较麻烦。

2、直接将openwrt官方的hash值写死到.vermagic文件里,比如:

echo "hash value" > $(LINUX_DIR)/.vermagic

具体的hash value可以在openwrt官网找到对应内核文件名字的后半截也就是hash值,或者用命令:

curl -sL https://downloads.openwrt.org/releases/$ver-xxx/targets/$arch-xxx/$sub-arch/openwrt-xxxx.manifest | grep "^kernel" | sed -e 's/.*-\(.*\)$/\1/' > .vermagic 
sed -i -e 's/^\(.\).*vermagic$/\1cp $(TOPDIR)\/.vermagic $(LINUX_DIR)\/.vermagic/' include/kernel-defaults.mk

这种方法能解决一部分kmod安装报错的问题,但还有一部分是无法解决的,比如kmod-tun,因为内核代码中有很多 #ifdef CONFIG_XXX 之类的预处理判断,比如sk_buff(数据包在 Linux 内核中的结构体),在这个结构体的定义里面就有这样的判断:
include/linux/skbuff.h

#ifdef CONFIG_NET_SCHED
        __u16                        tc_index;        /* traffic control index */
#endif

意思是 CONFIG_NET_SCHED 启用的时候(OpenWrt 对应 kmod-sched 这个 kmod,QoS 会用到),这个 tc_index 变量就会在这个结构体里,否则不存在,这是在编译前确定的。如果编译前没选中,编译之后却强行安装这个 kmod,而 sk_buff 还是原来的结构(没有 tc_index 变量),那么只要一有网络传输就会崩溃。

所以对于需要深度使用kmod的自定义固件,最好还是把这类kmod编译进固件,而不是后期安装。

留下评论

您的邮箱地址不会被公开。 必填项已用 * 标注