记得几年前的时候,我曾经给当时在用的WNDR4300编译过几个opkg插件。可惜当时没有做记录,现在早就忘了该如何编译了。
言归正传,最近在规划着对自家网络进行改造,也想尝试一下通过无线mesh的方式达成全屋100%的无线信号覆盖。
OpenWRT支持通过例如B.A.T.M.A.N.协议的方式组mesh,简单地看了眼文档(https://openwrt.org/docs/guide-user/network/wifi/mesh/batman
),配置文件好复杂,我选择找找看有没有什么插件能简单配置的。
和友人R桑一起翻了1小时的论坛和GitHub,最终找到一个叫luci-app-easymesh
的插件。看起来可以通过这个插件能LuCI上非常简单地配好mesh。那就用它来试试吧。
组mesh自然会用到好几台无线路由器,每一台都手动装插件实在是太麻烦,因此就有了编译一个带mesh插件的OpenWRT固件的想法。
都这么想了,那就来试试吧。从仓库中翻出几台曾经热门过的K2P A1,尝试给它们编译一版固件刷上去。
1.环境准备
1.1.准备网络环境
编译OpenWRT的时候会用到不少托管在GitHub或其他海外站点上的代码。由于众所周知的原因,如果使用内地的网络环境,代码拉取速度会特别慢。
最省事的解决方法是开一台海外VPS来操作,或者就是给编译环境开好全局加速。
1.2.部署编译环境
开始编译OpenWRT固件前,需要部署一个Linux系统,作为固件的编译环境使用。
分配给编译环境的内存建议不低于4GB,存储空间建议不低于30GB,处理器性能越高越好。
这里就按照惯例用一台Debian虚拟机来进行编译了,配置如下。
- vCPU:12线程
- 内存:16GB
- 虚拟硬盘:30GB
- 发行版:Debian 12
1.3.安装依赖包
首先依旧是按照惯例先更新一下。
apt update && apt upgrade -y
参考OpenWRT编译环境设置文档(https://openwrt.org/docs/guide-developer/toolchain/install-buildsystem
),根据所用的发行版安装对应的依赖包。
对于Debian发行版,需要安装下面这一长串的东西。
apt install build-essential asciidoc binutils flex util-linux time bzip2 gzip help2man intltool libelf-dev libncurses5-dev libncursesw5-dev libssl-dev libthread-queue-any-perl zlib1g-dev patch perl-modules git rsync gawk swig unzip wget gettext xsltproc python3-dev python3-distutils screen sudo -y
1.4.准备管理员账户
直接用root
账户来编译OpenWRT会触发报错,需要用其他账户进行编译。
执行以下命令新建一个叫“omega”的账户,并将其加进sudo
组中,从而赋予其管理员权限。
adduser omega usermod -aG sudo omega
执行以下命令切换至新建的omega
账户,接下来的所有操作将通过该账户进行。
su - omega
2.编译步骤
2.1.开启Screen窗口
我是通过SSH连接到编译环境的。虽然位于同一个局域网,理论上不会断联,但是还是保险起见,开一个Screen窗口吧。
screen -S mesh
2.2.下载OpenWRT源代码
截至目前(2025年3月12日),OpenWRT的稳定版本是24.10.0。不过这个大版本才发布没多久,我选择上个稳定版本23.05.5,用这个版本的源代码进行编译。
执行以下命令下载OpenWRT 23.05.5源代码,下载完成后解压并删除压缩包。
wget https://github.com/openwrt/openwrt/archive/refs/tags/v23.05.5.tar.gz tar -xzf openwrt-23.05.5.tar.gz && rm openwrt-23.05.5.tar.gz
2.3.下载插件源代码
执行以下命令切换至源代码目录下的package/
目录。
cd openwrt-23.05.5/package/
先下载luci-app-easymesh
依赖的luci-proto-batman-adv
包。
wget -O luci-proto-batman-adv.tar.gz https://github.com/onemarcfifty/luci-proto-batman-adv/archive/refs/tags/batman-adv.tar.gz tar -xzf luci-proto-batman-adv.tar.gz && rm luci-proto-batman-adv.tar.gz
再下载luci-app-easymesh
包。以防万一,最好给该插件中的一个easymesh.sh
脚本赋予可执行权限,防止用的时候发现插件没反应。
wget -O luci-app-easymesh.tar.gz https://github.com/torguardvpn/luci-app-easymesh/archive/refs/tags/3.8.17.tar.gz tar -xzf luci-app-easymesh.tar.gz && rm luci-app-easymesh.tar.gz chmod +x luci-app-easymesh-3.8.17/root/easymesh/easymesh.sh
插件下载完成后,执行以下命令回到源代码目录。
cd ..
2.4.修改时区
OpenWRT默认设置中的时区是UTC,可以在源代码中将默认值改为东八区。
Debian预装的编辑器是nano
,执行以下命令开始编辑相关配置脚本。
nano package/base-files/files/bin/config_generate
按Ctrl+W
组合键进入搜索模式,输入UTC
作为关键词后按回车键,跳转到set system.@system[-1].timezone='UTC'
一行。
将这一行的内容改成set system.@system[-1].timezone='CST-8'
。
然后按回车,在下面粘贴一行内容:set system.@system[-1].zonename='Asia/Shanghai'
。
最后按Ctrl+O
组合键并回车保存,按Ctrl+X
组合键退出编辑器。
2.5.配置无线默认启用
OpenWRT默认不会启用无线。为了省事,也可以在源代码中改为默认启用。
编辑相关的配置脚本。
nano package/kernel/mac80211/files/lib/wifi/mac80211.sh
按Ctrl+W
组合键进入搜索模式,输入disabled=
作为关键词后按回车键,跳转到set wireless.${name}.disabled=1
一行。
接下来当然是把1改成0,也就是将这一行的内容改成set wireless.${name}.disabled=0
。
修改完成,按Ctrl+O
组合键并回车保存,按Ctrl+X
组合键退出编辑器。
2.6.下载编译配置模板
从头开始配置编译选项比较麻烦,不妨直接下载官方配置模板,在模板的基础上改。
wget -O .config https://downloads.openwrt.org/releases/23.05.5/targets/ramips/mt7621/config.buildinfo
2.7.更新feed
更新源代码里预定义的几个默认feed,并安装到源代码中。
./scripts/feeds update -a ./scripts/feeds install -a
2.8.配置编译选项
这一步可以算是编译OpenWRT固件最复杂的一步了,需要慢慢来。
总之,先执行以下命令启动编译配置菜单。
make menuconfig
在主菜单中移动到Target Profile
一栏,回车进入路由器型号选择菜单。
在菜单中找到Phicomm K2P
并按空格选中。
回到主菜单,移动到Kernel modules
一栏,回车进入内核模块菜单。
在内核模块菜单中移动到Wireless Drivers
一栏,回车进入无线驱动菜单。
在无线驱动菜单中找到MT7615e的固件及驱动,按y
将这两项加入即将编译的固件中。
按右方向键,选中菜单下方的<Exit>
,一路回车到主菜单。
接着在主菜单中移动到LuCI
一栏,回车进入LuCI菜单。
在LuCI菜单中移动到Collections
,回车进入LuCI集合菜单。
按y
将luci
加入固件,然后返回LuCI菜单,并移动到Modules
,回车进入LuCI模块菜单。
按y
将luci-compat
加入固件,然后返回LuCI菜单,并移动到Applications
,回车进入LuCI应用菜单。
按y
将luci-app-easymesh
加入固件,然后按右方向键,选中菜单下方的<Save>
,将修改的配置文件保存。
直接回车,无需另存为。
保存完后,即可一路<Exit>
直到退出编译配置菜单。
2.9.开始编译
配置好编译选项后,终于可以开始编译啦。
先将编译要用到的源代码全部下载好。
make download
然后,全线程装填,再额外附加1个线程,编译开始——
make -j$(expr $(nproc) + 1) V=s
2.10.获取固件
编译完成后,可以在源代码目录下的bin/targets/ramips/mt7621
目录中找到编译好的固件。
编译出来的固件有2个,分别是openwrt-23.05.5-ramips-mt7621-phicomm_k2p-initramfs-kernel.bin
首次安装包和openwrt-23.05.5-ramips-mt7621-phicomm_k2p-squashfs-sysupgrade.bin
升级包。
对于已经刷过breed的K2P路由器来说,可以在breed的固件更新中,选择斐讯闪存布局,刷入升级包,将OpenWRT固件刷进路由器。
3.个人吐槽
将手头的几台K2P A1全部刷上编译好的固件,并组好无线mesh测了下。mesh本身的效果确实不错,但无线网速不是很快。
毕竟是“无线”mesh嘛,难免的事。重在确实实现了全屋无线信号覆盖。
而且以我的使用习惯,对网络要求高的设备都有网口(或者接一个网口拓展坞),也不会用到无线。
编译这个固件所花的时间比我想象中的久一些,因为一路上踩了好多坑(笑)。
还好有友人I桑帮忙一起测试固件,以及友人R桑的技术支持,不然这个固件以及这篇文章一定会咕好久。
0 Comments