de-brick ax3000t AP

写入 Openwrt 固件的时候一不小心弄错了分区,结果砖了。

变砖过程

手头的小米 AX3000T 路由器官方固件是 1.0.64 版本,国内好多论坛上都说要降级到 1.0.47 版本才可以 获取 ssh 权限,进而写入 OpenWRT 固件。但阅读了官网说明 发现现在不用降级了,直接运行一个脚本即可。接下来按照官方文档,备份了原始固件,使用 nc 将固件 复制到主机,主机运行:$ nc -lp 1234 | tar xvf -,路由器运行:# tar cf - *.bin | nc 192.168.31.xx 1234。 路由器的 nc 好像不支持 -l 参数,因此 OpenWRT 的固件通过 tftp 传递过去,然后即可用 ubiformat 写入到闪存中。

问题就出在这里,写入闪存的时候要根据内核参数 firmwware=? 来决定写入哪个分区,并设置相应的 启动参数。结果我把这个弄反了,重启之后路由器在网络上没有任何响应,各种按 reset 的组合都试了 一遍,也没有任何有效的结果。

修复工具

为了能获得状态信息,只好打开路由器后盖(很紧,费了很大力气才打开),接上 UART 转接线。从串口信息 可以看到启动到 BL3 就停住了,无法执行后续的程序。同样根据官方文档指出的一个论坛文章, 使用一个 mtk_uartboot工具,可以通过串口下载执行指定 的固件。除了论坛中指出的固件下载位置,其它固件可以在 OpenWRT 的固件快照页面 下载。具体使用的命令为:

$ mtk_uartboot -s /dev/ttyUSB0 --aarch64 -p bl2-mt7981-bga-ddr3-ram.bin -f openwrt-mediatek-filogic-xiaomi_mi-router-ax3000t-ubootmod-bl31-uboot.fip

执行完命令后用 minicom 查看路由器的串口消息,发现固件一直尝试从 tftp 下载后续固件,将相应固件 放到 tftp 目录后即可正常启动。

此时如果重启的话路由器依然无法启动,必须重新使用 ubiformat 命令将固件写入正确的分区。由于此时 没有 tftp 命令,最后通过 wget 将新固件下载并写入。

此时的文件系统里也没有 nvram 命令,不知道写错的启动参数是否还需要修改。