Featured image of post 二手路由器刷机刷成砖,我用一根 TTL 线把它救回来了

二手路由器刷机刷成砖,我用一根 TTL 线把它救回来了

海鲜市场捡来的千兆路由,刷 OpenWrt 途中断电变砖,从拆机找串口到 tftpboot 恢复的全过程。

在海鲜市场花五十块收了一台二手的千兆路由器,型号是小米 AX3000T。卖家的描述只有一句"能开机,无线正常",照片拍得模糊,看不出什么。

我买它就是为了刷 OpenWrt。出租屋这边的宽带是千兆,运营商送的那台光猫路由无线太弱,隔一堵墙就掉到两格。想着换个能跑插件的机器,做分流和去广告。

结果刷到一半,它就不开机了。

事情是怎么搞砸的

AX3000T 这台的刷机流程不复杂,先降级到有漏洞的固件,拿到 SSH,再刷一个过渡的 uboot,最后从 uboot 里刷 OpenWrt 的 sysupgrade 镜像。

我前面几步都很顺。问题出在最后一步。

刷写的时候我等了大概三分钟,屏幕上没有任何输出。我以为卡住了,就顺手按了 Ctrl+C。按完之后才想起来,刷写阶段中断是最危险的操作。

再重启,只有电源灯亮,网口一个都不亮。网线插上去,电脑那边显示"未连接"。这就是俗称的砖。

先判断是哪种砖

路由器变砖分两种。

一种是 bootloader 还在,只是固件坏了。这种好救,进 uboot 或者 breed 重新刷一遍固件就行。

另一种是 bootloader 也没了,或者被写坏了。这种就得拆机上编程器,把 flash 芯片吹下来用 CH341A 之类的工具重新写。

我这台属于哪种,得看串口输出。

拆机找串口

背面四颗螺丝,其中一颗藏在脚垫下面。撬开脚垫就能看到。

外壳是卡扣的,用撬片沿着缝慢慢撬,别用蛮力,塑料很脆。我撬的时候断了一个卡子,不影响使用,但心里膈应。

打开之后,主板上有四个焊盘排成一排,旁边印着丝印:VCC GND TX RX。这就是 TTL 串口。

这种机器一般用的是 3.3V 电平,千万别接 5V。5V 接上去,主控就真的废了。

接线上的一点经验

USB 转 TTL 的线我用的是 CH340,十几块钱一根。接线的时候要注意交叉:

1
2
3
USB-TTL 的 TX  ->  路由器的 RX
USB-TTL 的 RX  ->  路由器的 TX
USB-TTL 的 GND ->  路由器的 GND

VCC 不要接。路由器自己供电,你接了 VCC 反而可能因为两路电源打架出问题。

我第一次接的时候 TX 和 RX 接反了,串口里一片空白,什么都没有。换了顺序之后立刻就有输出了。

用 PuTTY 或者 picocom 连

Windows 上用 PuTTY,选 Serial,波特率 115200,8N1,没有流控。

Linux 上我更习惯 picocom:

1
sudo picocom -b 115200 /dev/ttyUSB0

接好之后给路由器上电,串口里应该立刻刷出一堆东西。

如果什么都没出,检查三件事。TX/RX 是不是接反了,GND 有没有接,波特率对不对。有些机器是 57600,可以试试。

看到的输出说明什么

我这台上电之后,串口输出是这样的:

1
2
3
4
5
BootROM 1.0.1
...
Booting from NAND
...
*** U-Boot Boot Menu ***

到 U-Boot 这里就停了,然后开始倒计时。这说明 bootloader 还活着,属于第一种砖,有救。

如果连 BootROM 都没有,那才是第二种,得吹芯片。

倒计时的时候赶紧按任意键,能进 uboot 的命令行。进不去的话,多试几次,这个时间窗口很短,只有三秒左右。

在 uboot 里恢复

进去之后先看看环境变量:

1
MT7981> printenv

能看到 ipaddr、serverip、bootcmd 这些。bootcmd 一般是 nand read ... 之类的,说明它要从 flash 里读固件。

现在的思路是,让路由器从网络加载一个临时固件到内存里跑起来,再从内存里把正确的固件写进 flash。

先把路由器和电脑用网线直连,电脑的 IP 设成 192.168.1.2,路由器在 uboot 里的默认 IP 一般是 192.168.1.1。

1
2
3
MT7981> setenv ipaddr 192.168.1.1
MT7981> setenv serverip 192.168.1.2
MT7981> ping 192.168.1.2

能 ping 通,网络这块就没问题。

然后电脑上起一个 TFTP 服务。Windows 上用 tftpd64,Linux 上用 tftpd-hpa,把准备好的 initramfs 镜像放到服务目录里。

1
MT7981> tftpboot 0x46000000 openwrt-initramfs.bin

这个命令会把镜像从电脑拉到内存地址 0x46000000。传输过程中能看到进度条。

拉完之后:

1
MT7981> bootm 0x46000000

如果一切顺利,路由器会从内存里启动 OpenWrt。这时候它是完全跑在内存里的,断电就没了,但至少系统起来了,能进 LuCI。

从内存系统里刷回 flash

进 LuCI 之后,找到系统,备份与升级,刷写固件。选那个正式的 sysupgrade 镜像,不是 initramfs。

刷完之后机器会重启,这次从 flash 启动,就是正常的 OpenWrt 了。

如果 LuCI 进不去,也可以用命令刷:

1
sysupgrade -n /tmp/openwrt-sysupgrade.bin

-n 是不保留配置,第一次刷的时候建议加上,避免旧配置干扰。

几个必须提前准备的东西

这次能救回来,很大程度上是因为我提前下了固件。

救砖的时候你往往没有网络,尤其是你只有一条宽带、路由器又坏了的时候。所以刷机之前一定要把这些东西下好放在本地:

原厂固件。万一 OpenWrt 用不惯或者有功能问题,能刷回去。

uboot 或者 breed。这个是你救砖的唯一入口。

initramfs 镜像。就是前面那个从内存启动的镜像,每个型号都有对应的版本,不能混用。

TFTP 服务端软件。Windows 上 tftpd64 免安装,放 U 盘里备用。

这些东西加起来也就几百兆,但关键时刻能救命。

型号一定不能搞错

我下载固件的时候特意核对了三遍型号。AX3000T 有好几个版本,早期的是 MT7981,后来的换了芯片,固件完全不通用。刷错版本,大概率是彻底砖。

看型号的方法是,拆机看主控芯片上的丝印,或者用串口在 uboot 里敲 version。别信包装盒,二手机器的包装经常和机器对不上。

刷完之后

现在这台机器跑着 OpenWrt 23.05,做了几件事。

宽带拨号放在它上面,光猫改成桥接。无线开了 5G 的 160MHz,实测隔一堵墙还能跑到六百多兆。

装了几个插件,一个是广告过滤,一个是分流。分流的规则我配得比较简单,国内直连,国外走代理。

还有一个挺实用的,我把它接进了家里的 Tailscale,出门在外能直接访问局域网里的设备。

一点反思

这次变砖,纯粹是我自己手贱。

刷写的时候没有任何输出是正常的,很多固件刷写过程就是不打印东西。我应该做的是等,至少等十分钟。三分钟就按 Ctrl+C,太急了。

后来我给自己定了个规矩。任何刷写操作,只要开始了,就去泡杯茶,回来再看。宁可多等,不要中断。

还有一点,拆机之前先看拆机视频。AX3000T 的卡扣位置很刁钻,我第一次撬的时候差点把外壳掰裂。看了视频之后才知道要往哪个方向用力。

现在

这台五十块的路由器,现在是我家里网络的核心。跑了几个月,稳定性比运营商送的那台好太多。

中间重启过两次,一次是升级固件,一次是停电。除此之外没出过问题。

有时候觉得挺有意思的,花五十块钱,搭进去一个晚上,学到的比买台新的多得多。这种折腾的乐趣大概就在这儿,虽然过程很狼狈,但最后它亮起来的那一刻,确实挺爽的。

使用 Hugo 构建
主题 Stack 由 Jimmy 设计
寻 Mi 处载入中...