跳到主要内容

小米路由器 Pro 安装 OpenWrt

准备工作

  • 下载 开发版固件

    选择 ROM 后,在下面找到自己路由器对应型号的开发版本固件并下载

  • 下载 ssh 固件

    需要初始化路由器, 并用小米 WIFI (自行搜索下载) APP绑定路由器后才能下载

  • 下载 OpenWrt 固件小米路由器 Pro

    ctrl+f 搜索 "XiaoMi", 找到你的路由器版本后点击最后一列的 ViewEdit data 来查看该硬件设备的文档
    这里面有包含该硬件型号可用的 OpenWrt 固件文件下载地址:
    Firmware OpenWrt Install URL: 第一次安装时使用
    Firmware OpenWrt Upgrade URL: 固件升级时使用

  • 牙签一枚

  • 磁盘格式为 FAT32 的U盘一个

    mac 可使用系统自带的 磁盘工具 软件格式化; windows 可以通过 Diskgenius 等软件格式化

  • USB-C/A 转网线口拓展坞 (可选)

    如果你的电脑自带网线口那就不用了, 在安装完 OpenWrt 固件时连接路由器使用

  • USB 转 TTL ch340g 连接线 (可选)

    刷成砖头的时候重装系统用

安装开发版固件并开启 ssh 功能

安装开发版固件和 ssh 固件需要执行两遍 1~3 步骤,
开发版固件文件名为 miwifi.bin
ssh 固件文件名为 miwifi_ssh.bin

1.将下载的固件 bin 文件放在U盘根目录

2.将路由器电源拔掉后再插入U盘, U盘插入后用牙签戳进路由器的 reset 小孔, 里面是一个按钮, 在按住不松开 reset 键的同时接入路由器电源, 等待路由器前面的指示灯变成黄色闪烁状态就可以松开了

3.等待几分钟后指示灯变蓝, 就代表刷机成功了。

警告

如果你在路由器连接着电源的时候把U盘插上路由器了, 路由器会把你的U盘设置为外接存储设备, 这会导致你按照前面的步骤操作不会成功, 这个时候把U盘使用 FAT32 重新格式化, 再从步骤 1 开始重来一遍即可。

4.验证

从官方 ssh 固件 下载页面可以获得 ssh 账号密码

登录成功后显示欢迎提示

BusyBox v1.19.4 (2023-02-23 08:50:23 UTC) built-in shell (ash)
Enter 'help' for a list of built-in commands.

-----------------------------------------------------
Welcome to XiaoQiang!
-----------------------------------------------------
$$$$$$\ $$$$$$$\ $$$$$$$$\ $$\ $$\ $$$$$$\ $$\ $$\
$$ __$$\ $$ __$$\ $$ _____| $$ | $$ | $$ __$$\ $$ | $$ |
$$ / $$ |$$ | $$ |$$ | $$ | $$ | $$ / $$ |$$ |$$ /
$$$$$$$$ |$$$$$$$ |$$$$$\ $$ | $$ | $$ | $$ |$$$$$ /
$$ __$$ |$$ __$$< $$ __| $$ | $$ | $$ | $$ |$$ $$<
$$ | $$ |$$ | $$ |$$ | $$ | $$ | $$ | $$ |$$ |\$$\
$$ | $$ |$$ | $$ |$$$$$$$$\ $$$$$$$$$ | $$$$$$ |$$ | \$$\
\__| \__|\__| \__|\________| \_________/ \______/ \__| \__|


root@XiaoQiang:~#

安装 OpenWrt

1.拷贝固件到路由器

先将上面下载到的 OpenWrt 固件修改一个简短的名字方便使用如: factory.bin

  • 使用 scp
scp ./factory.bin [email protected]:/tmp/
ssh [email protected]
cd /tmp
  • 拷贝固件到U盘然后接入路由器
ssh [email protected]
cd /extdisks/sda1 # 这个路径可以有变化,检查 ls /extdisks
  • 在电脑安装 npm 包 serve 并启动一个 http 静态服务器
ssh [email protected]
cd /tmp
wget http://192.168.31.100:5000/factory.bin

2.按照以下命令顺序执行刷入固件:

# 设置环境变量
nvram set flag_try_sys1_failed=1
nvram set flag_try_sys2_failed=0
nvram set flag_boot_success=0
nvram commit # 将环境变量储存到闪存芯片
dd if=factory.bin bs=1M count=4 | mtd write - kernel1 # 读取文件 factory.bin 并写入 kernel1 磁盘分区
mtd erase rootfs0 # 抹掉磁盘分区 rootfs0 上的所有数据
mtd erase rootfs1 # 抹掉磁盘分区 rootfs1 上的所有数据
mtd erase overlay # 抹掉磁盘分区 overlay 上的所有数据
dd if=factory.bin bs=1M skip=4 | mtd write - rootfs0 # 读取文件 factory.bin 并写入 rootfs0 磁盘分区
reboot

路由器进入重启状态,等待几分钟,观察前面的指示灯由黄色闪烁变为蓝色则代表安装成功,

命令解释: dd mtd

查看系统分区表 cat /proc/mtd

3.安装 Web UI 软件包

如果你刷入的固件不带有 WEB UI 界面, 需要先登录进 SSH 安装 UI 界面。

ssh [email protected] # 第一次安装默认没有密码
opkg update # 刷新软件源
opkg install luci # 安装 WEB UI 软件包

安装成功后, 就可以从浏览器直接访问 http://192.168.1.1 进入 WEB UI 的管理界面

4.配置 OpenWrt

提示

官方固件安装完成后 wifi 默认是关闭状态, 所以需要使用网线连接到路由器 Lan 口才能进一步配置.

OpenWrt 的默认网关地址一般为: 192.168.1.1, 这个可能跟光猫有冲突,第一步先将路由器 ip 修改掉

1.点击菜单 Network -> Interfaces, 点击 lan 接口的编辑按钮 2.将 IPv4 address 192.168.1.1 修改如: 192.168.31.1 3.IPv4 gateway 设置为 192.168.1.1 4.保存&应用, 点击后要从新 ip http://192.168.31.1 打开 web 管理界面应用配置, 不然90秒后会自动回滚配置的!

刷回官方固件

1.通过 ssh openwrt 系统, 输入以下命令:

# 设置环境变量
fw_setenv flag_try_sys1_failed 0
fw_setenv flag_try_sys2_failed 1
fw_setenv flag_boot_success 0

如果执行命令出错, 先安装 OpenWRT 官网的 R3P 升级包, 然后再次执行上面的命令。

2.断开路由器电源,参考 安装开发版固件并开启 ssh 功能 刷入官方固件

变砖急救

如果你的路由器能正常启动且前面板小灯显示黄色, 且搜不到 WIFI, 用网线连接 LAN 口也是获取不到 ip, 就和砖头一样。 那你可以执行下面的操作重新安装系统救回来

UBOOT 引导

通过 TTL 工具连接到电脑

提前准备以下工具:

  • 购买 USB 转 TTL ch340g 连接线 (连接到路由器 pcb 那一端需要 公头)
  • 下载并安装 PuTTY 软件

1.拆开路由器右侧的盖子, 不需要拧螺丝拆机

侧边的外壳通过卡扣与铝合金机身连接, 所以可以使用金属翘片或两把一字螺丝刀塞入缝隙撬开塑料壳

2.将 TTL 排线连接到 PCB 上的焊盘 (上面有白色字体标记着 3V3、RX、GND、TX)

提示

TTL 接入电脑 USB 后可以将路由器放远一点, 拉紧排线来保持与 PCB 焊盘接触, 或者用电烙铁焊一下

PCB 接口与 TTL 连接顺序如下:

TX <-> RXD
GND <-> GND
RX <-> TXD
3V3 <-> 3V3

3.打开 putty 软件, 按以下配置设置

Connection type: `Serial`
Speed: 115200
Serial line: 路由器串口

关于路由器串口, windows 用户可以打开 设备管理器->端口 查看, mac 用户执行命令 ls /dev/tty.*

4.将路由器接入电源

5.在 putty 软件界面点击 open

6.等待引导启动直到打印出如下提示:

Please choose the operation:
1: Load system code to SDRAM Via TETP.
2: Load system code then write to Flash via TETP.
3: Boot system code via Flash (default)
4: Entr boot command line interface.
7: Ioad Boot Ioader code then write to Flash via serial.
9: Load Boot Loader code then write to Flash Via TFTP.

接着可以选择以下两种方法 (U盘、FTP) 来刷入新固件

U 盘 (刷官方固件)

1.将准备好固件的 U盘插入路由器, 参考 安装开发版固件并开启 ssh 功能

2.键盘按下数字4 (选择 Entr boot command line interface.), 等待引导加载完成后输入下面命令:

# 设置 uboot 环境变量
setenv flag_try_sys1_failed 0
setenv flag_try_sys2_failed 1
setenv uart_en 1
saveenv # 将环境变量保存到闪存芯片
reset # 重启

3.拿牙签捅住路由器的 reset 按钮, 然后等待路由器自动重启刷入固件, 闪黄灯的时候放开, 等一会变绿灯常亮时就可以搜索到 xiaomi_router 的初始 wifi 了

TFTP (刷官方或第三方固件)

1.用网线将路由器 lan 口与电脑连接, ip 设置为手动获取, 如: 192.168.1.100

2.打开 TFTP 软件启动 ftp 服务, 按如下配置:

Current Directory: 固件目录
Server interfaces: 上面设置的 ip

固件目录不要包含中文

3.在 putty 窗口键盘按下数字1或2, 输入 ftp 配置:

1: system Load Linux to SDRAM via TFTP.
Please Input new ones /or ctrl-c to discard
Input device IP (192.168.1.1)=-:192.168.1.1
Input server IP (192.168.1.100)==:192.168.1.100
Input Linux Kernel filename (ram.bin) ==:ram.bin
提示

这里设置的 ip 和文件名要跟步骤2设置的保持一致

4.回车等待固件刷入完成, 在路由器变绿灯常亮时就可以搜索到 xiaomi_router 的初始 wifi 了

参考
小米路由器3 保姆级救砖回忆录及实操技巧演示
[UBOOT-TTL]小米路由器救砖或刷机指南(R3P为例)

第三方引导, 如 breed、pd-boot

通过直接刷闪存芯片的方式更换引导, 参考 使用编程器救砖小米路由器4A千兆版的过程

虽然不是小米路由器pro的版本, 但原理是相似的,不过刷引导的方式过于麻烦,不建议更换官方 UBOOT

FAQ

opkg update 失败

Package luci (git-23.051.66410-a505bb1) installed in root is up to date.
Collected errors:
* pkg_hash_check_unresolved: cannot find dependency kernel (= 5.15.113-1-71a134291563a3ffe2d4deaf24707c96) for kmod-nf-reject
* pkg_hash_check_unresolved: cannot find dependency kernel (= 5.15.113-1-71a134291563a3ffe2d4deaf24707c96) for kmod-nf-reject6

原因: 安装了 OpenWrt 的快照版本, 重新安装 OpenWrt 稳定版本即可

引用文献 Cannot satisfy dependencies / kernel is not compatible

setenv、fw_setenv、nvram 的区别

这三个命令功能类似, 都用于设置固件引导加载时使用的环境变量, 这些变量储存在非易失性 RAM 中如 EEPROM, 区别只是他们运行的环境不一样

参考 Das U-Boot Environment

环境变量可能会包含以下设置:

内核启动地址
从 usb 启动
TFTP 协议启动
mac 地址
分区表
恢复模式
串口波特率
TFTP 客户端
...

setenv name=value:
uboot 固件引导过程中提供的命令, 在通过 ttl 串口连接的 putty 终端中使用, setenv 不会永久保存环境,直到你执行 saveenv 为止。

相关命令:

env print (alias printenv) 打印环境变量
env save (alias saveenv) 保存环境变量到闪存

参考 Use U-Boot Environment Variables

fw_setenv name=value:
openwrt 系统运行中提供的命令, fw_setenv 会更改当前环境并同时保存, 操作 U-Boot 环境的相关工具包含在 opkg-package uboot-envtools 中。

相关命令

fw_printenv 打印环境变量

参考 U-boot environment variables in linux

nvram
openwrt 系统运行中提供的命令, 在 OpenWrt 的早期版本中提供了两个不同的配置系统:

  • 通过 nvram 命令进行 openwrt 的设置
  • 以及用于普通 Linux 操作系统和应用程序设置的标准 /etc 系统, 大多数 OpenWrt 的配置储存在 /etc/config 目录下

相关命令

nvram set name=value 设置环境变量
nvram unset name 取消设置环境变量
nvram get name 打印单个环境变量
nvram show 打印环境变量
nvram commit 保存环境变量到闪存

参考 OpenWrt configuration Building a Transparent Firewall with Linux, Part III