小米路由器3(R3/MI3),终极折腾指南
小米路由器3(R3/MI3),终极折腾指南
提醒
本文默认你有 Linux 以及网络相关的基础知识,比如一些文件上传、路径问题、SSH 如何连接、用什么软件连接、用什么软件搭建 TFTP 服务器、网络配置等,动手之前请先多了解清楚每条命令的作用,很多细节是省略的,请勿直接动手就跟着敲,最后因为文件没上传、路径和我的不一样等问题导致各种悲剧甚至变砖。
文章可能有长,但是很详细,几乎是 R3 能折腾的所有东西了,虽然讲的是 R3,但原理上和其他型号的小米路由器大致通用,就当是学习了。
小米路由器3、Xiaomi Mi Router 3、R3、MI3 联发科 Ralink MT7620A CPU 频率 MIPS 24KEc V5.0 @580 MHz Bootloader 小米定制版 UBoot 小米定制版 Openwrt Flash 芯片 ESMT F59L1G81LA(也可能使用其他型号) Flash 大小 128 MiB NAND RAM 芯片 NT5TU64M16HG-AC RAM 大小 128 MiB DDR2 Wireless 1 SoC-integrated: MT7620A 2×2 MIMO 802.11b/g/n(2.4 GHz) Wireless 2 On-board chip: MT7612E 2×2 MIMO 802.11a/n/ac(5 GHz) Switch MT7620 built-in 10/100 switch w/vlan support USB2.0 x 1 支持 (默认禁用状态) 1 x WAN + 2 x LAN 有线百兆,无线千兆从官方固件刷任何固件之前
一、获取 SSH 权限
只有开发版固件才能开启 SSH,需要先
下载
开发版固件,然后重命名为
miwifi.bin
或
miwifi_ssh.bin
,接着放到 FAT/FAT32 格式的 U 盘根目录并插入路由器,路由器开机时长按复位键 3~5 秒直到黄灯闪烁,便会自动刷入固件。
直接在 Web 管理后台页面也能刷入,但不知道什么原因,这样刷入开发版固件,SSH 不一定会开启
有三种方式获取 root 密码:
通过官方途径
通过 sn 码计算得到
6d2df50a-250f-4a30-a5e6-d44fb0960aa0
得到 x
通过低版本开发版固件漏洞
U 盘刷入
miwifi_r3_all_55ac7_2.11.20.bin
低版本开发版固件
登录后台,取得浏览器地址栏处的 stok 值
用你的 stok 值替换掉以下网址中的
<STOK>
,然后在浏览器中逐条访问
1 |
#修改 nvram 中的 ssh 配置 |
替换以下网址中的
<OLD_PASSWORD>
为当前管理密码,
<NEW_PASSWORD>
为新密码,此操作会同时重置 Web 密码和 root 密码
1 |
#返回:{'code':0} 代表成功 |
此时 SSH 已开启,账号为 root,密码新设置的密码
二、备份
登录 SSH,使用
cat /proc/mtd
命令,可以查看到官方固件的分区布局
1 |
注意,显示的数值是十六进制的 |
然后备份各个分区
1 |
一般备份到 U 盘,把 of= 后面的路径改成你的 U 盘挂载路径(df -h 命令可以查看 U 盘挂载路径) |
三、开启 TTL
1 |
nvram set uart_en=1 #开启串口(通用异步收发传输器 Universal Asynchronous Receiver/Transmitter) |
四、刷 UBoot(可选)
小米官方的 BootLoader 就是 Uboot,为什么还要刷入新的 Uboot 呢?原因是官方把 Uboot 环境变量保存到地址段是 0x00040000 到 0x00020000(Config 分区),同时这个分区也被作为官方固件的配置分区,比如保存一些 WIFI 名称、密码等。
在 TTL 的 Uboot 命令行接口界面使用
printenv
、
setenv
、
printenv
这三个命令来分别查看、设置、保存 Uboot 环境变量,在 OpenWrt/Lede 及其衍生版固件中使用
fw_printenv
、
fw_setenv
来代替(没有保存命令,会自动保存)。
小米的官方固件(Openwrt 的定制版)却没有使用这两条命令,它使用的是和 Padavan 一样的
nvram
命令(Padavan 中使用这条命令来保存固件配置信息),所以你可能会误认为 Padavan 也支持修改 Uboot 环境变量,其实并不能。Padavan 的
nvram
命令把配置保存到地址段是 0x000001600000 到 0x000001680000(虽然名字也是 Config 分区),地址段不同, Uboot 读取不到 Padavan 设置的“环境变量”。
所以一旦刷入 Padavan 之后,将不能再使用
nvram
命令修改任何 UBoot 的环境变量,TTL 也就不能再开启。要想再开启 TTL 也可以,就是比较麻烦,Padavan 的 BootEnv 分区(0x000000040000 到 0x0000000c0000)对应官方固件的 Config 分区(0x000000040000 到 0x000000080000)+ Bdata 分区(0x000000080000 到 0x0000000c0000,该分区是备份分区,里面包含了形如 sn 码等一些重要数据备份)。官方固件的 Config 分区中只用到前面的 4096 字节,其中最前的 4 字节是 Little Endian CRC32 校验码。所以只需要把 Padavan 的 BootEnv 分区备份下来,手动更改里面的数据和校验码后使用
mtd
命令(Padavan 中使用
mtd_write
)重新刷回即可开启。
修改版的 UBoot 无视环境变量,永久的开启了 TTL,所以 Padavan 推荐刷入,X-Wrt、Openwrt/Lede 就看你心情了,但刷入过程中一定不要断电,否则变砖。如果你有十足的把握开启了 TTL 且不会把环境变量分区玩坏,那你也可以不刷。
把修改版
UBoot.bin
放到 U 盘插入到路由器,并切换到 U 盘路径后:
1 |
mtd write UBoot.bin Bootloader |
从官方固件刷 Padavan
分割固件
把 Padavan 固件
MI-3_3.4.3.9-099_版本号.trx
放到 U 盘插入到路由器,并切换到 U 盘路径,使用以下命令分割:
刷回官方
从下文的“救砖(半砖)”小节可知,同时做到以下两点,就能刷回官方:
使得 UBoot 引导 kernel0,可以有以下方式
使得 kernel0 进入恢复模式,可以有以下方式
所以有以下方案:
把环境变量 flag_last_success 设为 0( flag_try_sys1_failed=1、flag_try_sys2_failed=1 不同时为 1 时)。
但 Padavan 没有命令能直接修改环境变量,需要手动把 Padavan 的 BootEnv 分区备份下来,然后手动修改这个字段值且重新计算 CRC32 后再刷回去。
重启会进入 kernel0,你需要提前插入 U 盘并按复位键直到黄灯闪烁,进入恢复模式。
把环境变量 flag_try_sys1_failed=1、flag_try_sys2_failed=1 同时设为 1。
但 Padavan 没有命令能直接修改环境变量,需要手动把 Padavan 的 BootEnv 分区备份下来,然后手动修改这两个字段值且重新计算 CRC32 后再刷回去。
重启会进入 kernel0,红灯亮,提示你插入 U 盘并长按复位键直到黄灯闪烁,进入恢复模式。
删除系统 2(Padavan)(推荐)
1 |
mtd_write erase Firmware_Stub |
系统 2 重启会失败,flag_try_sys2_failed 自动变为 1。
自动重启会进入 kernel0,此时系统 1 也会启动失败,flag_try_sys1_failed 自动变为 1。
再次自动重启会进入 kernel0,红灯亮,提示你插入 U 盘并长按复位键直到黄灯闪烁,进入恢复模式。
从官方固件刷 X-Wrt
文件说明
X-Wrt 官网 提供了以下五个文件下载:
1 |
x-wrt-版本号-ramips-mt7620-xiaomi_miwifi-r3-squashfs-breed-factory.bin |
同时
这里
有个第三方编译的,多提供了一个
openwrt-ramips-mt7620-xiaomi_miwifi-r3-initramfs-kernel.bin
文件
分别说明这些文件的用处,更多详细信息参考 这里
breed-factory.bin
X-Wrt 作者为从 PandoraBox 刷到 X-Wrt 而订制的,适用于 Breed/pb-boot 恢复界面刷入。
你也可以在 PandoraBox 的 SSH 内,使用如下命令刷入:
1 |
mtd write x-wrt-版本号-ramips-mt7620-xiaomi_miwifi-r3-squashfs-breed-factory.bin firmware |
刷入重启后登录后台管理界面,再使用 sysupgrade.bin 升级即可
但采用此方法刷入,pb-boot 作为引导程序时,不可以固件内使用 sysupgrade.bin 升级,因为分区布局不同,固件内升级时会不升级 kernel,只会升级 rootfs。(这里也不太确定,有错请指正)
factory.bin
factory 固件比 sysupgrade 固件包含更多的信息,一般用于从厂商的固件刷成 Openwrt 的固件。
Openwrt 官方给出的解释原文
The two have the same content, but a factory image would have extra header information or whatever the platform needs. Generally speaking, the factory image is to be used with the OEM GUI or OEM flashing utilities to convert the device to OpenWrt. After that, use the sysupgrade images.
kernel1.bin
rootfs0.bin
根文件系统
sysupgrade.bin
一般作为固件内升级包,之前叫 trx ,包含 kernel 和 rootfs。
也可以用于 TTL 中先在 RAM 运行 initramfs-kernel.bin,然后在管理页面把 sysupgrade.bin 永久刷到 Flash 中,具体看 这里 的视频教程。 这种方法刷入的好处是有坏块越过机制,否则有坏块时 mtd 命令有可能刷不进去。
initramfs-kernel.bin
包含了
Initial Ram File System
和
kernel
,一个只运行在 RAM 中的完整系统。
刷到分区
和 Padavan 一样,把 kernel1 和 rootfs0 刷入即可
1 |
mtd write x-wrt-版本号-ramips-mt7620-xiaomi_miwifi-r3-squashfs-kernel1.bin kernel1 |
刷回官方
从下文的“救砖(半砖)”小节可知,同时做到以下两点,就能刷回官方:
使得 kernel0 进入恢复模式,可以有以下方式
所以有以下方案:
把环境变量 flag_last_success 设为 0( flag_try_sys1_failed=1、flag_try_sys2_failed=1 不同时为 1 时)。
1 |
fw_setenv flag_last_success 0 |
重启会进入 kernel0,你需要提前插入 U 盘并按复位键直到黄灯闪烁,进入恢复模式。
把环境变量 flag_try_sys1_failed=1、flag_try_sys2_failed=1 同时设为 1。(推荐)
1 |
fw_setenv flag_try_sys1_failed 1 |
重启会进入 kernel0,红灯亮,提示你插入 U 盘并长按复位键直到黄灯闪烁,进入恢复模式。
删除系统 2(X-Wrt)
1 |
mtd erase kernel |
系统 2 重启会失败,flag_try_sys2_failed 自动变为 1。
自动重启会进入 kernel0,此时系统 1 也会启动失败,flag_try_sys1_failed 自动变为 1。
再次自动重启会进入 kernel0,红灯亮,提示你插入 U 盘并长按复位键直到黄灯闪烁,进入恢复模式。
从官方固件刷 Openwrt\Lede
文件说明
刷到分区
管理信息
刷回官方
从官方固件刷 PandoraBox
下载地址: https://mega.nz/folder/WY0FiTIS#Cl_Dzm4yhzrQZFazYG3i8Q/folder/eEd3VIQa
下载地址: http://downloads.openwrt.org.cn/PandoraBox/
刷 pb-boot
pb-boot 固定引导 kernel0 位置,且 R3 的 PandoraBox 只支持使用 pb-boot 引导。刷 PandoraBox 后,UBoot 和小米官方固件的 kernel 都将被覆盖,它们提供的恢复功能都没有了。
pb-boot 虽然可以刷入其他同类型固件(Openwrt 衍生版),但经测试 X-wrt、Openwrt/Lede 都只能运行到 kernel 阶段就会不断重启。
刷入 PandoraBox
- 重启路由器,按住复位键直到黄灯闪烁。
- 打开 192.168.1.1,你将看到 PandoraBox 固件升级页面,选择 Pandorabox 固件 (sysupgrade.bin) 并上传。
-
默认地址: 192.168.1.1
-
默认账号:root
-
默认密码:admin
刷回官方
正常情况下, OpenWrt 固件的引导分区是被锁定的(其 fork 版本 Pandorabox 也一样),所以不能直接用 mtd 命令把备份的Bootloader 刷回去。
先在 Web 后台页面刷入一个未锁定引导分区的固件(openwrt-ramips-mt7620-xiaomi_miwifi-r3-squashfs-pb-boot.bin 来源 ),然后登录管理页面(192.168.1.1,没有密码)配置密码并启用 SSH,然后把备份的官方 uboot.bin 和 kernel0.bin 刷回去
shell1
2
3
4
5
6
7
8mtd write uboot.bin Bootloader #校验不通过就重新刷,千完不要断电或重启
mtd write kernel0.bin kernel0_rsvd #校验不通过就重新刷,千完不要断电或重启
开启 TTL
fw_setenv boot_ wait on
fw_setenv uart_en 1
reboot接着将官方固件命名为
miwifi.bin
或miwifi.bin
放到 FAT/FAT32 格式的 U 盘根目录,开机后长按路由器复位键,直到黄灯闪烁,便会刷回官方。用备份的官方固件 all 分区,恢复到 Pandora 的 fullflash 分区。( 不推荐 ,危险,且有坏块 mtd 可能刷不进去)
-
方案三(推荐):
因为小米官方固件不是标准的 Openwrt 兼容固件,所以不能在 pb-boot 中直接刷入,但
pb-boot-xiaomi3-20190317-61b6d33.img
这个版本已经支持直接刷入。(虽然系统启动失败,但是可以进入小米的 kernel0 了,所以可以使用 kernel0 的恢复功能)所以,先在 pb-boot 中刷入小米的官方固件包(名字不包含 all 的,即不包含 Bootloader 的,否则不给刷),然后将官方固件命名为
miwifi.bin
或miwifi.bin
放到 FAT/FAT32 格式的 U 盘根目录,开机 几秒后 (等 kernel0 先运行,不然会先进入 pb-boot 的恢复页面)长按路由器复位键,直到黄灯闪烁便会刷回官方。救砖(半砖)
只有你刷的是 Padavan、X-Wrt、Openwrt/Lede,才可以使用小米官方自带的恢复功能,因为他们都保留了官方的 Uboot 以及 kernel0。
如果你刷的 PandoraBox,那这两种方式都不适用,因为 Uboot 已经被 pb-boot 取代,以及 kernel0 和 kernel1 都被覆盖了,但 pb-boot 提供 Web 恢复功能,所以也没那么容易变全砖。
kernel 恢复功能
官方 UBoot 期望在地址 0x200000 或 0x600000 找到可引导的 kernel,他们分别对应两个系统的内核,其中一个损坏了可以引导另一个。
UBoot 通过
flag_last_success
、flag_try_sys1_failed
、flag_try_sys2_failed
这三个环境变量来决定引导哪个系统( 来源 ):
flag_try_sys1_failed、flag_try_sys1_failed 同时为 1,说明两个系统都启动失败,将会校验系统 1 的内核 CRC32
flag_try_sys1_failed、flag_try_sys1_failed 不同时为 1,则由 flag_last_success 的值决定引导哪个系统
注:如果被引导的系统启动不成功,则 UBoot 会设置系统的失败标志,除非启动成功否则不会清除失败标志,这样 flag_try_sys1_failed 和 flag_try_sys2_failed 就会同时为 1。
所以从 Padavan、X-Wrt、Openwrt/Lede 刷回官方总结就是:一,得使 Uboot 引导 kernel0;二,得使 kernel0 进入恢复模式。
TTL 恢复功能
UBoot 提供了通过 TTL 恢复的功能,你需要购买一个 TTL 转 USB 的设备和一根杜邦线。
TTL 线的接法:TTL RX 接路由器 TX、TTL TX 接路由器 RX、TTL GND 接路由器 GND、VCC 不用接,波特率 115200 bps。
刷机前如果你已经开启了 TLL 功能,启动时 U-Boot 会提示选择操作:
1 |
Please choose the operation: |
(不知道什么原因 uboot 阶段会出现乱码但不影响使用,应该不是接触不良,因为从引导 kernel 后就不会出现乱码了)
选项 1 是把一个系统加载到 RAM 中执行,你可以用来执行小米官方的内核,然后使用内核提供的功能刷回官方,步骤如下:
将 kernel0.bin 放到 TFTP 服务器,并启动 TFTP 服务器
将小米官方固件重命名为
miwifi.bin
或
miwifi_ssh.bin
放在 FAT/FAT32 格式的 U 盘,然后插到路由器
启动路由器并选择选项 1
会提示设置路由器 IP 和设置 TFTP 服务器 IP,以及要运行的文件名
1 |
Please Input new ones /or Ctrl-C to discard |
设置好后回车,会自动把文件从 TFTP 服务器传输到路由器
传输完后会自动运行,此时你需要按住复位键直到黄灯闪烁,它将刷回官方固件
选项 2,是把 kernel 刷到 Flash 中,配置过程和选项 1 类似。
UBoot 会先把下载来的数据写到闪存的 0x200000 位置 (也就是 kernel0),再把数据写到 0x600000 位置 (kernel1),这样 kernel0 和 kernel1 数据是相同的。
选项 3,是默认选项,系统正常启动
选项 4,是命令行接口,提供一些操作,比如设置 Uboot 环境变量等
选项 9,是把 BootLoader 刷到 Flash 中(谨慎操作),配置过程和选项 1 类似。
救砖(全砖)
买 Nand 编程器
土豪随意,购买 Nand 编程器后,你可以随便折腾,全砖了再刷回来即可。
硬改 MINI
MT7620A 使用 SPI_MOSI、SPI_CLK、TXD2、GPIO0 这四个引脚的值来决定启动模式
从 datasheet 可以看到主要有好几个正常模式,我们主要关心这两个:
正常模式 1(从 ROM+NAND 闪存引导,4 cycle address/2 KB page size )
观察小米路由器 MINI 和小米路由器 3 这四个引脚的连接方式,如下:
SPI_MOSI SPI_CLK GPIO0MINI 的四个启动引脚的电路如下(NI 指 Not Install,即不安装的意思):
MINI 的四个脚位的值:SPI_MOSI (R135) - 0 (接地)、SPI_CLK (R127) - 0 (接地)、TXD2 (R137) - 1 (通过4.7kΩ 电阻拉高)、GPIO0 (R126) - 0 (接地),对应的二进制的 0010,也就是正常模式 2。
所以 R3 改 MINI 需要:将 R139 拆下接到 R137,这样就把 TXD2 设置为 1,再将 R124 拆下接到 R126,这将 GPIO0 设置为 0。
R139 和 R137 在电路板正面,R124 和 R126 在电路板反面:
然后把 MINI 的引导程序(这里用的是 breed)用编程器先刷到 NOR Flash 上,然后再焊接到主板上(主板上的白点对应 Flash 的凹点),最后在 breed 里面再刷入固件即可。
买 NOR Flash 时需要注意,最好买和 MINI 一样的容量(16M,型号 Winbond W25Q128FVSIG),这样可以直接刷入 MINI 的固件,否则需要自己编译内核(修改
target/linux/ramips/dts/MIWIFI-MINI.dts
的值)。其次要买一个你的编程器能识别的型号。
改成 MINI 后,WAN 和 LAN 接口会互换,但不影响使用,其次是 WIFI 信号可能会较差,需要在 breed 中刷入备份的 R3 的 EEPORM(原固件 Factory 分区)。
根据 R3G/R3P 的改法,还可以双刀开关接 J90 & J91 改双启动,不知道 R3 行不行。
也可以尝试把 R3 备份的 Bootloader(UBoot)当作 MINI 的固件刷入,看是否能引导 NAND Flash 中的系统把其救回来。
总结
主要参考地址
- Openwrt 小米路由器 3: https://openwrt.org/toh/xiaomi/mir3
- Openwrt 小米路由器 3 讨论: https://forum.openwrt.org/t/xiaomi-mi-wifi-3-support/2252/1
- Openwrt 开源项目: https://github.com/openwrt/openwrt/commit/f2107fc328ff7f9817fe9ca64f84bba9e32abfc6
- 俄罗斯论坛: https://4pda.to/forum/index.php?showtopic=736801&st=1220#entry50915904
- 恩山论坛用户(醉老仙): https://www.right.com.cn/forum/home.php?mod=space&uid=409954&do=index
- 恩山论坛用户(fyi2000): https://www.right.com.cn/forum/space-uid-448988.html
- 恩山论坛用户(ysc3839): https://www.right.com.cn/forum/thread-308330-1-1.html
- 恩山论坛用户(ptpt52): https://www.right.com.cn/forum/thread-261964-1-1.html
-
在不同系统中修改 UBoot 环境变量的命令(只针对 R3)
-
在 UBoot 命令行接口界面
printenv
、setenv
、saveenv
-
在小米官方固件
nvram show
、nvram set
、nvram commit
-
在 Padavan
-
在 Opentrt/Lede 及其衍生版(包括 X-Wrt、PandoraBox 等)
fw_printenv
、fw_setenv
、(没有保存命令,会自动保存) -
不同系统中是否锁定 Bootloader 分区(只针对 R3)
-
小米官方固件
-
Pavadan
-
在 Opentrt/Lede 及其衍生版(包括 X-Wrt、PandoraBox 等)
-
COM、串口、TTL、UART 的关系、CMOS电平
-
TTL:Transistor Transistor Logic,晶体管-晶体管逻辑电平。+5V 等价于逻辑“1”,0V 等价于逻辑“0”
-
TTL:Time To Live,生存时间值。在 IPV4 包头叫跳数,用来避免 IP 包在网络中的无限循环和收发,每经过一次路由跳数减 1,当减到 0 时,把包丢弃。在域名系统中 TTL 是指 DNS 记录在 DNS 服务器上缓存时间。
-
UART:Universal Asynchronous Receiver/Transmitter,通用异步收发传输器。一种通用串行数据总线协议,用于异步通信
- 起始位:先发出一个逻辑”0”的信号,表示传输字符的开始。
-
资料位:紧接着起始位之后。资料位的个数可以是4、5、6、7、8等,构成一个字符。通常采用ASCII码。从最低位开始传送,靠时钟定位。
奇偶校验位:资料位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验资料传送的正确性。 - 停止位:它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。 由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。
- 空闲位:处于逻辑“1”状态,表示当前线路上没有资料传送。
- 波特率:是衡量资料传送速率的指标。表示每秒钟传送的符号数(symbol)。一个符号代表的信息量(比特数)与符号的阶数有关。例如传输使用256阶符号,每8bit代表一个符号,资料传送速率为120字符/秒,则波特率就是120baud,比特率是120*8=960bit/s。这两者的概念很容易搞错。
-
EEPROM 分区和 ART 分区、Factory 分区的区别
这三个东西在路由器界就是指同一个东西,注意 EEPROM 不是指硬件,太他妈混乱了
Atheros Radio Test 无线电测试
eeprom 是储存器件名称
eeprom一般封装是sop8脚储存器
同类的有
harddisk一般是磁盘封装的储存器,即是硬盘
Flash代表闪存 封装有tsop和bag等等。
另外储存器件还有很多,
如emmc,emcp,等等应用在手机数码上的。
而eeprom一般用在小型电子产品
同时sop8封装的储存器还有spi,norflash等等,不是全是eeprom。
但目前大部分玩家都把eeprom当作分区名,不过大家都不是专业的,喜欢把eeprom当成什么都可以,只要大家都理解就行。以前EEPROM 本来是 电可擦只读存储器
现在类似功能的存储器件都可以这么说
比如nor内存.
大家把出厂每一个器件都有可能不一样的固件分区成为EEPROM是受了计算机概念的影响
因为标准计算机有BIOS的 有内存 有硬盘
固件类器件没有硬盘
所以出厂时 EEPROM里面有BIOS 的部分有硬盘的部分
BIOS的部分是不能随便丢失的就被引申为EEPROM了
硬盘部分就是所谓的固件
说的比较乱.. -
CFE 和 BootLoader 的区别
这两货也是同一个东西
-
NVRAM 是有专门的硬件吗,还是 Flash 划分出来的
Non-Volatile Ram即非易失性存储空间。简单来说就是一段掉电也不丢失数据的存储空间。这类存储介质有很多,像多数的eeprom,Rom都是可以作为该类空间的介质,(严格来说 Flash 不上,因为它不是随机访问的)。而具体到BIOS的话,多数情况下可以理解为在BIOS-Rom中挖了一段空间,用来作为我们希望掉电也不丢失数据的存储空间
-
NVRAM、Flash 、EEPROM 的区别
三种存贮东东都是非易失性的,至于其中存贮什么东东要看硬件的设计和系统的安排了。
在路由器中一般:
EEPROM 用来保存路由器硬件调教参数
NVRAM 用来保存路由器配置参数
Flash 用来保存系统
从硬件来说他们一般不是同一个类东西,但在软件实现上就不一样了,比如把 Flash 划分一段空间来当 NVRAM 或 EEPROM 用。
-
什么叫不死 Boot
一般是指提供了 Web 恢复界面的 Boot,它们可以在该界面内刷入任意固件,即使开不了机也能重新刷
-
什么是锁 Bootloader 分区
小米官方固件和 Padavan 没有锁引导分区,(padavan 下解锁引导分区:mtd_write unlock Bootloader)
默认 Openwrt 极其衍生版(比如 X-Wrt、PandoraBox)都锁了一些重要分区,比如引导分区,不能在系统内刷入 Bootloader
注意:这里是“锁 Bootloader 分区”术语,不是类似手机中常说的“Bootloader 锁”。手机中说的 BL 锁是指 Bootloader 会对它所引导的系统镜像做一个签名校验,如果不通过就不引导。这里说的“锁 Bootloader 分区”,是指内核把 Bootloader 分区给锁定了,不给刷入新的 Bootloader。Openwrt 中可以安装
kmod-mtd-rw_内核版本号
然后使用insmod mtd-rw.ko i_want_a_brick=1
命令加载来解锁 Bootloader 分区(这里有个疑惑mtd unlock xxx
命令可以解锁吗:由于某些原因 mtd 的 unlock 功能在内核被取消了(谷歌搜索 m25p80.c 解锁/取消保护))还有一种就算硬件级别的锁定,TODO
-
不刷 Padavan 的 boot,只刷 kernel 和 rootfs 会改变分区布局吗?
会,分区是在 kernel 里面分的
-
不刷 Padavan 的 boot,只刷 kernel 和 rootfs,Padavan 的 mtd 命令会变成 mtd_writte 吗?
会 MTD 命令是在内核实现的,只不过 Padavan 搞特殊,用到命令是 mtd_writte
-
分区布局是储存在哪的
一般是内核中实现,也有少部分在 Bootloader
-
什么叫过渡固件
initramfs-kernel.bin(带有坏块回收机制,有坏块也能刷入固件)
-
factory.bin 具体包含的信息
注意和 factory 分区不是一个东西,太他妈混乱了
-
坏块处理是在哪里处理的,flsah驱动?bootloader?内核?
-
有坏块还能使用 MTD 命令吗
有坏块使用 dd 命令备份将不能完成备份, MTD 导入
-
坏块为什么影响刷机
一般认为小米原固件有坏块回收机制,第三方没有,所以,小米用原固件一般不会有什么大问题,刷第三方就有可能莫名其妙的问题,如丢5G,或2.4G等等
没看懂什么叫处理不了坏块,坏块不是OP处理的,OP是操作系统,而坏块是nand驱动在bootloader层面处理的,驱动把坏块报告给OP,OP读写时避开坏块,理论上是这样。但是如果坏块在某个分区很靠前的位置,貌似OP无法避开,因为理论上分区靠前部分必须是可读写的。参见 op 官网对nand的解释
除了上古遗迹,比如老毛子、华硕的博通系列,所有固件都可以处理坏块,,即使博通官方已经推荐 ubifs 了华硕还是用 jffs2 坚持不处理坏块,这两个就是上古遗迹的代表,也就是说现在所有使用nand的芯片官方都已经切换到ubifs来自动处理坏块了
而老毛子的RootFS格式为SquashFS,应该是不支持坏块处理,hiboy和hanwckf版固件都比较小,具体还是要看分区布局才知道是否有影响,如果会云端编译固件,那就只要避开坏块即可
-
什么是 overlay 分区,以及扩容该分区
https://blog.csdn.net/misisippi68/article/details/105431455
OpenWRT 一般使用的文件系统是 SquashFS ,建议下载固件的时候也下载这种固件。
这个文件系统的特点就是:只读、压缩。
一个只读的文件系统,是怎么做到保存设置和安装软件的呢?用/overlay分区。固件中已经写入了有个/overlay分区,但它的指向可以更改。虽然原来的文件不能修改,但我们把修改的部分放在 overlay 分区上,然后映射到原来的位置,读取的时候就可以读到我们修改过的文件了。当系统故障,reset的时候,把固件中配置文件拷贝到overlay层,就恢复到最初设置了。
由于/overlay本身的指向配置也在overlay层,所以可以新建一个更大的分区,然后把overlay指向这个新分区,就相当于把overlay扩容了。这个可能有点绕。附录
附:各种固件的分区布局
-
Padavan
shell1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22cat /proc/mtd
dev: size erasesize name
mtd0: 00040000 00020000 "Bootloader"
mtd1: 00080000 00020000 "BootEnv"
mtd2: 00540000 00020000 "Factory"
mtd3: 00160000 00020000 "Kernel"
mtd4: 00ea0000 00020000 "RootFS"
mtd5: 00080000 00020000 "Config"
mtd6: 00080000 00020000 "Storage"
mtd7: 06900000 00020000 "RWFS"
mtd8: 01000000 00020000 "Firmware_Stub"
dmesg
0x000000000000-0x000000040000 : "Bootloader"
0x000000040000-0x0000000c0000 : "BootEnv"
0x0000000c0000-0x000000600000 : "Factory"
0x000000600000-0x000000760000 : "Kernel"
0x000000760000-0x000001600000 : "RootFS"
0x000001600000-0x000001680000 : "Config"
0x000001680000-0x000001700000 : "Storage"
0x000001700000-0x000008000000 : "RWFS"
0x000000600000-0x000001600000 : "Firmware_Stub" -
X-Wrt
shell1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24cat /proc/mtd
dev: size erasesize name
mtd0: 00040000 00020000 "Bootloader"
mtd1: 00040000 00020000 "Config"
mtd2: 00040000 00020000 "Bdata"
mtd3: 00040000 00020000 "factory"
mtd4: 00040000 00020000 "crash"
mtd5: 00040000 00020000 "crash_syslog"
mtd6: 00080000 00020000 "reserved0"
mtd7: 00400000 00020000 "kernel_stock"
mtd8: 00400000 00020000 "kernel"
mtd9: 07600000 00020000 "ubi"
dmesg
0x000000000000-0x000000040000 : "Bootloader"
0x000000040000-0x000000080000 : "Config"
0x000000080000-0x0000000c0000 : "Bdata"
0x0000000c0000-0x000000100000 : "factory"
0x000000100000-0x000000140000 : "crash"
0x000000140000-0x000000180000 : "crash_syslog"
0x000000180000-0x000000200000 : "reserved0"
0x000000200000-0x000000600000 : "kernel_stock"
0x000000600000-0x000000a00000 : "kernel"
0x000000a00000-0x000008000000 : "ubi" -
Openwrt/LEDE
shell1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24cat /proc/mtd
dev: size erasesize name
mtd0: 00040000 00020000 "Bootloader"
mtd1: 00040000 00020000 "Config"
mtd2: 00040000 00020000 "Bdata"
mtd3: 00040000 00020000 "Factory"
mtd4: 00040000 00020000 "crash"
mtd5: 00040000 00020000 "crash_syslog"
mtd6: 00080000 00020000 "reserved0"
mtd7: 00400000 00020000 "kernel0_rsvd"
mtd8: 00400000 00020000 "kernel"
mtd9: 07600000 00020000 "ubi"
dmesg
0x000000000000-0x000000040000 : "Bootloader"
0x000000040000-0x000000080000 : "Config"
0x000000080000-0x0000000c0000 : "Bdata"
0x0000000c0000-0x000000100000 : "factory"
0x000000100000-0x000000140000 : "crash"
0x000000140000-0x000000180000 : "crash_syslog"
0x000000180000-0x000000200000 : "reserved0"
0x000000200000-0x000000600000 : "kernel0_rsvd"
0x000000600000-0x000000a00000 : "kernel"
0x000000a00000-0x000008000000 : "ubi" -
PandoraBox
shell1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30cat /proc/mtd
dev: size erasesize name
mtd0: 00040000 00020000 "u-boot"
mtd1: 00040000 00020000 "u-boot-env"
mtd2: 00040000 00020000 "Bdata"
mtd3: 00040000 00020000 "Factory"
mtd4: 00040000 00020000 "crash"
mtd5: 00040000 00020000 "crash_syslog"
mtd6: 00080000 00020000 "reserved0"
mtd7: 07d00000 00020000 "firmware"
mtd8: 00200000 00020000 "kernel"
mtd9: 07ac0000 00020000 "ubi"
mtd10: 00040000 00020000 "panic_oops"
mtd11: 00100000 00020000 "factory_bbt"
mtd12: 08000000 00020000 "fullflash"
dmesg
0x000000000000-0x000000040000 : "u-boot"
0x000000040000-0x000000080000 : "u-boot-env"
0x000000080000-0x0000000c0000 : "Bdata"
0x0000000c0000-0x000000100000 : "Factory"
0x000000100000-0x000000140000 : "crash"
0x000000140000-0x000000180000 : "crash_syslog"
0x000000180000-0x000000200000 : "reserved0"
0x000000200000-0x000007f00000 : "firmware"
0x000000200000-0x000000400000 : "kernel"
0x000000400000-0x000007ec0000 : "ubi"
0x000007ec0000-0x000007f00000 : "panic_oops"
0x000007f00000-0x000008000000 : "factory_bbt"
0x000000000000-0x000008000000 : "fullflash"附:mtd 命令
附:nvram 命令
附:UBoot 命令行接口
该接口所带的命令并不是唯一的,而是根据编译时所配置的,小米 Uboot 支持的命令如下:
Code1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27MT7620 # help
? - alias for 'help'
help - print online help
version - print mo▒▒▒▒▒version
bootm boot application image from memory
intena - intenኍ▒▒▒ena - intena
go - start application at address
md - memory display
nm - memory modify (constant addre▒
mm - memory modify (auto-incrementing)
mdio - Ralink PHY register R/W command ▒▒▒▒
rf -▒▒▒▒▒write rf register
nand -▒▒▒▒▒ command
readcnt -▒▒▒▒▒▒nt
reset - Perform RESET of the CPU(重启)
printenv- print environment variables
setenv - set environment▒▒▒▒▒ables
saveenv - save environment var▒▒▒▒▒s to persistent storage
tftpboot- boot image via network using TFTР▒▒▒▒ocol
trap_init - trap_init附:UBoot 环境变量值(包括 nvram 值)
shell1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29cat /proc/mtd
dev: size erasesize name
mtd0: 08000000 00020000 "ALL"
mtd1: 00040000 00020000 "Bootloader"(引导分区)
mtd2: 00040000 00020000 "Config" (环境变量分区以及配置分区)
mtd3: 00040000 00020000 "Bdata" (备份分区)
mtd4: 00040000 00020000 "Factory" (EEPROM,ART(无线校验数据)分区)
mtd5: 00040000 00020000 "crash"
mtd6: 00040000 00020000 "crash_syslog"
mtd7: 00080000 00020000 "reserved0"
mtd8: 00400000 00020000 "kernel0" (系统 1 内核)
mtd9: 00400000 00020000 "kernel1" (系统 2 内核)
mtd10: 02000000 00020000 "rootfs0" (系统 1 根文件系统)
mtd11: 02000000 00020000 "rootfs1" (系统 2 根文件系统)
mtd12: 03600000 00020000 "overlay"
dmesg
0x000000000000-0x000000040000 : "Bootloader"
0x000000040000-0x000000080000 : "Config"
0x000000080000-0x0000000c0000 : "Bdata"
0x0000000c0000-0x000000100000 : "Factory"
0x000000100000-0x000000140000 : "crash"
0x000000140000-0x000000180000 : "crash_syslog"
0x000000180000-0x000000200000 : "reserved0"
0x000000200000-0x000000600000 : "kernel0"
0x000000600000-0x000000a00000 : "kernel1"
0x000000a00000-0x000002a00000 : "rootfs0"
0x000002a00000-0x000004a00000 : "rootfs1"
0x000004a00000-0x000008000000 : "overlay" -