小米路由 R3P 刷 OpenWRT

背景

从闲鱼上淘了个二手小米路由,想直接在路由器那里翻墙

刷开发版 ROM

  1. 官网 下载好对应版本的开发版 ROM
  2. 路由后台管理端 -> 常用设置 -> 系统状态 -> 手动升级 -> 选择上一步下载好的 ROM
  3. (需要登录小米账号)去 官网 下载 ssh 工具包 & 查看 ssh 登录密码
  4. (需要提前准备一个 FAT/FAT32 格式的 U 盘)按说明操作后,即可通过终端 ssh 登录路由器后台

刷 Breed web 控制台

刷 OpenWRT

刷固件

  1. 官网 下载对应的固件,带 factory 后缀是第一次刷机用的,sysupgrade 后缀是升级用的

  2. 将这个固件拷贝到路由器的 /tmp 目录下,然后 ssh 登录路由器执行:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    cd /tmp/
    nvram set flag_try_sys1_failed=1
    nvram set flag_try_sys2_failed=0
    nvram set flag_boot_success=0
    nvram commit
    mv openwrt-19.07.2-ramips-mt7621-xiaomi_mir3p-squashfs-factory.bin factory.bin
    dd if=factory.bin bs=1M count=4 mtd write - kernel1
    mtd erase rootfs0
    mtd erase rootfs1
    mtd erase overlay
    dd if=factory.bin bs=1M skip=4 mtd write - rootfs0
    reboot
    # 等待路由重启后,再 ssh 到路由器执行:
    opkg update
    opkg install luci zsh curl wget python3 wget git luci-base luci-compat coreutils-nohup bash iptables dnsmasq-full jsonfilter ca-certificates ipset ip-full iptables-mod-tproxy iptables-mod-extra libcap libcap-bin ruby ruby-yaml

安装 clash

  1. 官网 下载最新版的 ipk 文件

  2. 将 luci-app-openclash_0.43.01-beta_all.ipk 拷贝到 /tmp 目录下,然后 ssh 登录路由器执行:

    1
    2
    3
    4
    5
    6
    # 先安装一堆依赖,其中有些组件可能上一步已经装过了
    opkg install coreutils-nohup bash iptables curl jsonfilter ca-certificates ipset ip-full iptables-mod-tproxy iptables-mod-extra libcap libcap-bin ruby ruby-yaml
    opkg install dnsmasq-full
    # 手动安装 clash
    opkg install /tmp/luci-app-openclash_0.43.01-beta_all.ipk
    # 安装完毕后,重新登录管理端即可在 Services 一栏看到 OpenClash 了

安装 ZeroTier

1
2
3
4
5
6
7
8
opkg install zerotier
vi /etc/config/zerotier
# 改两处:
# option enabled 0 改为 option enabled 1
# list join ‘你的网络id’,其他的可以默认保持不变

# 最后重启即正常
/etc/init.d/zerotier start

挂载硬盘

1
2
3
4
opkg update
opkg install kmod-usb-core kmod-usb-ohci kmod-usb-uhci kmod-usb2 kmod-ledtrig-usbdev usbutils kmod-usb-ohci kmod-usb-storage kmod-fs-ext4 block-mount block-extroot
# 界面操作挂载点等信息
mount -t ext4 /dev/sda1 /download

aria2

1
2
3
opkg update
opkg install aria2 luci-app-aria2 webui-aria2 ariang
# 然后 relogin 一下,services -> aria2 下面就会出现两个 UI 界面的按钮

samba

1
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
30
31
32
33
34
opkg update
package=`opkg list grep samba36-server awk '{print $1}'`
opkg install $package
sed -i '/invalid users/s/invalid/#invalid/g' /etc/samba/smb.conf.template
(cat <<EOF
[etc]
path = /etc
valid users = root
guest ok = no
admin users = root
[tmp]
path = /tmp
valid users = root
guest ok = no
admin users = root
[usr]
path = /usr
valid users = root
guest ok = no
admin users = root
[var]
path = /var
valid users = root
guest ok = no
admin users = root
[www]
path = /www
valid users = root
guest ok = no
admin users = root
EOF
) >>/etc/samba/smb.conf.template
smbpasswd -a root
/etc/init.d/samba restart

问题汇总

组件安装问题

  • libcap libcap-bin

    libcap 系统自带安装好了,但是 libcap-bin 死活没有资源,网上说可以添加 opkg 的官方源,System -> Software -> Configure opkg ,加上下面这行

    1
    2
    3
    4
    src/gz snapshots https://downloads.openwrt.org/snapshots/packages/mipsel_24kc/base
    # 接着执行
    opkg update
    opkg install libcap libcap-bin
    但是我这照着操作不行,于是我直接去这个源所在网站,把这两个包下下来,然后 scp 到路由器,手动安装:
    1
    2
    3
    4
    5
    6
    # 两个库的版本号最好一致,不然又要出幺蛾子
    # 先卸载原来自带的(突然发现自带的版本号反而高一些)
    opkg remove libcap
    # 再手动安装
    opkg install /tmp/libcap-bin_2.51-1_mipsel_24kc.ipk
    opkg install /tmp/libcap_2.51-1_mipsel_24kc.ipk

程序运行问题

启动 clash 后,反复报错:

1
2
[signal SIGSEGV: segmentation violation code=0x1 addr=0x18 pc=0x3bb98c]
panic: runtime error: invalid memory address or nil pointer dereference
解决方案:我的解决方案是,将 TUN 和 Game 内核都加上

先下载内核文件:clash 主界面 -> Global Setting -> 版本更新,将 TUN 和 Game 内核都下载到本地,然后参照界面的说明,将其(重命名后)分别搞到路由器的文件路径:

1
2
/etc/openclash/core/clash_tun
/etc/openclash/core/clash_game

接着设置代理方案:clash 主界面 -> Global Setting -> 模式设置 -> 运行模式选最长那个选项(TUN-混合)-> 网络栈类型选(Gvisor)-> 代理模式选(Rule 策略代理)

最后点“应用配置”,过会儿就正常翻墙了,别问,我也不知道为什么,瞎摸索出来的。

UPDATE0

小米路由器 4A 百兆版照着 文档 攻略刷机,其中 mtd 写入那里始终报错:

1
2
3
4
5
root@XiaoQiang:/tmp# mv openwrt-ramips-mt7621-xiaomi_mir4-squashfs-rootfs0.bi
n rootfs0.bin
root@XiaoQiang:/tmp# mtd write kernel1.bin kernel1
Could not open mtd device: kernel1
Can't open device for writing!
自己研究了下 mtd 命令,尝试下面的命令:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
root@XiaoQiang:/tmp# cat /proc/mtd
dev: size erasesize name
mtd0: 01000000 00010000 "ALL"
mtd1: 00020000 00010000 "Bootloader"
mtd2: 00010000 00010000 "Config"
mtd3: 00010000 00010000 "Factory"
mtd4: 00010000 00010000 "crash"
mtd5: 00010000 00010000 "cfg_bak"
mtd6: 00100000 00010000 "overlay"
mtd7: 00c60000 00010000 "OS1"
mtd8: 00b00000 00010000 "rootfs"
mtd9: 00240000 00010000 "disk"

mtd write kernel1.bin Factory
mtd write kernel1.bin OS1
最后变砖……

UPDATE1

把砖块寄给小米维修,结果那边说我的路由过了保质期,需要付费维修,一问维修价格比我从闲鱼上买的价格还贵。听着小哥电话里期待的语气,实在不忍心拒绝他,咬牙回了句:那你修吧。