小米路由 AX3600 本身目前没有开源, OpenWrt 官方也没有支持这款路由,但是网上已经陆续流出各种刷机教程和固件,特尝试一下并记录如下:
-
前言
- 本文所用文件(提取码: ewy1): https://pan.baidu.com/s/1zMzLcfj5nG3IszpbuM-btA
- 自编译 AX3600 OpenWrt 固件:AX3600 OpenWrt
- OpenWrt AX3600 WIKI: AX3600 WIKI
-
开启 SSH
-
固件降级
要开启 SSH,首先需要将小米的官方固件降级。下载 AX3600 v1.0.17 的固件,在路由器后台选择本地「固件升级」,等待降级完成后重新设置好路由器,可以登录路由后台即可。(注意关掉自动升级,以免又升级到新的版本)
固件地址:AX3600 v1.0.17 -
获取 STOK
登陆小米路由器后台后,浏览器地址栏 stok= 后面的一段内容即是需要记录的 STOK 值,准备好备用。http://192.168.31.1/cgi-bin/luci/;stok=[STOK]/web/home#router
-
获取 SSH
将下面代码中的 [STOK] 替换为第二步你自己的值(注意括号要去掉),替换完成后复制到浏览器打开,回车后显示 {code:0} 即为成功。这样即可开启 AX3600 的 SSH。http://192.168.31.1/cgi-bin/luci/;stok=[STOK]/api/misystem/set_config_iotdev?bssid=Xiaomi&user_id=longdike&ssid=-h%3B%20nvram%20set%20ssh_en%3D1%3B%20nvram%20commit%3B%20sed%20-i%20's%2Fchannel%3D.*%2Fchannel%3D%5C%22debug%5C%22%2Fg'%20%2Fetc%2Finit.d%2Fdropbear%3B%20%2Fetc%2Finit.d%2Fdropbear%20start%3B
等于执行:
(nvram set ssh_en=1;nvram commit)
(sed -i 's/channel=.*/channel="debug"/g' /etc/init.d/dropbear)
(/etc/init.d/dropbear start) -
SSH 密码
将下面代码中的 [STOK] 替换为第二步你自己的值(注意括号要去掉),替换完成后复制到浏览器打开,回车后显示 {code:0} 即为成功。这样就将 root 的密码设置为 admin 了。http://192.168.31.1/cgi-bin/luci/;stok=[STOK]/api/misystem/set_config_iotdev?bssid=Xiaomi&user_id=longdike&ssid=-h%3B%20echo%20-e%20'admin%5Cnadmin'%20%7C%20passwd%20root%3B
等于执行:
(echo -e 'admin\nadmin' | passwd root) -
备份 bdata
现在应该可以通过 ssh 连接到 小米 AX3600 了(密码是 admin),在小米 AX3600 上执行如下代码,将 mtd9 备份一下,以备不时之需。nanddump -f /tmp/bdata_mtd9.img /dev/mtd9
将 /tmp/bdata_mtd9.img 下载并做好备份。
-
固化 SSH
接下来把下载的 mitool.zip 解压出的 3 个文件上传到路由 /tmp 目录里; 然后依次执行:# 移至 data 目录,长期保存,以备后续使用 mv /tmp/mitool /data cp /data/mitool/* /tmp chmod +x /tmp/mitool* # 使用 mitool.sh 解锁 /tmp/mitool.sh unlock # 机器会自动重启,重启后继续执行 /tmp/mitool.sh hack
至此就设置好了永久 ssh、telnet、uart 权限并自动重启,同时会计算出默认的 root 密码,注意记录保存密码,恢复出厂后 telnet 和 ssh 需要用;如需查看密码,可执行如下命令:
# 查看默认密码 /tmp/mitool.sh password
- 注意事项:
- 如果丢失 SSH ,你也可以 telnet 连接上 AX3600 后执行如下代码,即可恢复。(用户名是 root,密码是刚才第六步固化 SSH 后得出的密码)
sed -i 's/channel=.*/channel="debug"/g' /etc/init.d/dropbear /etc/init.d/dropbear start
- 失败恢复,通过恢复之前备份的 bdata 分区来恢复。
mtd write /tmp/bdata_mtd9.img bdata
- 如果丢失 SSH ,你也可以 telnet 连接上 AX3600 后执行如下代码,即可恢复。(用户名是 root,密码是刚才第六步固化 SSH 后得出的密码)
-
刷入 QSDK
-
首先需要设置 env 开启必要的选项,ssh 下依次输入以下命令:
nvram set flag_last_success=0 nvram set flag_boot_rootfs=0 nvram set flag_boot_success=1 nvram set flag_try_sys1_failed=0 nvram set flag_try_sys2_failed=0 nvram set boot_wait=on nvram set uart_en=1 nvram set telnet_en=1 nvram set ssh_en=1 nvram commit
-
mtd 写入 qsdk 固件,首先把固件 xiaomimtd12.bin 传到路由器 tmp 目录下,然后 ssh 命令输入:
mtd write /tmp/xiaomimtd12.bin rootfs
-
拨电源重启路由器,启动起来后由浏览器 192.168.1.1,进入 qsdk 固件。
-
在后台 web 页面的备份升级菜单下,升级 qsdk 固件 nand-ipq807x-single.img。因为 qsdk 的固件比较大,原版两个 rootfs 分区比较小挂载不上ubi_date,这一步是把 rootfs_1 分区扩大到128M。从最后的备注章节我们可以看到不同系统下的 mtd 分区大小,rootfs_1 由原来的 023c0000 变为了 08000000。(16进制:35M 到 128M)
mtd12: 023c0000 00020000 "rootfs"
mtd13: 023c0000 00020000 "rootfs_1"mtd12: 023c0000 00020000 "rootfs"
mtd13: 08000000 00020000 "rootfs_1" -
再在后台 web 页面下刷相同固件(nand-ipq807x-single.img)一次。由于上一步把分区表改掉了,rootfs_1 分区定重新构建 UBI,所以定重新刷一遍固件。
-
由于固件一直在 rootfs 分区里,现在需要 ssh 把固件启动切换到另一个分区 rootfs_1 中,ssh 执行下面两条命令,然后重启,刷机完成。
fw_setenv flag_last_success 1 fw_setenv flag_boot_rootfs 1
-
备注:以上全部成功完成后 qsdk 才算刷完。
-
刷双固件
-
刷机方法
在 qsdk 固件下把固件 xiaomi1.1.12.ubi 上传到路由器的 /tmp 目录,ssh 输入以下命令:ubiformat /dev/mtd12 -y -f /tmp/xiaomi1.1.12.ubi
如果没有报错误,则刷机成功,现在就是双系统了。
-
系统切换
# qsdk --> Mi 切换方法: fw_setenv flag_last_success 0 fw_setenv flag_boot_rootfs 0 # 重启后进入小米系统,telnet 连接路由器,输入以下命令再次开起 ssh,并修改 ssh root 密码为 admin: sed -i 's/channel=.*/channel=\"debug\"/g' /etc/init.d/dropbear /etc/init.d/dropbear start echo -e 'admin\nadmin' | passwd root # Mi--> qsdk 的切换方法: nvram set flag_last_success=1 nvram set flag_boot_rootfs=1 nvram commit
-
备注:双固件下必须把小米的自动升级关掉,小米的刷机模式是 a-b,b-a,自动升级就会把 qsdk 固件覆盖成小米固件,刷新升级小米固件必须在qsdk模式下命令进行。
-
QSDK 刷到 OpenWrt
由于 QSDK 有校验,无法通过 web 界面直接更新,可以使用 sysupgrade 或 ubiformat 强制更新。
-
使用 sysupgrade(建议尽量不要使用 sysupgrades 升级):
选定要用的升级包:openwrt-ipq807x-generic-xiaomi_ax3600-squashfs-nand-sysupgrade.bin,将文件上传到路由器的 /tmp 目录下,再用 SSH 登录到终端中,执行命令:sysupgrade -F -n /tmp/openwrt-ipq807x-generic-xiaomi_ax3600-squashfs-nand-sysupgrade.bin
刷写后,会自动重启。
-
使用 ubiformat
首先用 SSH 登录到终端中,执行如下命令,切换到小米固件下(rootfs 分区)。# 切换至小米系统 rootfs分区 fw_setenv flag_last_success 0 fw_setenv flag_boot_rootfs 0 reboot
重启路由器后,IP 地址(192.168.31.1)可能会变,注意鉴别。选定要用的升级包:openwrt-ipq807x-generic-xiaomi_ax3600-squashfs-nand-factory.ubi,将文件上传到路由器 /tmp ,运行如下命令进行写入:
ubiformat /dev/mtd13 -y -f /tmp/openwrt-ipq807x-generic-xiaomi_ax3600-squashfs-nand-factory.ub nvram set flag_last_success=1 nvram set flag_boot_rootfs=1 nvram commit
ubiformat 可以刷 .ubi .bin 固件都可以。拔电源重启路由器。(必须拔电源重新启动路由器不要打命令重新启动)
-
备注:
-
小米固件通过浏览器执行 shell code:
http://192.168.31.1/cgi-bin/luci/;stok=<STOK>/api/misystem/set_config_iotdev?bssid=Xiaomi&user_id=longdike&ssid=-h%3B<your encoded shell code>%3B
-
查看当前分区
fw_printenv -n flag_boot_rootfs 或者 nvram get flag_boot_rootfs
可以用上面的命令查看返回值是 1 还是 0。
- 返回 0 是小米系统 (mtd12:rootfs)
- 返回 1 是 OpenWRT 系统 (mtd13:rootfs_1)
-
小米固件 Flash Layout:
root@XiaoQiang:~# cat /proc/mtd dev: size erasesize name mtd0: 00100000 00020000 "0:SBL1" mtd1: 00100000 00020000 "0:MIBIB" mtd2: 00300000 00020000 "0:QSEE" mtd3: 00080000 00020000 "0:DEVCFG" mtd4: 00080000 00020000 "0:RPM" mtd5: 00080000 00020000 "0:CDT" mtd6: 00080000 00020000 "0:APPSBLENV" mtd7: 00100000 00020000 "0:APPSBL" mtd8: 00080000 00020000 "0:ART" mtd9: 00080000 00020000 "bdata" mtd10: 00080000 00020000 "crash" mtd11: 00080000 00020000 "crash_syslog" mtd12: 023c0000 00020000 "rootfs" mtd13: 023c0000 00020000 "rootfs_1" mtd14: 01ec0000 00020000 "overlay" mtd15: 00080000 00020000 "rsvd0" mtd16: 0041e000 0001f000 "kernel" mtd17: 0160a000 0001f000 "ubi_rootfs" mtd18: 01876000 0001f000 "data"
-
QSDK Flash Layout:
root@OpenWrt:~# cat /proc/mtd dev: size erasesize name mtd0: 00100000 00020000 "0:SBL1" mtd1: 00100000 00020000 "0:MIBIB" mtd2: 00300000 00020000 "0:QSEE" mtd3: 00080000 00020000 "0:DEVCFG" mtd4: 00080000 00020000 "0:RPM" mtd5: 00080000 00020000 "0:CDT" mtd6: 00080000 00020000 "0:APPSBLENV" mtd7: 00100000 00020000 "0:APPSBL" mtd8: 00080000 00020000 "0:ART" mtd9: 00080000 00020000 "bdata" mtd10: 00080000 00020000 "crash" mtd11: 00080000 00020000 "crash_syslog" mtd12: 023c0000 00020000 "rootfs" mtd13: 08000000 00020000 "rootfs_1" mtd14: 01ec0000 00020000 "overlay" mtd15: 00080000 00020000 "rsvd0" mtd16: 00900000 00020000 "0:WIFIFW" mtd17: 00554000 0001f000 "kernel" mtd18: 019cb000 0001f000 "ubi_rootfs" mtd19: 0578d000 0001f000 "rootfs_data" mtd20: 0022e000 0001f000 "wifi_fw"
-
OpenWrt Flash Layout:
root@OpenWrt:/dev# cat /proc/mtd dev: size erasesize name mtd0: 00100000 00020000 "0:sbl1" mtd1: 00100000 00020000 "0:mibib" mtd2: 00300000 00020000 "0:qsee" mtd3: 00080000 00020000 "0:devcfg" mtd4: 00080000 00020000 "0:rpm" mtd5: 00080000 00020000 "0:cdt" mtd6: 00080000 00020000 "0:appsblenv" mtd7: 00100000 00020000 "0:appsbl" mtd8: 00080000 00020000 "0:art" mtd9: 00080000 00020000 "bdata" mtd10: 00080000 00020000 "crash" mtd11: 00080000 00020000 "crash_syslog" mtd12: 023c0000 00020000 "rootfs" mtd13: 08000000 00020000 "rootfs_1" mtd14: 01ec0000 00020000 "overlay" mtd15: 00080000 00020000 "rsvd0" mtd16: 00900000 00020000 "0:wififw"