小米路由器 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 的对应文件!
  • 开始前必须备份所有列出的原始分区!这是设备变砖后尝试恢复的唯一希望!
  • 因操作不当导致的任何设备损坏,需自行承担责任。

刷机准备:

  1. 获取 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 文件名。

刷机步骤:

步骤 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=0ubi (表示当前在分区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=1ubi1 (表示当前在分区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
  • 仔细检查命令中的 MTD 设备号 (mtd8mtd9) 和文件名是否正确!
  • 执行完 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 的某些特性需要,或您偏好此布局)且已备份好所有分区时才尝试!

  1. 准备: 确保你已下载了 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 刷入的系统环境)。
  2. 刷入 U-Boot Mod Initramfs UBI:

    • <ChaWrt对应的ubootmod-initramfs文件名>.ubi 上传到 /tmp
    • 检查当前 MTD 分区(确认 mtd8ubi_kernel 或类似名称,mtd9ubi):cat /proc/mtd
    • 刷写到 mtd8 (此布局下 mtd8 用于存放内核/initramfs):
      ubiformat /dev/mtd8 -y -f /tmp/<ChaWrt对应的ubootmod-initramfs文件名>.ubi
    • 重启路由器:reboot
  3. 再次检查 MTD:

    • 重启后再次 SSH 连接到新的 initramfs 环境。
    • 再次检查 MTD 分区:cat /proc/mtd
    • 确认分区布局已改变,此时 mtd8 应该变成了主 ubi 分区(大小约为 112MB / 0x7000000):
      mtd7: 00040000 00020000 "KF"
      mtd8: 07000000 00020000 "ubi"
      
  4. 安装 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
  5. 清理 pstore (持久化存储):

    rm -f /sys/fs/pstore/*
  6. 格式化 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
  7. (可选) 添加 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
  8. 刷写 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
    • 这两条命令会覆写路由器的核心引导程序,一旦出错或中途断电,设备将无法启动!
  9. 刷入 U-Boot Mod Sysupgrade:

    • <ChaWrt对应的ubootmod-sysupgrade文件名>.itb 文件上传到 /tmp
    • 执行 sysupgrade 命令刷写最终系统:
      sysupgrade -n /tmp/<ChaWrt对应的ubootmod-sysupgrade文件名>.itb
    • 也可以通过 LuCI 界面上传 .itb 文件进行升级(不保留配置)。
    • 刷写完成后路由器会自动重启。
  10. 完成: 如果一切顺利,路由器现在运行在 ChaWrt/OpenWrt 通用 U-Boot 布局下的 ChaWrt 系统。


恢复到原厂固件:

方法一: 从 ChaWrt/OpenWrt 通用 U-Boot 布局恢复

  1. 启动到 Recovery/Initramfs:
    • 如果之前创建了 Recovery 分区并写入了恢复镜像,尝试触发 U-Boot 的恢复模式(具体方法可能因 U-Boot 版本而异,通常是按住 Reset 键通电等),或者如果系统能正常启动,通过 SSH 运行强制刷写 Recovery 镜像的命令(需要 <ChaWrt对应的ubootmod-recovery文件名>.itb/tmp):
      sysupgrade -F -n /tmp/<ChaWrt对应的ubootmod-recovery文件名>.itb
    • 这将使路由器重启进入 initramfs 临时系统。
  2. 格式化 UBI 和 Nvram:
    • SSH 连接到 initramfs 环境。
    • 卸载并格式化主 UBI 分区:
      ubidetach -p /dev/mtd8; ubiformat /dev/mtd8 -y; ubiattach -p /dev/mtd8
    • 擦除 Nvram 分区(环境变量):
      mtd erase Nvram
  3. 安装 MTD 写权限模块: (同上文更换 U-Boot 步骤 4)
    opkg update && opkg install kmod-mtd-rw
    insmod /lib/modules/$(uname -r)/mtd-rw.ko i_want_a_brick=1
  4. 刷回原厂引导和固件分区 (!!! 极高风险 !!!):
    • 将你之前备份的原厂 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)
    • 此步骤风险极高!
  5. 重启: 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。路由器应尝试从恢复的原厂固件分区启动。

注意事项:

  1. ChaWrt/OpenWrt 通用 U-Boot (ubootmod) 和基于它的 ChaWrt 固件版本可能没有启用 NAND 坏块管理 (NMBM)。这意味着如果闪存出现坏块,系统可能无法正常工作。因此,备份的原厂分区尤其重要。
  2. 本教程仅为根据源文档进行的翻译和适配,请务必结合 ChaWrt 官方或社区针对 WR30U 的最新说明进行操作。
  3. 刷机操作请务必谨慎,风险自负!
⚠️ **GitHub.com Fallback** ⚠️