小米路由器 WR30U 刷入 ChaWrt 固件教程 - liudf0716/chawrt GitHub Wiki
小米路由器 WR30U 刷入 ChaWrt 固件教程
硬件规格: (仅供参考)
- SoC: MediaTek MT7981B (双核 A53)
- 闪存: ESMT F50L1G41LB 128MB (SPI-NAND)
- 内存: NT52B128M16JR-FL 256MB
- 以太网: 4 个 10/100/1000 Mbps 端口
- 交换芯片: MediaTek MT7531AE
- WiFi: MediaTek MT7976C
- 按钮: Reset (重置), Mesh (组网)
- 电源: DC 12V 1A
!!! 极度重要警告 !!!
- 刷机具有极高风险,可能导致设备永久损坏(变砖)!请务必仔细阅读、理解所有步骤后再操作。
- 本教程基于 OpenWrt 的刷机流程修改而来,用于指导刷写 ChaWrt。所有提及的固件文件名(如
.ubi
,.bin
,.itb
)必须替换为您从 ChaWrt 项目获取的、适配 小米 WR30U 的对应文件! - 开始前必须备份所有列出的原始分区!这是设备变砖后尝试恢复的唯一希望!
- 因操作不当导致的任何设备损坏,需自行承担责任。
刷机准备:
-
获取 ChaWrt 固件文件:
- 从 ChaWrt 官方或可信社区渠道,下载为 小米 WR30U 适配的全套 ChaWrt 固件文件,通常包括:
-
initramfs-factory.ubi
文件 (用于首次刷入临时系统) -
sysupgrade.bin
文件 (用于刷入最终的 ChaWrt 系统 - 适用于原厂 U-Boot 布局) - (可选,如果需要更换 U-Boot 布局)
ubootmod-initramfs-factory.ubi
文件 - (可选)
ubootmod-initramfs-recovery.itb
文件 (恢复镜像) - (可选)
ubootmod-preloader.bin
文件 (ChaWrt/OpenWrt 通用 U-Boot 的 preloader) - (可选)
ubootmod-bl31-uboot.fip
文件 (ChaWrt/OpenWrt 通用 U-Boot 的 FIP) - (可选)
ubootmod-sysupgrade.itb
文件 (用于刷入最终的 ChaWrt 系统 - 适用于通用 U-Boot 布局)
-
- 请务必确认文件适用于您的设备型号!下文中将使用
<占位符文件名>
表示您需要替换为实际的 ChaWrt 文件名。
- 从 ChaWrt 官方或可信社区渠道,下载为 小米 WR30U 适配的全套 ChaWrt 固件文件,通常包括:
刷机步骤:
步骤 1: 获取 SSH 访问权限
- 你需要先获得路由器的 SSH 访问权限才能执行后续命令。具体方法请参考 OpenWrt 论坛上的相关帖子(此方法通常也适用于 ChaWrt,因为它是在原厂固件上操作的): https://forum.openwrt.org/t/openwrt-support-for-xiaomi-ax3000ne/153769/22
- 成功获取 SSH 权限后,使用 SSH 客户端(如 PuTTY, Termius, MobaXterm 或 Windows Terminal)连接到路由器的 IP 地址。
步骤 2: 备份重要分区 (!!! 必须执行 !!!)
- 连接 SSH 后,首先查看分区信息:
cat /proc/mtd
确认存在以下分区(大小可能略有不同):dev: size erasesize name mtd1: 00100000 00020000 "BL2" (引导加载器部分1) mtd2: 00040000 00020000 "Nvram" (环境变量) mtd3: 00040000 00020000 "Bdata" (设备特定数据) mtd4: 00200000 00020000 "Factory" (无线校准数据等) mtd5: 00200000 00020000 "FIP" (引导加载器部分2) mtd8: 02200000 00020000 "ubi" (固件分区0) mtd9: 02200000 00020000 "ubi1" (固件分区1) mtd12: 00040000 00020000 "KF" (未知/关键数据?)
- 使用
nanddump
命令备份以下所有列出的重要分区到路由器的/tmp
目录:nanddump -f /tmp/BL2.bin /dev/mtd1 nanddump -f /tmp/Nvram.bin /dev/mtd2 nanddump -f /tmp/Bdata.bin /dev/mtd3 nanddump -f /tmp/Factory.bin /dev/mtd4 nanddump -f /tmp/FIP.bin /dev/mtd5 nanddump -f /tmp/ubi.bin /dev/mtd8 # 备份当前固件分区 nanddump -f /tmp/KF.bin /dev/mtd12
-
极其重要: 将
/tmp
目录下所有备份好的.bin
文件通过 SCP、SFTP、Netcat、TFTP 或其他方式传输到你的电脑上,并妥善、永久地保存在安全的地方!
步骤 3: 设置 Nvram (条件步骤)
- 此步骤是为了让路由器下次从我们即将刷写的那个分区启动。首先检查当前启动的是哪个固件分区:
cat /proc/cmdline
-
观察输出结果:
-
如果输出包含
firmware=0
或ubi
(表示当前在分区0): 执行以下命令设置路由器从分区1 (ubi1
, 即/dev/mtd9
) 启动:nvram set boot_wait=on nvram set uart_en=1 nvram set flag_boot_rootfs=1 # 设置下次从 ubi1 启动 nvram set flag_last_success=1 # 设置当前分区(ubi)启动成功 nvram set flag_boot_success=1 nvram set flag_try_sys1_failed=0 nvram set flag_try_sys2_failed=0 nvram commit
-
如果输出包含
firmware=1
或ubi1
(表示当前在分区1): 执行以下命令设置路由器从分区0 (ubi
, 即/dev/mtd8
) 启动:nvram set boot_wait=on nvram set uart_en=1 nvram set flag_boot_rootfs=0 # 设置下次从 ubi 启动 nvram set flag_last_success=0 # 设置当前分区(ubi1)启动成功 (这里原文是0,遵循原文) nvram set flag_boot_success=1 nvram set flag_try_sys1_failed=0 nvram set flag_try_sys2_failed=0 nvram commit
-
如果输出包含
- 务必根据
cat /proc/cmdline
的结果选择正确的命令组执行!
步骤 4: 刷入初始 Initramfs UBI 镜像
- 将你下载的 ChaWrt 的
initramfs-factory.ubi
文件(替换为实际文件名!)上传到路由器的/tmp
目录。 -
根据第 3 步的判断结果,刷写到 非当前启动 的那个 UBI 分区:
-
如果第 3 步执行的是
firmware=0
/ubi
的命令组 (即当前在 ubi): 刷写到/dev/mtd9
(ubi1):ubiformat /dev/mtd9 -y -f /tmp/<ChaWrt对应的initramfs-factory文件名>.ubi
-
如果第 3 步执行的是
firmware=1
/ubi1
的命令组 (即当前在 ubi1): 刷写到/dev/mtd8
(ubi):ubiformat /dev/mtd8 -y -f /tmp/<ChaWrt对应的initramfs-factory文件名>.ubi
-
如果第 3 步执行的是
- 仔细检查命令中的 MTD 设备号 (
mtd8
或mtd9
) 和文件名是否正确! - 执行完
ubiformat
命令后,重启路由器:reboot
- 路由器应该会从刚刚刷入的分区启动,进入 ChaWrt 的 initramfs 临时系统。这个系统运行在内存中。
步骤 5: 设置 U-Boot 环境变量 (fw_setenv - 在 ChaWrt initramfs 环境下)
-
注意: 较新的 ChaWrt 固件可能在后续
sysupgrade
过程中自动完成此步骤,如果第 6 步刷写成功,可以忽略此步骤。但如果遇到问题,可以尝试手动执行。 - 重启进入 ChaWrt initramfs 系统后,再次通过 SSH 连接路由器(IP 地址可能变为
192.168.1.1
或 ChaWrt 的默认地址,用户名通常是root
)。 -
如果
fw_setenv
命令无法工作 (提示找不到配置等),可能需要先指定环境变量配置文件路径:echo "/dev/mtd1 0x0 0x10000 0x20000" > /etc/fw_env.config
- 执行以下命令设置 U-Boot 环境变量,使其准备好引导最终的 ChaWrt 系统:
fw_setenv boot_wait on fw_setenv uart_en 1 fw_setenv flag_boot_rootfs 0 # 尝试从 ubi 启动 fw_setenv flag_last_success 1 # 设置 initramfs 启动成功 fw_setenv flag_boot_success 1 fw_setenv flag_try_sys1_failed 8 # 设置 ubi 启动失败次数阈值 (原文为8,可能是允许重试) fw_setenv flag_try_sys2_failed 8 # 设置 ubi1 启动失败次数阈值 fw_setenv mtdparts "nmbm0:1024k(bl2),256k(Nvram),256k(Bdata),2048k(factory),2048k(fip),256k(crash),256k(crash_log),34816k(ubi),34816k(ubi1),32768k(overlay),12288k(data),256k(KF)" # 设置 MTD 分区信息 (重要!)
fw_setenv mtdparts
这一行特别长且重要,请确保完整复制粘贴。
步骤 6: 刷入 Sysupgrade 镜像 (完成基础刷机)
- 将你下载的 ChaWrt 的
sysupgrade.bin
文件(替换为实际文件名!)上传到路由器的/tmp
目录 (仍在 ChaWrt initramfs 环境下)。 - 执行
sysupgrade
命令刷写最终的 ChaWrt 系统:sysupgrade -n /tmp/<ChaWrt对应的sysupgrade文件名>.bin
-
-n
参数表示不保留配置刷写。
-
- 或者,你可以通过浏览器访问 ChaWrt 的 LuCI Web 界面 (通常是
http://192.168.1.1
),在系统 -> 备份/升级固件 页面上传sysupgrade.bin
文件进行升级(同样选择不保留配置)。 - 刷写过程请勿断电!完成后路由器会自动重启,进入安装在闪存上的完整 ChaWrt 系统。
- 至此,使用原厂 U-Boot 布局的基础刷机过程完成。
可选部分: 更换为 ChaWrt/OpenWrt 通用 U-Boot 布局
警告: 这部分操作风险更高,涉及刷写引导加载器 (BL2, FIP) 和修改分区布局,错误操作极易导致设备变砖!仅在您明确知道需要此布局(例如 ChaWrt 的某些特性需要,或您偏好此布局)且已备份好所有分区时才尝试!
-
准备: 确保你已下载了 ChaWrt 提供的适用于 WR30U 的
ubootmod
系列文件,包括:<ChaWrt对应的ubootmod-initramfs文件名>.ubi
<ChaWrt对应的ubootmod-preloader文件名>.bin
<ChaWrt对应的ubootmod-fip文件名>.fip
<ChaWrt对应的ubootmod-sysupgrade文件名>.itb
- (可选)
<ChaWrt对应的ubootmod-recovery文件名>.itb
- 并且你仍然处于 ChaWrt 的 initramfs 环境下(即刚完成基础刷机的步骤 4,或者通过基础刷机步骤 6 刷入的系统环境)。
-
刷入 U-Boot Mod Initramfs UBI:
- 将
<ChaWrt对应的ubootmod-initramfs文件名>.ubi
上传到/tmp
。 - 检查当前 MTD 分区(确认
mtd8
是ubi_kernel
或类似名称,mtd9
是ubi
):cat /proc/mtd
- 刷写到
mtd8
(此布局下mtd8
用于存放内核/initramfs):ubiformat /dev/mtd8 -y -f /tmp/<ChaWrt对应的ubootmod-initramfs文件名>.ubi
- 重启路由器:
reboot
- 将
-
再次检查 MTD:
- 重启后再次 SSH 连接到新的 initramfs 环境。
- 再次检查 MTD 分区:
cat /proc/mtd
- 确认分区布局已改变,此时
mtd8
应该变成了主ubi
分区(大小约为 112MB / 0x7000000):mtd7: 00040000 00020000 "KF" mtd8: 07000000 00020000 "ubi"
-
安装 MTD 写权限模块 (
kmod-mtd-rw
):- 为了能刷写 BL2 和 FIP 等受保护分区,需要临时解锁 MTD 写保护。
- 安装模块(需要联网):
opkg update && opkg install kmod-mtd-rw
- 如果无法联网,需要预先下载好
kmod-mtd-rw
的.ipk
文件(版本需匹配当前内核),上传到/tmp
后手动安装:opkg install /tmp/kmod-mtd-rw*.ipk
- 加载模块,允许写入(此操作有风险!):
insmod /lib/modules/$(uname -r)/mtd-rw.ko i_want_a_brick=1
-
清理 pstore (持久化存储):
rm -f /sys/fs/pstore/*
-
格式化 UBI 并创建 U-Boot Env 卷:
- 卸载并彻底格式化主 UBI 分区,然后重新挂载:
ubidetach -p /dev/mtd8; ubiformat /dev/mtd8 -y; ubiattach -p /dev/mtd8
- 在新的 UBI 上创建用于存储 U-Boot 环境变量的卷(通常需要两个以实现冗余):
ubimkvol /dev/ubi0 -n 0 -N ubootenv -s 128KiB ubimkvol /dev/ubi0 -n 1 -N ubootenv2 -s 128KiB
- 卸载并彻底格式化主 UBI 分区,然后重新挂载:
-
(可选) 添加 Recovery (恢复) 分区:
- 如果你下载了
<ChaWrt对应的ubootmod-recovery文件名>.itb
,可以创建一个专门的恢复分区并将恢复镜像写入,以便将来更容易恢复系统。 - 创建恢复卷 (例如 10MB 大小):
ubimkvol /dev/ubi0 -n 2 -N recovery -s 10MiB
- 将恢复镜像写入该卷 (需要先将
.itb
文件上传到/tmp
):ubiupdatevol /dev/ubi0_2 /tmp/<ChaWrt对应的ubootmod-recovery文件名>.itb
- 如果你下载了
-
刷写 ChaWrt U-Boot (!!! 极高风险 !!!):
- 将
<ChaWrt对应的ubootmod-preloader文件名>.bin
和<ChaWrt对应的ubootmod-fip文件名>.fip
文件上传到/tmp
。 - 再次确认文件名无误,并且
kmod-mtd-rw
已成功加载! - 执行刷写命令:
mtd write /tmp/<ChaWrt对应的ubootmod-preloader文件名>.bin BL2 mtd write /tmp/<ChaWrt对应的ubootmod-fip文件名>.fip FIP
- 这两条命令会覆写路由器的核心引导程序,一旦出错或中途断电,设备将无法启动!
- 将
-
刷入 U-Boot Mod Sysupgrade:
- 将
<ChaWrt对应的ubootmod-sysupgrade文件名>.itb
文件上传到/tmp
。 - 执行
sysupgrade
命令刷写最终系统:sysupgrade -n /tmp/<ChaWrt对应的ubootmod-sysupgrade文件名>.itb
- 也可以通过 LuCI 界面上传
.itb
文件进行升级(不保留配置)。 - 刷写完成后路由器会自动重启。
- 将
-
完成: 如果一切顺利,路由器现在运行在 ChaWrt/OpenWrt 通用 U-Boot 布局下的 ChaWrt 系统。
恢复到原厂固件:
方法一: 从 ChaWrt/OpenWrt 通用 U-Boot 布局恢复
-
启动到 Recovery/Initramfs:
- 如果之前创建了 Recovery 分区并写入了恢复镜像,尝试触发 U-Boot 的恢复模式(具体方法可能因 U-Boot 版本而异,通常是按住 Reset 键通电等),或者如果系统能正常启动,通过 SSH 运行强制刷写 Recovery 镜像的命令(需要
<ChaWrt对应的ubootmod-recovery文件名>.itb
在/tmp
):sysupgrade -F -n /tmp/<ChaWrt对应的ubootmod-recovery文件名>.itb
- 这将使路由器重启进入 initramfs 临时系统。
- 如果之前创建了 Recovery 分区并写入了恢复镜像,尝试触发 U-Boot 的恢复模式(具体方法可能因 U-Boot 版本而异,通常是按住 Reset 键通电等),或者如果系统能正常启动,通过 SSH 运行强制刷写 Recovery 镜像的命令(需要
-
格式化 UBI 和 Nvram:
- SSH 连接到 initramfs 环境。
- 卸载并格式化主 UBI 分区:
ubidetach -p /dev/mtd8; ubiformat /dev/mtd8 -y; ubiattach -p /dev/mtd8
- 擦除 Nvram 分区(环境变量):
mtd erase Nvram
-
安装 MTD 写权限模块: (同上文更换 U-Boot 步骤 4)
opkg update && opkg install kmod-mtd-rw insmod /lib/modules/$(uname -r)/mtd-rw.ko i_want_a_brick=1
-
刷回原厂引导和固件分区 (!!! 极高风险 !!!):
- 将你之前备份的原厂
BL2.bin
,FIP.bin
,ubi.bin
文件上传到/tmp
目录。 - 仔细核对文件名和 MTD 分区名!
- 执行刷写命令:
mtd write /tmp/BL2.bin BL2 mtd write /tmp/FIP.bin FIP mtd write /tmp/ubi.bin ubi # 将备份的原厂固件写回 mtd8 (注意:这里是写到 ubi,对应通用布局的 mtd8)
- 此步骤风险极高!
- 将你之前备份的原厂
-
重启:
reboot
。路由器应该会尝试启动回原厂系统。可能需要一些时间完成首次启动配置。
方法二: 从 ChaWrt (原厂 U-Boot 布局) 恢复
- 这种情况下恢复相对简单,因为引导加载器未被修改。
- SSH 连接到 ChaWrt 系统。
- 将你备份的原厂
ubi.bin
文件上传到/tmp
。 -
确认你当前启动的是哪个分区 (
cat /proc/cmdline
),然后刷写到 另一个 分区。 例如,如果当前是firmware=0
/ubi
,则刷写mtd9
;如果当前是firmware=1
/ubi1
,则刷写mtd8
。- 假设刷写到
mtd8
:ubiformat /dev/mtd8 -y -f /tmp/ubi.bin
- 假设刷写到
-
修改 Nvram 以便下次从刷回的分区启动。 参考步骤 3 设置 Nvram 的命令,选择将
flag_boot_rootfs
设置为你刚刚刷写的那个分区(例如,如果刷写了mtd8
,则设置flag_boot_rootfs=0
)。 - 重启:
reboot
。路由器应尝试从恢复的原厂固件分区启动。
注意事项:
- ChaWrt/OpenWrt 通用 U-Boot (
ubootmod
) 和基于它的 ChaWrt 固件版本可能没有启用 NAND 坏块管理 (NMBM)。这意味着如果闪存出现坏块,系统可能无法正常工作。因此,备份的原厂分区尤其重要。 - 本教程仅为根据源文档进行的翻译和适配,请务必结合 ChaWrt 官方或社区针对 WR30U 的最新说明进行操作。
- 刷机操作请务必谨慎,风险自负!