配图:person lying on chair and facing on body of water photo – Free Image on Unsplash
问题
折腾软件路由过程中,升级或者有问题了想恢复出厂,想想这样一折腾,所有配置都没了,故放弃,有没有办法让新系统启动时,几乎不用任何配置,就可以正常运行呢?
方案
方案肯定是有的,比如自行编译固件,想怎么搞就怎么搞,就是成本高了点,编译一次需要的时间也很长,且门槛较高,一般人不太好折腾编译。
还有一个方案简单点,就是用 OpenWrt 官方提供的 ImageBuilder,这个相对简单一些,且构建一个固件只需要一两分钟即可。
ImageBuilder 自定义配置有两种方式,一个是通过 files 写死配置文件,如写一份网络的配置,放在 files/etc/config/network,并在构建时带上 FILES 参数,新系统启动时,就会使用自己写的配置,这样就达到了自定义的目的。
另外一个方式是 UCI defaults,在系统第一次启动时(恢复出厂后也算第一次启动)运行其定义的 UCI 命令,以达到自定义的目的,这个方案相比自定义 files 有一个好处是,OpenWrt 有一些配置是在启动时动态生成的,而 files 会覆盖掉这些逻辑生成的配置,不太科学,而 UCI default 只会覆盖想要自定义的配置项,不会影响系统本身的运行逻辑,比较科学。
实现
搞清楚方案了,就可以折腾了,折腾的成果在这里 https://github.com/ekkog/OpenWrt
介绍一下项目的运行流程
- 将必须的软件源加到构建系统中,下载必须的文件如 clash 二进制等等
- 根据模板生成配置,运行了几个替换命名,将 system-custom.tpl 配置模板中的占位符用环境变量的具体值替换,生成真正的配置放到 files/etc/uci-defaults/ 下
- 构建固件
这里用 OpenWrt 官方提供的 ImageBuilder 镜像,好处是,不用折腾环境,自己折腾环境特别麻烦,缺这少那很正常,还是用镜像靠谱省事。
具体使用写在项目的 README 里了 https://github.com/ekkog/OpenWrt#%E4%BD%BF%E7%94%A8
效果
折腾完是什么效果呢?
新系统启动后,只需要启动 OpenClash 即可,宽带配置、内网 IP 分配,DNS,时区等等,通通不用手动搞,且 OpenClash 的配置如使用模式 DNS,配置文件更新计划任务配置等等,都不要配置,点击启动,OK 了!
现在系统出问题了,随时可以恢复出厂一下,恢复出厂后需要做的事很少,马上系统就又能用了。
疑问
这里有一个不理解的事情?像 Lean 和 Lienol 的固件,有什么特色功能呢?如果特色都是软件包提供的,为什么要改一份源码呢?维护一些软件包并打包到镜像里并不需要修改一份源码,没有答案。