天下苦秦久矣!我也因为AX56U痛苦不已。不知道是固件的原因还是什么原因,内网延迟几千毫秒。
二话不说便出资上闲鱼上淘了一个AX3600。没买AX6000因为6000有些缩水,CPU、闪存都缩水了,背板带宽只有1Gbps。酸奶倒是对这个大家伙有些好奇。
刷机过程就按照教程来,先降级小米的固件,开SSH,然后刷qdsk,再刷qdsk,然后刷openwrt。看着openwrt没什么问题,我就想着刷自己编译的固件,毕竟自己的固件功能最精简!
编译环境
我用的是这个repo https://github.com/coolsnowwolf/lede
编译这种事,当然要找个多CPU多内存的设备啦。而且当然要用docker啦,毕竟我们只要build artifacts!写一个Dockerfile装好所有工具链,需要的时候commit 一下就好。
这个Dockerfile比较简单,我就不贴出来了。分享一个已经build好的base image,有需要的小伙伴可以自行下载,已经加好了科学上网的源,适合在海外VPS上跑起:
docker pull bennythink/lede # 或者 docker pull ghcr.io/bennythink/lede
如何使用?直接
docker run --rm -it bennythink/lede bash
然后看steps.txt就好了,构建结束docker cp,或者直接 -v到/lede/bin也可以。
另外我还有一个已经build好了的image,大小是22G,如果你也是AX3600,那么可以拉下来试试,应该编译很快,毕竟不用下载各种依赖
docker pull ghcr.io/bennythink/lede:eff9437-20211101
https://github.com/users/BennyThink/packages/container/package/lede
拆机救砖
刷完自己编译的固件就变砖了,小米救砖工具也没修好……
于是只能买了TTL工具。
先要拆机,AX3600非常不好拆,并且拆机前没有人告诉你底部四角防滑贴纸和说明贴纸下面有螺丝。
准备好TTL工具,我用的是FT232,AX3600左侧有四个口,根据说明分别是VCC,GND,RX,TX。FT232的TX要接路由器的RX,RX要接TX,GND接GND,VCC不接,调到1.8v
用杜邦线连接就可以
然后电脑这里,如果是macOS/Linux的话,直接用screen就好,通过lsusb/lspci或者系统信息-USB可以看到设备名称,之后将路由器通电开机,执行如下命令就可以了
screen -L /dev/cu.usbserial-A50285BI 115200 –L
Windows 需要用Putty,在设备管理器中确认COM口
进入uboot
正常来说路由器启动后就会进入uboot,默认有5秒延迟,按回车键就可以中断引导,然后就可以进入一个命令行界面救砖啦。
如果screen提示no tty、device busy什么的,可能是杜邦线没插进,再检查看看
准备tftp
macOS自带一个tftp,使用如下命令启动
sudo launchctl load -w /System/Library/LaunchDaemons/tftp.plist
把后缀是ubi的nand factory复制到/private/tftpboot
中(需要sudo)
停止可以用这个命令
sudo launchctl unload -w /System/Library/LaunchDaemons/tftp.plist
uboot刷分区
配置环境变量
网线连接电脑和路由器LAN,电脑设置IP 192.168.31.100,然后在uboot中执行如下命令
setenv serverip 192.168.31.100 setenv ipaddr 192.168.31.1
加载固件
然后加载固件到内存中
tftpboot 1.ubi
此时能看到屏幕上在走进度条,如果你没走,提示tftp server died或者卡住了,那多半是tftp服务器没配置好。
大概能看到这样的输出:
Load address: 0x44000000
done
Bytes transferred = 31457280 (1e00000 hex)
ipq807x_eth_halt: done
进度条走完之后,会留下一个数字,byte transferred 31457280(1e00000 hex)也就是固件的大小,同时最开始load address还会告诉你固件的起始地址,我这里是0x44000000
。这两个数值很重要,要记下来
获取分区信息
用smeminfo
可以获取分区信息
IPQ807x# smeminfo
flash_type: 0x2
flash_index: 0x0
flash_chip_select: 0x0
flash_block_size: 0x20000
flash_density: 0x100000
partition table offset 0x0
No.: Name Attributes Start Size
0: 0:SBL1 0x0000ffff 0x0 0x100000
1: 0:MIBIB 0x0000ffff 0x100000 0x100000
2: 0:QSEE 0x0000ffff 0x200000 0x300000
3: 0:DEVCFG 0x0000ffff 0x500000 0x80000
4: 0:RPM 0x0000ffff 0x580000 0x80000
5: 0:CDT 0x0000ffff 0x600000 0x80000
6: 0:APPSBLENV 0x0000ffff 0x680000 0x80000
7: 0:APPSBL 0x0000ffff 0x700000 0x100000
8: 0:ART 0x0000ffff 0x800000 0x80000
9: bdata 0x0000ffff 0x880000 0x80000
10: crash 0x0000ffff 0x900000 0x80000
11: crash_syslog 0x0000ffff 0x980000 0x80000
12: rootfs 0x0000ffff 0xa00000 0x23c0000
13: rootfs_1 0x0000ffff 0x2dc0000 0x8000000
14: overlay 0x0000ffff 0xadc0000 0x1ec0000
15: rsvd0 0x0000ffff 0xcc80000 0x80000
16: 0:WIFIFW 0x0000ffff 0xcd00000 0x900000
IPQ807x#
我们需要关注12和13分区的起始和结束地址,这两个非常重要,每个人都可能不同。
由于我搞了双系统(类似Android的A/B分区),因此能看到rootfs和rootfs_1。当前我要刷的分区是13分区。
清除分区内容
保险起见,先给rootfs抹掉,自己对应起始结束地址
nand erase 0xa00000 0x23c0000 nand erase 0x2dc0000 0x8000000
写入固件
写到rootfs_1中,使用nand write
命令,这个命令接受三个参数,分别是固件内存地址,分区起始地址,固件大小。对我来说,写到rootfs_1也就是
nand write 0x44000000 0x2dc0000 0x1e00000
写到rootfs就是
nand write 0x44000000 0xa00000 0x1e00000
然后断电开机,就会发现神奇的救回来啦!
后续
之后我想用ubiformat
给小米的固件刷到rootfs
ubiformat /dev/mtd12 -y -f /tmp/xiaomi1.1.12.ubi
但是发现刷完无法切换
fw_setenv flag_last_success 0 fw_setenv flag_boot_rootfs 0
使用这个命令切不过去,即使在uboot中nand write
似乎也不行。无所谓啦,反正都用openwrt的,并且这个时候在openwrt中刷自己编译的sysupgrade就没问题,可能是我第一次选的是nand-factory所以变砖了吧……
存在的问题
Wi-Fi断流
在我的MBP16上,存在Wi-Fi断流问题,具体表现是Wi-Fi连接信号满格,但是却无法ping通任何地址,关闭Wi-Fi再开才可以。
其他设备没问题,怀疑是MBP16有什么特殊的兼容性问题?
内存泄漏
感觉似乎openwrt存在内存泄漏的问题,什么也没干就剩这么点了。当然我懂,内存这东西用起来了才好,要不然闲置就是浪费,只要尽量少用swap就好,毕竟路由器上的swap那可是闪存,不仅慢还会磨损。
感谢群友指教,openwrt默认开了zram,也就是把内存的一部分拿来压缩用,默认是系统管理大小,于是这里我看到虚拟内存202M,其实就是从RAM中拿出来的。在系统-系统中如果手动指定一个值并重启,上面的内存数值就正常了。
至少内网几千毫秒的延迟修好了!
参考资料
https://www.right.com.cn/FORUM/thread-6119565-1-1.html
https://www.right.com.cn/forum/thread-5044604-1-1.html
警告:似乎由于什么奇怪的原因,小米设备的支持被删除了,可以看这个commit https://github.com/coolsnowwolf/lede/commit/edbd8d2e9839357f3a4f0a06174d243f362b1544
git reset --hard 20a437026ae6fb7834063dbc56685b11023f06c9 可解决
--本评论由Telegram Bot回复~❤️