小米路由器 4A千兆版 V2 新版硬件编译OpenWRT
luyuliang1234
2023年01月11日 18:49

经过几天折腾,算是入门了路由器刷机,写这篇文章来记录一下刷机过程,也给买到新版小米4A千兆版本的刷机玩家一个参考,文中有许多不严谨的地方,仅供参考。

B站的编辑器非常难用,如果下文显示不正确,可以移步隔壁知乎:

https://zhuanlan.zhihu.com/p/597446749

起因 (扯点废话)

学校开嵌入式课程,不过都是讲一些很浅的内容。前段时间知乎有个热搜问题是学校为什么不教git和一些工具链的使用[为什么大学c语言课不顺便教一下Linux,Makefile,git,gdb等配套工具链呢?],看了这个问题的回答,感同身受。嵌入式讲到Linux系统时,我就一直想自己编译一个Linux,随后编译了一个ARM版本的并在QEMU这种模拟器上运行。但没有实际的硬件还是感觉差那么一点。

放假回家后,发现移动送的光猫性能确实比较弱,于是弄到了光猫超级密码和PPPoE拨号密码,准备用路由器拨号。但我并非很深入的了解路由器这方面,觉得够用即可,随手在淘宝上整了一台热销的小米路由器4A千兆版。本以为官网上给出了官方固件应该很好编译,事实证明,我还是Too young,小米4A的硬件在去年进行了升级,而在OpenWrt官网上有这样的表述:

Warning 10/2022 Xiaomi is currently shipping v2 of the 4A Gigabit Edition, it's identifiable by fw version 2.30.20, and the name when assigned an IP from a DHCP(not your ISPs) via the WAN port, MiWiFi-R4AV2. This model cannot be flashed with Openwrt.

很不幸,对比了各项参数,到手的路由器就是如上所述的新款,不能直接刷机,只好去网上看看资料。幸运的是,恩山论坛上有大佬给出了似乎可用的固件(顺带一提,感觉现在很多技术论坛都不太愿意欢迎新人,恩山论坛注册似乎要邀请码,隔壁Hostloc直接关闭了注册,需要账号只能高价去淘宝购买,我一直想注册这两个论坛的账号)。

经过测试:

https://github.com/fortitudepub/openwrt-2203-r4agv2

编译后无法使用,它Release里编译好的固件亦不可用。启动后路由器LAN口DHCP并不分配IP地址。查资料发现,有的新款4A Breed里的Flash和我的不一样(并非Winbond开头,好像是unknown),不知是否为此原因导致。

https://github.com/MrTaiKe/Action_OpenWrt_Xiaomi_R4AGv2

并未给出修改好的源码完整版本,只有一些修改的文件,他编译好的固件可用,不想折腾的可以直接使用。但直接获取就没有乐趣了,于是在这里记录一下编译过程。

对技术的粗浅理解

从通俗的角度讲一下在做什么,很多大佬觉得刷机是很'显然&#​39;,很简单的过程,实际上对于刚接触的人来说,很多术语都不清楚,大佬也不愿意讲,他们认为这种简单的东西没有讲的必要,以至于很多小白概念不清,只是纯粹跟着教程做,稍有不慎搞错了什么,开不了机就变砖了。

非常非常不严谨的谈一下对路由器刷机的认识

刷机其实就是重装系统,不过主要指的是给嵌入式设备重装系统。

像安卓手机、路由器这种嵌入式的设备,启动过程是和常见的x86计算机是不一样的,一般的电脑上电以后BIOS自检,然后由BIOS引导到设备启动。嵌入式设备本来就小,因此不可能再整一块BIOS的ROM芯片,所以担当BIOS任务的那部分程序 ,是和系统是放在同一块flash芯片上,这部分程序也叫做bootloader。现在手机厂家为了防止刷机,在比较新的手机上会设置bl锁,bl锁的就是这个引导程序。从另一个角度解释了为什么手机、路由器刷机刷坏比电脑麻烦的多,因为bootloader本身也是容易破坏的。而对于x86,系统和BIOS并不放在一起,BIOS大多是固化在ROM芯片上,系统损坏的情况下可以通过BIOS修改启动顺序到U盘重装系统,除非刻意去刷写BIOS,一般情况下不会'变砖&#​39;。

Breed

Breed也是一种bootloader,之所以被称为不死,可能是因为它的界面非常友好,而且带有刷机功能,能够在引导到系统失败的情况下,在bootloader刷写系统。实际上不用Breed,用uboot等其它的bl,应该也是可以的,不过变砖了只能用编程器来救了,像我这种没编程器的新手还是刷个Breed先,比较保险。

编程器救砖

根据《组成原理》知识,冯诺依曼体系下,数据和程序都是放在存储器中。刷机刷坏无法启动时,我们可以把存储固件的芯片取下来,利用编程器重新修改里面的数据,刷入正确的固件,达到救砖的目的。但我是没有编程器的,所以每一步都要小心翼翼操作。

交叉编译

我们学习编程,大都是在IDE里点点编译运行,写好的程序就能直接跑了。但是,路由器那小小的CPU,是不可能编译出一个系统的,现在就需要在x86上编译MIPS架构的Linux,这个就是交叉编译。换个通俗的说法是:

  • 平时编译是人(x86)在厨房(利用x86的编译工具)做饭(编译x86可执行程序)给人(常常是本机)吃。

  • 交叉编译要做的是人(x86)在狗粮店(利用MIPS的交叉编译工具链)做狗粮(编译MIPS可执行程序)给狗(路由器)吃。

  • 平时编译那套放在路由器上相当于狗自己给自己做饭,是不现实的,所以才需要交叉编译这种东西。

编译过程

需要Linux环境,据说Windows上利用WSL也可以操作,但并未测试。

代码块
Shell
自动换行
复制代码
wget https://github.com/openwrt/openwrt/archive/refs/tags/v22.03.2.tar.gz tar xvf v22.03.2.tar.gzcd openwrt-22.03.2/
复制成功

在github.com/MrTaiKe/Action_OpenWrt_Xiaomi_R4AGv2 获取图中对应文件,放到/替换到上图解压的目录中。

编辑

在OWRT目录,运行

./scripts/feeds update -a

./scripts/feeds install -a

make menuconfig

接下来,可以在菜单中找到并选中

编辑切换为居中

系统优化

这也是我不想直接用别人直接编译好的固件的原因之一,有些编译好的固件,过于注重通用,简直是大杂烩,编译了一堆我根本用不上的东西,不仅仅占用空间,luci界面项目繁多也不好看。

对编译出来的固件添加优化选项,在这里设置自己需要的CFLAGS。

  Location:                                                                                                                                                                          x  x     -> Advanced configuration options (for developers)                                                                                                              x  x       -> Target Options                        

建议将默认的-mips32r2 -mtune=24kc修改为-march=1004kc(我的理解march是更加精细的匹配CPU以生成更好的代码,就像在本地计算机上使用=march=native启动当前支持的指令集),然后后面跟着你需要的优化参数,请参考

https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html

另外没有公网IP,也不需要对外提供访问的情景下,可以把安全设置全部关闭,可以提高一丢丢性能,如果非常在意安全也可以不关闭。

位于:Global build settings

接着保存,随后

make kernel_menuconfig

进入内核配置,可以参考

https://zhuanlan.zhihu.com/p/164910411,进行自定义的内核调优。

以及,可选开启BBR

开始编译

可能遇到的问题:

不允许使用Root账户编译

最佳(麻烦)的方法:

去百度找个教程添加一个新账户,再重新编译。

最省事的方法:

FORCE_UNSAFE_CONFIGURE=1 make V=s -j2

因为我是在某廉价VPS上编译,默认root账号,VPS上并无重要资料,出现问题可以快照快速恢复,使用采用省事方法。

Werror=stringop-truncation

编辑切换为居中

解决方法参考:

https://blog.csdn.net/llm_hao/article/details/124279032

刷入运行

编辑切换为居中

进一步,还可以在Breed里设置超频:

编辑切换为居中

超频效果参考:MTK MT7621等CPU超频的意义--在外网带宽足够大的时候,CPU成为传输瓶颈

https://www.right.com.cn/forum/thread-304911-1-1.html