本文编写于 156 天前,最后修改于 38 天前,其中某些信息可能已经过时。

原文发布于简书

前言


自己用斐讯K2P也快一年了,这一年用了不少固件,恩山上比较常见的基本都碰过,早期使用mleaf的OpenWrt CC 1.7.2,后来也尝试过高恪固件,然后最近半年基本上一直在用Pandorabox/其他Lean的固件。不过这些固件都有或多或少自己有点不舒服的地方,比如很多功能自己完全用不上(USB功能、打印机等),然后导致Flash很多空间都被自己不需要的插件占用了(迫真强迫症)。在Pandorabox上有几次甚至出现了保存v2配置直接空间爆炸,路由器当场暴毙的情况。众所周知K2P的文件系统即使删除文件也不会腾出可用空间,于是想要自己定制的话,就只好自己编译咯。本文以lean的OpenWrt/lede源码为例。

2019/7/7 Update: 因lean已重新加回luci-app-ssrplus支持,暂时删除相关内容。

2019/7/16 Update:lean在最近一次commit中添加了mt7615e驱动,理论上可以不用添加闭源驱动编译了,暂未测试。

2019/7/29 查看openwrt官方的commit确认该驱动目前尚未支持5GHz wifi,恩山/github也有人确认驱动尚不可稳定使用,故本教程依旧采用闭源驱动编译。笔者自己的config文件和预编译固件在github上建了个仓库:
https://github.com/KevinMX/openwrt-phicomm-k2p-build
该仓库本意是笔者自用/备份用,不保证可用性,建议还是自己编译,这样才有意思嘛。如果喜欢的话欢迎点个star;)

2019/9/18 Update:截图全部换成了Manjaro下的,稍微好看了一点点(不算更新的更新),嗯,有一张没有换(懒)。

2019/12/16 Update:似乎lean加入了闭源驱动,无需再手动添加,勾选luci-applications-mtwifi即可。

2020/6/4 Update: 参考P3TERX的Actions-OpenWrt,利用GitHub Actions自动化构建过程,原config仓库同时archive。如需更多信息,请参考P3TERX的博客:使用 GitHub Actions 云编译 OpenWrt

准备在先


确保网络连接正常,最好全程能连接国际互联网(笑)

笔者编译时使用的是Deepin 15.10.1 x64,现在用的是Manjaro Linux现在用的是Arch Linux,其他发行版应该也没问题,Lean在他的github上推荐的是Ubuntu。当然也可以用docker镜像编译,如MacOS下即可采用此方式进行编译,友情链接沚水的自留地 / MacOS使用Docker编译OpenWrt固件 (永久失效链接)酷安/archive.is镜像/archive.org镜像

2019/6/25 Update:经测试,Windows 10 x64 1903环境下,使用WSL/Ubuntu(Windows Subsystem for Linux)也可进行正常编译。自己编译的时候发现没有ipv6支持,加上了Extra Packages-->ipv6helper,取消勾选odhcpd,问题解决。

安装编译所需的依赖包:

sudo apt -y 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

2019/8/2 Update: 如果你使用的是Arch系发行版如Arch Linux/Manjaro等,建议直接安装AUR中的openwrt-devel一键安装依赖,如::
yay -S openwrt-devel(需先安装yay或其他AUR工具,相信既然你选择了Arch这应该不是什么大问题吧)
其他配置步骤不变。
2020/1/8 Update:如在Arch系发行版下编译,建议降级gawk至4.2.1版本,否则可能出现类似strerror-sym.c:47:9: error: 'errnos_msgstr' undeclared (first use in this function)的报错。目前笔者在给k2p编译时没有遇到,但是在给R619AC/竞斗云 编译的时候遇到了这个问题。可使用如下方法:

$ yay -S downgrade    #安装downgrade脚本方便降级,可添加archlinuxcn源或从AUR安装
$ downgrade gawk
可选的包:

   1)  gawk    4.2.1  2  x86_64  (远端)
   2)  gawk    4.2.1  2  x86_64  (本地)
   3)  gawk    5.0.1  1  x86_64  (远端)
+  4)  gawk    5.0.1  2  x86_64  (远端)
+  5)  gawk    5.0.1  2  x86_64  (本地)

输入数字以选择包: 2

2020/2/5 Update: 我的配置中给k2p的v2ray开启了upx,故需安装upx方可正常编译(issue#2852)。Arch系发行版直接sudo pacman -S upx即可。

开始折腾


将源码下载下来,必要时可使用proxychains/graftcp等工具。当然,如果你本地有部署代理的话,也可以用export ALL_PROXY=proxytype://address:port的方式让整个终端都走代理出去。这里不再赘述。

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

接下来执行这条指令更新feeds并安装:

./scripts/feeds update -a && ./scripts/feeds install -a

添加MTK无线驱动


由于OpenWrt官方至今未添加mt7615的驱动所添加的mt76开源驱动至今可用性依旧堪忧(F**k MTK),因此我们目前只能使用github上泄露的闭源驱动,这里我使用的是5.0.2.0版本的:
如下步骤不再需要,直接勾选luci-applications-mtwifi即可使用lean集成好的驱动。

git clone https://github.com/MeIsReallyBa/k2p-openwrt-mt7615_5.0.2.0 package/mtk

对固件功能进行配置


执行如下指令开始配置:

make menuconfig

这里视自己情况需要而选择吧。

Target System 选择MediaTek Ralink MIPS,Subtarget选择MT7621 based boards,Target Profile选择Phicomm K2P。

接下来参考这里对MTK驱动进行配置,大概步骤如下:

主菜单选择MTK Properties-->driver-->按Y选中kmod-mt_wifi-->回车进入-->Choose First WiFi Interface-->选择MT7615E;

按Y勾选MT WIFI Driver-->WiFi Operation Modes-->按Y勾选AP-->Exit-->Exit-->选中wifi-l1-profile进入-->确保1st card勾选,其他取消勾选-->Exit-->Exit

回到MTK Properties,选择Misc进入-->勾选mtk-luci-plugin,luci-app-mtk-wifi必选,webconsole可选-->Exit*2回到menuconfig主目录

至此MTK驱动配置完成。

如使用lean源码自带驱动则无需配置。

笔者的自用插件列表大致如下:

luci-app-arpbind
luci-app-autoreboot
luci-app-ddns (包含cloudflare ddns脚本)
luci-app-firewall
luci-app-flowoffload
luci-app-ramfree
luci-app-sqm
luci-app-ssr-plus (v2ray+ShadowsocksR&服务端,去除了自己不常用的ss-kcptun插件以节省空间)
luci-app-upnp
luci-app-vlmcsd (KMS服务器)
luci-app-wifischedule
luci-app-wol (网络唤醒)
luci-theme-argon
ipv6helper
mtk 5.0.2.0闭源驱动

其余保持默认不变。

然后选择Exit,直接OK保存配置,不用改名,默认的.config就可以。

接下来执行

make download

会下载所需的文件,此时强烈建议全程代理/魔法上网,因为中途会连接到很多国外的镜像源。此处笔者使用了proxychains。即使这样还是花了一点时间。如果发现某些文件实在下载不来可以试试用浏览器/其他工具挂代理下载,然后将相应的tar.gz文件放到lede/dl目录下,并删除未下载完成的对应文件。

接下来是漫长的等待


下载完成之后就可以开始正式编译了。

make -jX V=s

其中X建议为你的CPU线程数。一般都会建议先-j1避免编译报错,不过笔者直接使用八线程编译了几次也没出什么大问题,看情况咯。

至此,编译完成,可以在lede/bin/targets/ramips/mt7621下找到编译生成的文件,我们需要的是openwrt-ramips-mt7621-k2p-initramfs-kernel.binopenwrt-ramips-mt7621-k2p-squashfs-sysupgrade.bin这两个文件。首先在breed下刷入kernel镜像,闪存布局选择“斐讯0xA0000”,然后重启登录LuCI之后再通过系统-备份/升级,不保留配置刷入sysupgrade镜像,等待重启,笔者当时刷写的时候选的公版也没翻车(大雾示范)。(其实如果只有一个镜像的话直接breed刷sysupgrade镜像就可以了)

Update 2019/8/13:关于固件刷写,Opboot和breed有所不同,参考恩山的这篇帖子,breed直接刷squashfs-sysupgrade, opboot先刷initramfs-kernel,开机后再从系统里刷squashfs-sysupgrade

Update:2020/2/19: 今天编译的时候发现出现了如下报错:

make[1]: *** [package/Makefile:103: /home/mx/lede/staging_dir/target-mipsel_24kc_musl/stamp/.package_compile] Error 2
make[1]: Leaving directory '/home/mx/lede'
make: *** [/home/mx/lede/include/toplevel.mk:218:world] 错误 2

奈何上边输出log太多,于是参考OpenWrt官方的文档
ionice -c 3 nice -n 20 make -j8 V=s CONFIG_DEBUG_SECTION_MISMATCH=y 2>&1 | tee build.log
然后看了一下build.log,发现是go部分mod下载失败导致的:
go: github.com/golang/mock@v1.2.0: Get https://proxy.golang.org/github.com/golang/mock/@v/v1.2.0.mod: dial tcp [2404:6800:4012:1::2011]:443: connect: network is unreachable
于是第一反应是动用proxychains,然而,proxychains对静态链接编译出来的的Golang程序是无效的,于是稍微用了一下graftcpgo便可以正常下载了。具体使用方法请参考graftcp的使用文档。Arch用户可直接从AUR安装graftcp-git,其他发行版需自行编译。当然,如果你的本地网络没有问题,以上都是不需要的(

如果是第二次编译,可以先执行git pull && ./scripts/feeds update -a && ./scripts/feeds install -a更新源码之后再进行编译。

至此,刷机完成。这是你独享的moment!享受自己亲手编译的固件吧!


全文基于署名-相同方式共享 4.0 国际(CC BY-SA 4.0)授权。转载请注明。

本文部分资源来自互联网,在此感谢各位大佬的无私奉献。引用出处如下:
lean的lede源码:https://github.com/coolsnowwolf/lede

自编译固件的正确刷写方法出处(笔者大雾示范不要模仿):https://www.right.com.cn/forum/forum.php?mod=viewthread&tid=695104

K2P无线驱动:https://github.com/MeIsReallyBa/k2p-openwrt-mt7615_5.0.2.0

以及配置说明:https://www.right.com.cn/forum/forum.php?mod=viewthread&tid=572784