从零开始给你的路由器编译一份openwrt——以HC5661A为例

如果说路由器太冷门没有固件?那就自己动手编译一个。家里的极路由1S(HC5661A)从入手到现在已经接近三年了,不过折腾的次数却不多,这款路由器内置的处理器MT7628AN性能有些不足,而且路由器就是路由器,我个人认为他只要做好路由器的工作就可以了,也不需要他去处理诸如网络代理,远程下载等服务,唯一需要他做的就是通过dnsmasq转发DNS请求,处理DNS污染。

由于这是我初次购入的智能路由器,在购买的时候了解不多,实际上极路由1S当时的这一款属于特殊版,CPU和原版有区别,导致很多固件不支持该型号。我最初用的固件是PandoraBox几乎是仅仅对openwrt做了适配,上手体验一般,而且由于仅仅做了适配,在使用过程中出现过掉线等问题。
随后就刷了老毛子的Padavan,是由恩山论坛的坛友编译的,Padavan这固件还是不错的,适配做的比较好,所有硬件都能用,而且自带了非常多的插件,包括DDNS的插件,代理的插件以及Nginx和PHP环境,不过缺点也挺明显,opt包太大了,必须要挂载SD卡才能安装插件,不然就只有路由功能,这就有点蛋疼了,而且糟心的是极路由1S挂SD卡效果不是很好,再加上买的SD卡不是什么大牌子,主控也垃圾,用一段时间就会有坏块,需要取出来fdisk修复一下,而且修复后有时候会丢数据。
说实话我最初还是打算用路由器装aria2挂种子的,实际上我也试过,MT7628AN这破性能着实不行,挂种子速度最快3M/s,而且经常会把路由器搞崩,于是乎最近闲下来,就打算把这个路由器给刷掉,只保留最基础的路由功能,其他的交给斐讯N1.

这里编译一份官方的master分支主线的openwrt作为演示,实际上编译任何第三方的openwrt源码都是一样的。这里我还演示了一下如何利用patch修复主线openwrt不兼容HC5661A的SD卡的问题。编译openwrt需要3GB以上的磁盘空间剩余,以及Linux环境和稳定的网络连接,为了可以使用干净的Linux系统进行编译,我还推荐使用Docker容器进行构建。当然使用境外的VPS进行编译也可以,因为编译过程要下载大量的源代码,国内访问很慢,但是编译出来的镜象通常不大,可以轻松从国外服务器上拉回来。

openwrt的编译需要安装编译所需要的gcc等编译环境,使用apt直接安装(演示使用docker 安装 debian:latest 镜象)

apt-get install build-essential asciidoc binutils bzip2 gawk gettext git libncurses5-dev libz-dev patch 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 -y

openwrt的编译不能使用root用户进行,所以我们需要创建一个无权限用户,使用adduser命令创建用户并且进入该用户su kunger然后从官方拉取源代码

git clone https://github.com/openwrt/openwrt.git

从github拉取源代码需要一定的时间,由于github的CDN速度较慢,建议使用代理,openwrt的源代码仓库大小约为160M,在shell环境下可以使用环境变量设置代理命令为

export http_proxy="http://proxy:port/"
export https_proxy="http://proxy:port/"
export ftp_proxy="http://proxy:port/"

成功获取到源代码之后我们要对源代码打补丁,以支持SD卡。补丁参考:https://github.com/yujincheng08/HC5661A.dts/issues/2

如果你的路由器型号不是HC5661A或者你不需要SD卡,请不到进行以下操作
#请确保您已位于openwrt源代码根目录
cd target/linux/ramips/patches-4.14 && wget https://github.com/LGA1150/openwrt/raw/exp/target/linux/ramips/patches-4.14/500-hack-mt76x8-pinctrl-esdmode.patch
cd ../dts && rm -rf mt7628an_hiwifi_hc5661a.dts && wget https://github.com/LGA1150/openwrt/raw/exp/target/linux/ramips/dts/mt7628an_hiwifi_hc5661a.dts
cd ../images && rm -rf mt76x8.mk && wget https://github.com/LGA1150/openwrt/raw/exp/target/linux/ramips/image/mt76x8.mk
#为了保证其他代码与官方仓库同步,建议按照https://github.com/LGA1150/openwrt/commit/dfca39524bade71ddd49ae24278e9914818c7dad记录只修改增加部分

接下来处理openwrt依赖包,使用命令更新依赖并且安装,更新依赖过程会检测必要的软件是否安装,您也可以在这里确认依赖包已经全部安装.

./scripts/feeds update -a #下载依赖包
./scripts/feeds install -a #安装依赖包

接下来就可以开始配置内核了,内核配置中有大量的选项,通常情况下我们只要需选择好我们的设备所对应的Target System|Subtarget|Target Profile就可以了,其他的软件包,内核组件等都可以在编译完成并刷入路由器后通过opkg包管理进行安装.

make menuconfig #配置内核

选择好CPU信息之后,不要忘记往下翻,到LuCI中开启web界面,虽然web界面也可以在刷入路由后安装,不过刷入路由后通过命令行配置网络比较麻烦,还是通过web操作比较快,我们也可以顺便在LuCI配置中的Application选项中提前编译需要的LuCI应用(带有界面的应用)
处理好所有的配置项之后,将光标移至save保存,保存名称默认即可.然后到exit退出配置菜单,接下来就可以执行编译操作了.

make -j8 #8线程编译,根据实际情况选择

如果网络畅通,依赖齐全,接下来就是坐和放宽,喝杯茶等待一段时间,第一次编译还会自动下载Linux内核,u-boot等源代码,时间会久一些,第二次编译就不需要下载了.

如果编译报错,使用如下参数查看make报错 make -j1 V=99

编译完成后,生成的bin文件保存于bin/target/XXXX/XXXX/openwrt-xxxx-xxxx-xxxx-squashfs-sysupgrade.bin,编译还会生成一个内核文件,我们并不需要那个文件.最后将这个bin包通过任何方式刷入路由器闪存开机就可以了.默认的root用户没有密码.

于是乎我们就有了一台原生openwrt的路由器,没有任何第三方插件,实际上我这张图并不是原生openwrt,原生openwrt自带的软件比这个还少,我是用的是coolsnowwolf的LEDE包,coolsnowwolf大佬的仓库中的openwrt源代码启用了bbr加速,以及非常多实用的小插件(迅雷快鸟,aria2,代理插件等),而且有LuCI界面,使用起来非常方便.
coolsnowwolf的LEDE仓库:https://github.com/coolsnowwolf/lede

由于coolsnowwolf的LEDE仓库不是最新的openwrt仓库,所以SD卡补丁无法使用,如果强行打上会无法开机

HC5661A这个型号确实是比较久了,最后折腾了一大顿,选择了阉掉SD卡使用LEDE仓库,安装了bbr,dnsmasq-full,KMS激活服务器,多播插件和部分图表监控插件,编译出来的包13M,正好塞满闪存,目前使用的感觉还不错.

坤哥

博主Kunger,现在是一名PHP/RN开发者。

留下你的评论

*评论支持代码高亮<pre class="prettyprint linenums">代码</pre>