OpenWRT固件编译笔记-K2P篇

发布于 1 天前  19 次阅读


记得几年前的时候,我曾经给当时在用的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一栏,回车进入路由器型号选择菜单。

OpenWRT固件编译笔记-K2P篇

在菜单中找到Phicomm K2P并按空格选中。

OpenWRT固件编译笔记-K2P篇

回到主菜单,移动到Kernel modules一栏,回车进入内核模块菜单。

在内核模块菜单中移动到Wireless Drivers一栏,回车进入无线驱动菜单。

OpenWRT固件编译笔记-K2P篇

在无线驱动菜单中找到MT7615e的固件及驱动,按y将这两项加入即将编译的固件中。

OpenWRT固件编译笔记-K2P篇

按右方向键,选中菜单下方的<Exit>,一路回车到主菜单。

接着在主菜单中移动到LuCI一栏,回车进入LuCI菜单。

在LuCI菜单中移动到Collections,回车进入LuCI集合菜单。

OpenWRT固件编译笔记-K2P篇

yluci加入固件,然后返回LuCI菜单,并移动到Modules,回车进入LuCI模块菜单。

OpenWRT固件编译笔记-K2P篇

yluci-compat加入固件,然后返回LuCI菜单,并移动到Applications,回车进入LuCI应用菜单。

OpenWRT固件编译笔记-K2P篇

yluci-app-easymesh加入固件,然后按右方向键,选中菜单下方的<Save>,将修改的配置文件保存。

OpenWRT固件编译笔记-K2P篇

直接回车,无需另存为。

OpenWRT固件编译笔记-K2P篇

保存完后,即可一路<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桑的技术支持,不然这个固件以及这篇文章一定会咕好久。