前言

为啥会有这个文章呢?这还得从我把路由器玩坏了说起。
为什么会把路由器玩坏掉呢?这还得从搭建本地开发环境说起。
为什么要....这还得.....

禁止套娃

好吧,为了搭建我的本地开发环境,我尝试使用 ssh 隧道做远程映射,映射的端口只有 localhost 才能访问,这个不符合我的初衷。

我的本意是外网的 ip 可以直接访问到我的本地开发环境。

于是就又选择了frp,这个真得好用,golang 开发,全平台支持。还不需要啥子依赖。
但是,我的路由器固件不带frp插件,意味着必须要进入命令行去配置,这就给我这种懒人带来很大的挑战了。

为了,偷这个懒,我就想着,luci可以安装插件,就直接安装一个frp插件不好吗?

说干就干,瞎几把搜索一通后

opkg update
opkg install
opkg install luci-app-frpc

一通操作下来,心想,这就结束了吗?

不,不然就没有这篇文章了。
现实情况是,安装上去根本没有鸟用处。包括重启,删除luci-indexcache等操作,根本没有用处。
这让我很怀疑人生,然后就是又开始了瞎几把折腾。
我怀疑有没有出现的原因是有些软件版本过低,于是就开始一波升级操作。
就是这波操作把自己的路由器作死了。(直接无法开机了)

不过还没死透,毕竟是刷了 opboot 的家伙,还能苟活一波。
这里略去我傻逼刷错固件这一波折腾(不然就跑题了)

......

路由器起死回生后,我看到别人都可以编译路由器固件,于是决定自己来尝试一波。(其实这个念头很早就有了,只是我非常清楚编译这个很耗时的)

编译 lean 维护的固件

编译步骤:

    1. 准备编译环境

这个环境很是重要,好多环境可以避免踩很多坑
lean 是推荐 Ubuntu 18 LTS x64
不过我用的环境是wsl2 debian
我的想法是,反正ubuntu就是居于debian的,用这个应该没有多大区别。

    1. 准备编译工具

由于要进行交叉编译,因此需要很多的编译工具(也就是开发环境,这个很重要的,不然干不了活)

apt-get update
apt-get -y install build-essential asciidoc binutils bzip2 gawk gettext git libncurses5-dev libz-dev patch python3.5 unzip zlib1g-dev lib32gcc1 libc6-dev-i386 subversion flex uglifyjs git-core gcc-multilib p7zip p7zip-full msmtp libssl-dev texinfo libglib2.0-dev xmlto qemu-utils upx libelf-dev autoconf automake libtool autopoint device-tree-compiler g++-multilib antlr3 gperf

可以感受到在linux配置开发环境显然比win舒服的

    1. 下载固件源码

这里的速度用过都懂得,不用我讲。

git clone https://github.com/coolsnowwolf/lede
cd lede

编译后的仓库大小
尴尬的事情
编译过程中,会产生大量的中间文件,一度将我的 C 盘占满,不过系统依然无比流畅。如果是linux满了,很多命令都无法使用了。

    1. 更新库,配置编译选项

这里的网络环境很重要的,不然就等着排查奇奇怪怪的错误吧。

./scripts/feeds update -a
./scripts/feeds install -a
make menuconfig
make -j8 download v=s #下载 dl 库

这里就是我认为的最重要的一环了,毕竟这里我们才有了选择权

make menuconfig

编译选项

这里我们要完成最基本的选择目标系统,选择我们的 cpu 架构
然后就是要编译的目标镜像
不过,一些常见的路由器以及有大佬帮我们配置好默认配置了。
我们选上去就可以进行编译了。
真正需要选择的是给路由器编译的插件。
luci -> applications这里就可以选择我们需要的插件了。

插件选择

上面的插件如果有什么不清楚干什么的可以尽情的百度(你懂的)

链接

不过,我为了体验流程流程,我几乎把每个选项都浏览一下。
然后就是瞎几把乱选一通。(给后面留了好多坑)

    1. 开始编译
make -j1 V=s  #(-j1 后面是线程数。第一次编译推荐用单线程)即可开始编译你要的固件了。

编译后的固件

到了这里相信,已经非常熟悉该干什么了。
当然是刷机啦(不过我没有,因为刷机需要从新配置路由器)
这里的固件只有35M的大小

踩坑经历

  • undefined reference to makedev

这是我遇到的第一个错误,也是我印象最深的一个,第一次有点难。不知所措。
当时,真的很想去提交一个issue的,不过我觉得把,这个小问题大佬一定不屑于回答,而且也没有时效性。遂放弃

搜索了一圈后,发现需要添加头文件。

出错的文件是mountlist.c,在这文件里面添加# include <sys/sysmacros.h即可

  • 第二则是编译openssl的时候出现一点问题,不过我忘记怎么解决的了。

具体的原因就是sendmail用到的openssl库,但是这个库它不兼容旧版本了。出错原因就是一个类型没有具体的定义(不完全类型),解决方法是直接include对于的实现文件,但是有 dalao 指出这样会使得ABI不兼容,影响以后的patch,这还了得,我一看,直接放弃编译这个鬼东西。

  • 第三个是,编译v2ray出现了一点问题。
    go: finding github.com/v2ray/v2ray-core v4.22.1+incompatible

大概原因就是,编译的时候直接去下载依赖,但是处于鬼畜的原因
服务器返回不了正确的结果。变成了这样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然后没办法下载依赖,不知道编译什么东西,就报错了。

最后的解决方法在这里,换一个代理服务器。

  • 到了这里,编译总算是没有报错了。不过安装的时候报错!
    又是搜索引擎走一波,发现,在选择编译选项的时候有些东西选择重复了。把这些去掉就可以了。

到了这里,还是非常感谢lean大以及他维护的仓库的。

结尾

我对固件还支持这种级别的路由器感到惊讶

虽然市面一定大量存在这样的路由器的。不过这有何妨,使用这样的路由器的显然不会去关心路由器使用什么固件。对于这些人来说,原厂的固件已经足够了,足够稳了。所以,这样的路由器大多数的是一直使用原厂固件知道淘汰。此外,现在的路由器价格也便宜了,配置也高了上来。这点可以看看小米路由器的配置,感谢联发科。

说实话我自己还有一个16M ROM + 64M RAM配置的路由器,不过由于性能问题,使用的pandavan固件,会经常挂,根本无法使用。直接放弃即可,去卖二手,都不够邮费的。而且看看8M ROM + 64M RAM路由器咸鱼上面的价格就知道了。

那些说支持的,可能它家的固件是用汇编语言写的,性能高得一批。

END

Last modification:April 8th, 2020 at 01:26 am
要饭啦~