OpenWRT 4M flash 编译膜法导论

发布日期:分类:智能硬件 & IOT OpenWRT 4M flash 编译膜法导论无评论
时效性提醒:本文首次编写发布于5年前。

本文列举在为4MiB SPI Flash ROM的野鸡路由器(如703n,wr12u等便携路由)编译OpenWRT时遇到的一些问题和经验总结,作为备忘。

本文章编写于2019.3,请注意时效性。

关于版本

源代码均从官方的https://github.com/openwrt中获取,openwrt/openwrt为主要的仓库。改仓库的master分支为当前正在开发中的版本,更新频率相当快,编译出来的镜像为SNAPSHOT版,不推荐用在生产环境中,原因我们稍后会说。

剩下两个分支为openwrt-18.06lede-17.01,对应当前的稳定版和上一任稳定版,之前lede曾从openwrt中分裂出来,之后又合并了回去,所以名称不同。

需要注意的是,这两个分支依然是在不断更新中的,会释出新的Service Release(比如18.06.2这种),直接用其内容编译得到的也是SNAPSHOT版,正确的姿势是使用git切换到最新的Release的tag,例如:

$ git checkout v18.06.2

这样编译出来的固件就是正经的Release版了,可以从luci页面右下角写着正经的版本号。

openwrt还有一个更老的15.05版,在openwrt/chaos_calmer,不过由于太老了不是很推荐使用。

之间区别的话,当前的master分支直观来讲,luci-theme-material的一些细节又有了些改进,而且重新设计了软件管理的界面,软件包的查找在浏览器端进行,体验好很多。

关于内核版本与软件源

每个版本都有自己对应的软件源,软件源里都是编译好的二进制软件包,包括编译好的内核模块(形如kmod-*),这些软件包需要其对应的内核版本与当前固件的内核版本一直,否则opkg会告诉你依赖不匹配(内核模块软件包会依赖某个特定版本的内核),无法安装任何内核模块和依赖其的软件。

这就是不推荐使用masterSNAPSHOT版的原因,SNAPSHOT版的软件源会一直随着内核版本更新,但openwrt除非重刷固件是没法更新内核的(也没必要),所以很快你的固件就会失去大部分安装软件的能力,并过时。

但就算你是Release版,有时也会发现无法安装软件源里的内核模块,细致观察后你会发现你的内核版本与源里的内核版本虽然版本号前面都是一样的,但版本号后面的一个MD5效验值不一样,比如4.9.152-1-590acf3fecb4e0e9d01b08c7632cb3754.9.152-1-cc31d53cb91419e53898fe508afcacb0,导致依然无法安装。

这个效验值是在<build_root>/include/kernel-defaults.mk中如下生成的:

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

也就是说,如果你的编译选项改变了内核的编译选项,最后产生的效验值就会不一样。虽然这样是为了避免安装了不兼容的模块,但由于我们的内核与原版变化不大,所以我们可以强行把效验值改成与官方一致的,将上面那行改为:

echo '590acf3fecb4e0e9d01b08c7632cb375' > $(LINUX_DIR)/.vermagic

这样就可以写死这个效验值了,官方内核的效验值可以从官方固件的manifest中获取,比如:https://downloads.openwrt.org/releases/18.06.2/targets/ar71xx/tiny/openwrt-18.06.2-ar71xx-tiny.manifest

未完待续。。。

作者:WuSiYu

学生,Web开发者,智能硬件&IOT爱好者

发表评论

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