编译openwrt

2024 年 12 月 31 日

这应该是近期玩 openwrt 的最后一篇了。

本来计划自己编译一个 R5s 上的 openwrt 的,于是研究了几天。虽然能编出镜像,也能用,但要达到出的版本完全符合自己需求,还有太多工作要做。考虑到装官方版本后整理一下就能用,因此似乎不值得在这上面花太多精力。所以就简单记录一下学到的东西吧。

初始主要参考了这个固件编译脚本。很奇怪,在 github actions 上面能正常编译,但在 wsl2 或 docker 下就是不行。在 qnap 的 docker 上有奇怪的权限问题;同样做法换到 wsl2 或 windows 的 docker 上,问题就转换为工具链编译不过了。总体感觉还是预装的工具链不太对劲。由于问题不止一个,整理工具链又是个麻烦事,所以换一种思路,尝试官网路线。

R5s 在 openwrt 官网上目前暂时还是只有 snapshot 版本。因此我估计官网源码肯定能编译通过。果然,照着官网的编译系统使用说明,在 wsl2 上编译,基本还是比较正常的。需要注意的只有两点:

  1. scripts/projectsmirrors.json 是下载软件包的镜像,顺序可以调整一下,把清华源或者 ustc 源放到第一个。
  2. wsl2 的 PATH 里面包含 windows 路径,有空格,所以要写一个符合规范的 PATH。不然 u-boot 编不过。

官网对编译系统基础做了详细的讲解。还有以前看到的一篇博客文章写的也是非常清晰明了。这几天我自己连看带蒙和瞎改,大概也理解了一些。虽然不如别人那么深入,但也大概记录一下我的理解。

  1. openwrt 的编译配置方式有点像 kernel。不管是使用 make menuconfig 还是其他什么方式,核心在于根目录下生成一个 .config 文件,把所有包的参数设置进去。
  2. openwrt 的编译,打个比方来说,像是把一堆行李装箱。每个软件包都是一件行李,编译时拿来,重新包扎捆绑一下,然后塞到合适的位置。所有的软件包的行为其实都是类似的,所以你可以看到 package 目录下的基本所有包的结构都类似,就是 Makefile + 可选的 Config.in + PATCH。
    举例来说,编译 u-boot 时,行为大致按照如下顺序:
    1. 直接从 u-boot 的官网下载特定版本的 tar.gz 源码,放到 dl 目录。
    2. 源码解压到 build_dir 下的对应目录。
    3. 根据本地的编译设置,给源码打 patch。
    4. 编译生成二进制档,放到 staging_dir 下的对应目录。
    5. 最终调用打包生成镜像的软件包的时候,将二进制档合并到最终 image。
  3. 工具链也是当软件包处理的。下载源码然后编译。

所以,想要提升编译速度的话,dl 目录下的源码包可以预先下好;相对固定的软件,比如工具链,也可以考虑从编好的项目中复制一下并且 touch 到最新,这样就可以只编需要的软件。

openwrt 还有一种制作固件的方式,是调用 Image Builder 去生成。这个我没实验,只是大概理解了一下原理。参考的文章里面说的更详细一些。

Top