固件定制 — 编译 openwrt
2023-11-10
| 2023-11-11
0  |  0 分钟
type
status
date
slug
summary
tags
category
icon
password

前言

为啥会有这个文章呢?这还得从我把路由器玩坏了说起。
为什么会把路由器玩坏掉呢?这还得从搭建本地开发环境说起。
为什么要....这还得.....
禁止套娃
好吧,为了搭建我的本地开发环境,我尝试使用 ssh 隧道做远程映射,映射的端口只有 localhost 才能访问,这个不符合我的初衷。
我的本意是外网的 ip 可以直接访问到我的本地开发环境。
于是就又选择了frp,这个真得好用,golang 开发,全平台支持。还不需要啥子依赖。但是,我的路由器固件不带frp插件,意味着必须要进入命令行去配置,这就给我这种懒人带来很大的挑战了。为了,偷这个懒,我就想着,luci可以安装插件,就直接安装一个frp插件不好吗?说干就干,瞎几把搜索一通后
一通操作下来,心想,这就结束了吗?不,不然就没有这篇文章了。
 
现实情况是,安装上去根本没有鸟用处。包括重启,删除luci-indexcache等操作,根本没有用处。这让我很怀疑人生,然后就是又开始了瞎几把折腾。我怀疑有没有出现的原因是有些软件版本过低,于是就开始一波升级操作。就是这波操作把自己的路由器作死了。(直接无法开机了)不过还没死透,毕竟是刷了 opboot 的家伙,还能苟活一波。这里略去我傻逼刷错固件这一波折腾(不然就跑题了)路由器起死回生后,我看到别人都可以编译路由器固件,于是决定自己来尝试一波。(其实这个念头很早就有了,只是我非常清楚编译这个很耗时的)
 

编译固件

 
编译步骤:
  • 准备编译环境
这个环境很是重要,好多环境可以避免踩很多坑
lean 是推荐 Ubuntu 18 LTS x64 不过我用的环境是 wsl2 debian
我的想法是,反正 ubuntu 就是居于 debian 的,用这个应该没有多大区别。
  • 准备编译工具
由于要进行交叉编译,因此需要很多的编译工具(也就是开发环境,这个很重要的,不然干不了活)
可以感受到在linux配置开发环境显然比win舒服的
  • 下载固件源码
这里的速度用过都懂得,不用我讲。
notion image
notion image
编译过程中,会产生大量的中间文件,一度将我的 C 盘占满,不过系统依然无比流畅。如果是linux满了,很多命令都无法使用了。
 
  • 更新库,配置编译选项
这里的网络环境很重要的,不然就等着排查奇奇怪怪的错误吧。
这里就是我认为的最重要的一环了,毕竟这里我们才有了选择权
notion image
这里我们要完成最基本的选择目标系统,选择我们的 cpu 架构
然后就是要编译的目标镜像
不过,一些常见的路由器以及有大佬帮我们配置好默认配置了。
我们选上去就可以进行编译了。
真正需要选择的是给路由器编译的插件。
luci -> applications这里就可以选择我们需要的插件了。
notion image
上面的插件如果有什么不清楚干什么的可以尽情的百度(你懂的)
不过,我为了体验流程流程,我几乎把每个选项都浏览一下。<br />然后就是瞎几把乱选一通。(给后面留了好多坑)
  • 开始编译
notion image
到了这里相信,已经非常熟悉该干什么了。
当然是刷机啦(不过我没有,因为刷机需要从新配置路由器)
这里的固件只有35M的大小
 

踩坑经历

  • undefined reference to makedev
这是我遇到的第一个错误,也是我印象最深的一个,第一次有点难。不知所措。<br />当时,真的很想去提交一个issue的,不过我觉得把,这个小问题大佬一定不屑于回答,而且也没有时效性。遂放弃
搜索了一圈后,发现需要添加头文件。
出错的文件是mountlist.c,在这文件里面添加# include <sys/sysmacros.h即可
  • 第二则是编译openssl的时候出现一点问题,不过我忘记怎么解决的了。
具体的原因就是sendmail用到的openssl库,但是这个库它不兼容旧版本了。出错原因就是一个类型没有具体的定义(不完全类型),解决方法是直接include对于的实现文件,但是有 dalao 指出这样会使得ABI不兼容,影响以后的patch,这还了得,我一看,直接放弃编译这个鬼东西。
  • 第三个是,编译v2ray出现了一点问题。<br />go: finding github.com/v2ray/v2ray-core v4.22.1+incompatible
大概原因就是,编译的时候直接去下载依赖,但是处于鬼畜的原因<br />服务器返回不了正确的结果。变成了这样server response: not found: github.com/v2ray/v2ray-core@v4.22.1+incompatible: invalid version: +incompatible suffix not allowed: module contains a go.mod file, so semantic import versioning is required然后没办法下载依赖,不知道编译什么东西,就报错了。
最后的解决方法在这里,换一个代理服务器。
  • 到了这里,编译总算是没有报错了。不过安装的时候报错!<br />又是搜索引擎走一波,发现,在选择编译选项的时候有些东西选择重复了。把这些去掉就可以了。
到了这里,还是非常感谢lean大以及他维护的仓库的。
 

结尾

我对固件还支持这种级别的路由器感到惊讶
虽然市面一定大量存在这样的路由器的。不过这有何妨,使用这样的路由器的显然不会去关心路由器使用什么固件。对于这些人来说,原厂的固件已经足够了,足够稳了。所以,这样的路由器大多数的是一直使用原厂固件知道淘汰。此外,现在的路由器价格也便宜了,配置也高了上来。这点可以看看小米路由器的配置,感谢联发科。
说实话我自己还有一个16M ROM + 64M RAM配置的路由器,不过由于性能问题,使用的pandavan固件,会经常挂,根本无法使用。直接放弃即可,去卖二手,都不够邮费的。而且看看8M ROM + 64M RAM路由器咸鱼上面的价格就知道了。
那些说支持的,可能它家的固件是用汇编语言写的,性能高得一批。
 

后记

从语雀搬迁到 Notion 博客,格式有不少问题,费了不少功夫调整格式。
现在来看之前写的内容,充满一股稚气,言语之中还是有些偏激;内容和结构也无法很好给读者有实际性的参考价值,仅充当一篇胡言乱语吧(过时的乱语)。
文章得到了语雀的官方认证:「内容因含敏感信息已被系统屏蔽处理,其他人无法查看」…
 
碎片杂文
给服务器添加交换内存(Swap)一次 RDS Serverless 心酸费用之旅
目录