最近翻出来一个路由器:小米路由器Pro(R3P),还是官方的固件,不过官方已经停止更新了,所以准备拿来折腾一下,刷入immortalwrt系统,过程中发现不少坑,这里记录一下
版本鉴别
这款路由器出厂有两种批次的闪存:Micron和ESMT,NAND出厂就允许存在坏块,但是Micron这批坏块分布相对多,OOB 标记行为和 ESMT 略有不同,所以在刷 OpenWrt 时可能出现一些问题,不太建议拿来刷,ESMT相对来说坏块率较低,所以如果目标是刷 OpenWrt,优先选 ESMT。
查看你的路由器的闪存是哪种批次的命令:dmesg | grep "Manufacturer ID:"
如果显示0x2c就是镁光,0xc8就是ESMT,比较遗憾的是我的就是镁光的。。。
不过也不是说Micron的闪存就不能刷,我们可以通过以下命令看看闪存的坏块情况:dmesg | grep -i block
如果坏块数量很少(比如 5~10 个)就基本安全,如果 30+风险明显增加,我的坏块只有一个,就非常安全。
开启ssh
如果你确认要刷了,得按照以下步骤开启ssh
更新开发板固件
进入MiWIFI官网固件下载地址https://www.miwifi.com/miwifi_download.html,点击ROM,搜索小米路由器Pro,选择开发板下载,直接进入路由器饿管理后台在页面上选择固件包升级即可。
下载开启ssh工具
https://www.miwifi.com/miwifi_open.html
点击开启SSH工具进入,可以下载工具包并且会给你root密码,你可以提前保存下来,按照官网提供的步骤开启ssh
- 请将下载的工具包bin文件复制到U盘(FAT/FAT32格式)的根目录下,保证文件名为miwifi_ssh.bin;
- 断开小米路由器的电源,将U盘插入USB接口;
- 按住reset按钮之后重新接入电源,指示灯变为黄色闪烁状态即可松开reset键;
- 等待3-5秒后安装完成之后,小米路由器会自动重启,之后您就可以尽情折腾啦 :)
备份原厂固件
进入ssh命令行模式后,执行cat /proc/mtd,可以看到以下分区信息:
root@XiaoQiang:~# cat /proc/mtd
dev: size erasesize name
mtd0: 0ff80000 00020000 "ALL"
mtd1: 00040000 00020000 "Bootloader"
mtd2: 00040000 00020000 "Config"
mtd3: 00040000 00020000 "Bdata"
mtd4: 00040000 00020000 "Factory"
mtd5: 00040000 00020000 "crash"
mtd6: 00080000 00020000 "crash_syslog"
mtd7: 00040000 00020000 "reserved0"
mtd8: 00400000 00020000 "kernel0"
mtd9: 00400000 00020000 "kernel1"
mtd10: 02800000 00020000 "rootfs0"
mtd11: 02800000 00020000 "rootfs1"
mtd12: 0a580000 00020000 "overlay"
我们需要插入U盘,把以上分区数据备份到U盘里,插入U盘会自动挂载到/extdisks/sda1,我是自动挂载到这里了,你确认下你是不是跟我一样,然后执行以下命令备份:
nanddump -o -f /extdisks/sda1/full_nand_backup.bin /dev/mtd0
nanddump -o -f /extdisks/sda1/mtd1_bootloader.bin /dev/mtd1
nanddump -o -f /extdisks/sda1/mtd4_factory.bin /dev/mtd4
nanddump -o -f /extdisks/sda1/mtd3_bdata.bin /dev/mtd3
nanddump -o -f /extdisks/sda1/mtd2_Config.bin /dev/mtd2
nanddump -o -f /extdisks/sda1/mtd5_crash.bin /dev/mtd5
nanddump -o -f /extdisks/sda1/mtd6_crash_syslog.bin /dev/mtd6
nanddump -o -f /extdisks/sda1/mtd7_reserved0.bin /dev/mtd7
nanddump -o -f /extdisks/sda1/mtd8_kernel0.bin /dev/mtd8
nanddump -o -f /extdisks/sda1/mtd9_kernel1.bin /dev/mtd9
nanddump -o -f /extdisks/sda1/mtd10_rootfs0.bin /dev/mtd10
nanddump -o -f /extdisks/sda1/mtd11_rootfs1.bin /dev/mtd11
nanddump -o -f /extdisks/sda1/mtd12_overlay.bin /dev/mtd12
起始最重要的只有前5个,其他不备份也行,以后恢复得靠这些备份
编译Openwrt
我这里使用的是这个开源项目:
https://github.com/immortalwrt/immortalwrt.git
编译方法我之前写过一篇博客编译x86版本的,过程大同小异
https://www.chengpei.top/archives/openwrtbian-yi
其中编译的目标得改改:
刷入方法
我在恩山论坛看了很多人的帖子,这个路由器大佬没有专门开发Breed,一般都是用的基于R3G修改的,而且由于openwrt分区布局的原因,该breed并无法直接刷入固件,需要使用特殊手法刷入,具体情况可以看这个帖子:https://www.right.com.cn/forum/thread-3208008-1-1.html
我嫌麻烦就不打算动官方的bootloader了,我找到了openwrt官方的一个文档:
https://openwrt.org/toh/xiaomi/mi_router_3_pro#unlocking_installing_openwrt
决定使用官方的方法刷,保留原厂的bootloader,好处是以后恢复原厂固件比较简单,刷入相关的命令:
# 进入u盘(具体看你的u盘是不是被自动挂载到了这里)
cd /extdisks/sda1 #(can be different if you remove and reinsert the usb stick)
# 给固件重命名一个短点的名字,注意必须使用factory包,不能使用其他
mv openwrt-ramips-mt7621-xiaomi_mir3p-squashfs-factory.bin factory.bin # give it a shorter name
# 设置启动系统为sys2
nvram set flag_try_sys1_failed=1
nvram set flag_try_sys2_failed=0
nvram set flag_boot_success=0
nvram commit
# 写入factory固件头4M的数据到kernel1分区
dd if=factory.bin bs=1M count=4 | mtd write - kernel1
# 清除rootfs0、rootfs1、overlay的数据
mtd erase rootfs0
mtd erase rootfs1
mtd erase overlay
# 跳过factory固件前4M数据,把后面的数据写入rootfs0分区
dd if=factory.bin bs=1M skip=4 | mtd write - rootfs0
# 重启
reboot
后面如果不想用openwrt可以执行以下命令切换启动系统为sys1:
fw_setenv flag_try_sys1_failed 0
fw_setenv flag_try_sys2_failed 1
fw_setenv flag_boot_success 0
不过之前原厂系统已经被擦除了,所以切换后还得通过u盘刷回原厂固件,只需要去官网下载固件然后重命名为 miwifi.bin
- 把
miwifi.bin复制到 U 盘根目录(必须是 FAT/FAT32)。 - 关电插 U 盘至路由器 USB。
- 按住 Reset 再接电源。
- 保持按住直到状态灯变黄色闪烁,然后等待5 分钟即可
因为原厂 bootloader 有识别 miwifi.bin 并执行自动恢复的机制,这就是保留原厂bootloader的好处
评论区