草庐IT

小米路由器3G R3G 刷入Breed和OpenWrt 20.02.2 的记录

Milton 2023-03-28 原文

小米 R3G 参数

  • Architecture: MIPS
  • Vendor: Mediatek
  • Bootloader: U-Boot
  • System-On-Chip: MT7621 family
  • CPU/Speed: mipsel_24kc @ 880MHz 2 core
  • Flash: 128MB ESMT NAND
  • RAM: 256MB - NT 5C C 128M16 FP-DI,DDR3-1600-11-11-11
  • Wireless: MT7603/MT7612 2.4GHz/5GHz 802.11an+ac
  • Ethernet: 1000 Mbit/s / vlan support
  • USB: 1x 3.0

路由器刷入开发版ROM并开启SSH

为了写入Bootloader, 要开启SSH, 要开启SSH, 就需要将小米路由器的 ROM 更新为开发版.

在小米的 miwifi 下载页面找到路由器对应的开发版 ROM(R3G ROM 开发版).

ROM 的升级有两种方式

  1. 登陆路由器后台在线升级
  2. 如果前一个方式不行, 可以将其拷贝到U盘根目录, 并命名为 miwifi.bin, 随后断开电源, 插上U盘, 并按住 reset 按钮后插入电源, 等到指示灯变为黄色闪烁(10-15秒)后松开 reset 键, 之后路由器将更新 ROM 并重启进入正常状态(指示灯变为蓝色常亮).

获取SSH权限

  1. 先注册小米账号.
  2. 安装MiWiFi手机APP, 连上路由器WIFI后绑定路由器, 绑定教程请参见 https://zhidao.baidu.com/question/2011024461729333668.html
  3. 绑定后, 登陆 http://d.miwifi.com/rom/ssh, 点击"下载工具包"
  4. 下载工具包的链接旁边有root密码, 需要记一下

下载工具包时显示的信息

工具包使用方法:小米路由器需升级到开发版0.5.28及以上, 小米路由器mini需升级到开发版0.3.84及以上, 小米路由器3即将支持. 注意:稳定版不支持
请将下载的工具包bin文件复制到U盘(FAT/FAT32格式)的根目录下, 保证文件名为miwifi_ssh.bin;
断开小米路由器的电源, 将U盘插入USB接口;
按住reset按钮之后重新接入电源, 指示灯变为黄色闪烁状态即可松开reset键;
等待3-5秒后安装完成之后, 小米路由器会自动重启, 之后您就可以尽情折腾啦 :)

开启 SSH

  1. 将下载的工具包bin文件复制到U盘(FAT/FAT32格式)的根目录下, 保证文件名为miwifi_ssh.bin;
  2. 断开小米路由器的电源, 将U盘插入USB接口;
  3. 按住reset按钮之后重新接入电源, 指示灯变为黄色闪烁状态(10-15秒)即可松开reset键
  4. 等待3-5秒后安装完成之后, 小米路由器会自动重启, 蓝灯常亮
  5. 登录ssh的密码, 在刚才下载工具包的界面上

如果ssh连接遇到错误

Unable to negotiate with 192.168.31.1 port 22: no matching key exchange method found. Their offer: diffie-hellman-group1-sha1,diffie-hellman-group14-sha1

需要手动指定oKexAlgorithms

ssh -oKexAlgorithms=+diffie-hellman-group1-sha1 root@192.168.31.1

备份

R3G的闪存是128M的NAND, 查看布局

cat /proc/mtd
dev:    size   erasesize  name
mtd0: 07f80000 00020000 "ALL"
mtd1: 00080000 00020000 "Bootloader"
mtd2: 00040000 00020000 "Config"
mtd3: 00040000 00020000 "Bdata"
mtd4: 00040000 00020000 "Factory"
mtd5: 00040000 00020000 "crash"
mtd6: 00040000 00020000 "crash_syslog"
mtd7: 00040000 00020000 "reserved0"
mtd8: 00400000 00020000 "kernel0"
mtd9: 00400000 00020000 "kernel1"
mtd10: 02000000 00020000 "rootfs0"
mtd11: 02000000 00020000 "rootfs1"
mtd12: 03580000 00020000 "overlay"
mtd13: 012a6000 0001f000 "ubi_rootfs"
mtd14: 030ec000 0001f000 "data"

备份命令

具体路径根据自己的U盘路径调整

dd if=/dev/mtd0 of=/extdisks/sda4/ALL.bin
dd if=/dev/mtd1 of=/extdisks/sda4/Bootloader.bin
dd if=/dev/mtd2 of=/extdisks/sda4/Config.bin
dd if=/dev/mtd3 of=/extdisks/sda4/Bdata.bin
dd if=/dev/mtd4 of=/extdisks/sda4/Factory.bin
dd if=/dev/mtd5 of=/extdisks/sda4/crash.bin
dd if=/dev/mtd6 of=/extdisks/sda4/crash_syslog.bin
dd if=/dev/mtd7 of=/extdisks/sda4/reserved0.bin
dd if=/dev/mtd8 of=/extdisks/sda4/kernel0.bin
dd if=/dev/mtd9 of=/extdisks/sda4/kernel1.bin
dd if=/dev/mtd10 of=/extdisks/sda4/rootfs0.bin
dd if=/dev/mtd11 of=/extdisks/sda4/rootfs1.bin
dd if=/dev/mtd12 of=/extdisks/sda4/overlay.bin
dd if=/dev/mtd13 of=/extdisks/sda4/ubi_rootfs.bin
dd if=/dev/mtd14 of=/extdisks/sda4/data.bin

备份到mtd14可以会提示设备不存在, 可以忽略, mtd0-mtd4备份下来就行了

恢复命令

mtd write /extdisks/sda4/Bootloader.bin Bootloader
mtd write /extdisks/sda4/Config.bin Config
mtd write /extdisks/sda4/Bdata.bin Bdata
mtd write /extdisks/sda4/Factory.bin Factory
mtd write /extdisks/sda4/crash.bin crash
mtd write /extdisks/sda4/crash_syslog.bin crash_syslog
mtd write /extdisks/sda4/reserved0.bin reserved0
mtd write /extdisks/sda4/kernel0.bin kernel0
mtd write /extdisks/sda4/kernel1.bin kernel1
mtd write /extdisks/sda4/rootfs0.bin rootfs0
mtd write /extdisks/sda4/rootfs1.bin rootfs1
mtd write /extdisks/sda4/overlay.bin overlay
mtd write /extdisks/sda4/ubi_rootfs.bin ubi_rootfs
mtd write /extdisks/sda4/data.bin data

写入Breed

下载breed https://breed.hackpascal.net/ 在下面找到 breed-mt7621-xiaomi-r3g.bin, 当前版本的日期是 2021-12-16. 这个版本有专为R3G准备的"小米R3G设置", "环境变量编辑", "小米 R3G Bdata"配置界面

使用winscp

  1. 使用 winscp 登入路由器
  2. 将刚才下载的breed-mt7621-xiaomi-r3g.bin上传到路由器的/tmp文件夹下, 并改个简单点的文件名 breed.bin

使用scp命令

scp -oKexAlgorithms=+diffie-hellman-group1-sha1 "somewhere/breed-mt7621-xiaomi-r3g.bin" root@192.168.31.1:/tmp/

执行命令

mtd -r write /tmp/breed.bin Bootloader

写入完成后会自动重启, 注意, 这时候直接重启是肯定回不去原来小米路由器的系统的, 因为Breed里还有个参数没设置.

看灯变紫色后直接拔掉电源, 拿牙签回形针之类的东西顶住reset孔加电, 看到灯快速闪烁的时候再松开reset孔. 这时候路由器就已经进入了Breed系统. 在电脑的命令行cmd中通过ipconfig查看IP, 能看到电脑获取到192.168.1.x之类的IP. 在浏览器中访问192.168.1.1 就可以进入breed控制台.

配置 breed

  1. 在小米 R3G 设置中, 删除normal_firmware_md5这个键值, 因为刷新刷的固件 md5 值与原来的不一致会导致无法开机(删了, 不删是否不能开机未验证)
  2. 在环境变量编辑中, 添加一个环境变量, 变量名为 xiaomi.r3g.bootfw, 值为2. 这个必须要设置, 否则进不去原来的小米系统.
  3. 然后拔电再加电重启路由器, 之后就会进入小米系统, 因为还需要在ssh下写入OpenWrt.

参数说明 xiaomi.r3g.bootfw

如果写入 Breed 到 bootloader, 这个参数是必须的. Breed的启动流程如下

  1. 如果 kernel0 存在, 那么启动 kernel0
  2. 如果 kernel0 不存在, kernel1 存在, 那么启动 kernel1
  3. 如果 kernel0 和 kernel1 都存在, 则检查环境变量 xiaomi.r3g.bootfw 的值, 如果存在且值为2, 那么启动 kernel1, 否则启动 kernel0

如果通过mtd写入了OpenWrt 到Kernel1, 但是不写这个环境变量, Breed就会从kernel0启动, 无法进入系统, 然后重启, 再次从kernel0启动, 这样一直循环下去.

写入固件

因为小米R3G的存储使用的是NAND, 和普通的路由器不一样, 所以写入方式不太一样.

单文件固件

对于单文件的第三方固件, 包括官方的固件, 可以和以往的固件一样, 启动到 Breed 界面下, 在界面中直接上传刷入.

OpenWrt 20.02

对于 OpenWrt 固件, 写入方式比较特殊, 需要说明一下.

具体的方式在官方网站上已经详细说明了https://openwrt.org/toh/xiaomi/mir3g

首先下载固件, 访问 https://firmware-selector.openwrt.org/ , 输入 xiaomi, 选择 Xiaomi Router 3G, 如果没有这个型号, 在右侧的版本中选择旧一个版本试试, 在下载页面下载以下两个文件

openwrt-ramips-mt7621-mir3g-squashfs-kernel1.bin 
openwrt-ramips-mt7621-mir3g-squashfs-rootfs0.bin 

这两文件需要在ssh下, 通过mtd写入, 所以如果没有ssh, 需要用breed刷回官方的开发版固件并按前面的步骤开启ssh.

将上面准备的2个OpenWrt文件, 按之前的方法通过winscp或者scp命令上传到 /tmp 目录下,执行下面的命令写入固件

cd /tmp
# 写入第二个kernel分区, 如果写入第一个目标是 kernel0
mtd write openwrt-ramips-mt7621-mir3g-squashfs-kernel1.bin kernel1
# 写入rootfs分区
mtd write openwrt-ramips-mt7621-mir3g-squashfs-rootfs0.bin rootfs0
# 直接reboot
reboot

使用kernel1.bin和rootfs0.bin写入, 启动OpenWrt后通过df -h看到的是正常的文件系统, 可以直接使用, 不需要再刷sysupgrade.bin

切换OpenWrt和原生固件

原Bootlaoder

如果使用原Bootloader, 切换启动分区是用的flag_try_sys1_failedflag_try_sys2_failed变量,

使用OpenWrt启动

nvram set flag_try_sys1_failed=1 
nvram set flag_try_sys2_failed=0
nvram set flag_boot_success=0 
nvram commit
reboot

恢复官方系统

需要切换回原kernel分区启动

  1. 将官方固件放在U盘根目录下, fat32格式, 文件改名为 miwifi.bin 接上路由器
  2. ssh连接路由器执行
fw_setenv flag_try_sys1_failed 0
fw_setenv flag_try_sys2_failed 1
fw_setenv flag_boot_success 0
  1. 路由器断电, 按住 reset 键, 加电, 等待黄色灯闪烁, 松开即可
  2. 启动后进入官方系统

使用Breed作为Bootloader

通过xiaomi.r3g.bootfw变量进行控制

参考

有关小米路由器3G R3G 刷入Breed和OpenWrt 20.02.2 的记录的更多相关文章

  1. postman——集合——执行集合——测试脚本——pm对象简单示例02 - 2

    //1.验证返回状态码是否是200pm.test("Statuscodeis200",function(){pm.response.to.have.status(200);});//2.验证返回body内是否含有某个值pm.test("Bodymatchesstring",function(){pm.expect(pm.response.text()).to.include("string_you_want_to_search");});//3.验证某个返回值是否是100pm.test("Yourtestname",function(){varjsonData=pm.response.json

  2. kvm虚拟机安装centos7基于ubuntu20.04系统 - 2

    需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc

  3. 牛客网专项练习30天Pytnon篇第02天 - 2

    1.在Python3中,下列关于数学运算结果正确的是:(B)a=10b=3print(a//b)print(a%b)print(a/b)A.3,3,3.3333...B.3,1,3.3333...C.3.3333...,3.3333...,3D.3.3333...,1,3.3333...解析:    在Python中,//表示地板除(向下取整),%表示取余,/表示除(Python2向下取整返回3)2.如下程序Python2会打印多少个数:(D)k=1000whilek>1:    print(k)k=k/2A.1000 B.10C.11D.9解析:    按照题意每次循环K/2,直到K值小于等

  4. Ubuntu20.04系统WineHQ7.0安装微信 - 2

    提供3种Ubuntu系统安装微信的方法,在Ubuntu20.04上验证都ok。1.WineHQ7.0安装微信:ubuntu20.04安装最新版微信--可以支持微信最新版,但是适配的不是特别好;比如WeChartOCR.exe报错。2.原生微信安装:linux系统下的微信安装(ubuntu20.04)--微信适配的最好,反应最快,但是微信版本只到2.1.1,版本太老,很多功能都没有。3.深度deepin-wine6安装微信:ubuntu20.04+系统deepin-wine6安装新版微信--综合比较好,当前个人使用此种方法1个月,微信版本3.4;没什么大问题,尚可。一、WineHQ7.0安装微信

  5. ruby-on-rails - encode_www_form 将空格转换为 + 而不是 %20 - 2

    我正在尝试从使用RubyonRails的散列创建http参数,我尝试使用URI.encode_www_form(params),但这没有正确生成参数。下面是我的哈希值params['Name'.to_sym]='NiaKun'params['AddressLine1'.to_sym]='AddressOne'params['City'.to_sym]='CityName'这个方法把空格转成+,我要的是把空格转成%20我收到"Name=Nia+Kun&AddressLine1=Address+One&City=City+Name"但我需要将此空格转换为%20

  6. ruby - 如何在 Node.js/RoR 中监控 20 个网站(Ping 或 HTTP)的正常运行时间 - 2

    每5分钟(例如)ping20个网站的列表以了解该网站是否响应HTTP202的最佳方法是什么?最简单的想法是将20个URLS保存在数据库中,然后运行数据库并对每个URL执行ping操作。但是,当一个人不回答时会发生什么?之后的人会怎样?此外,是否有更好但更简单的解决方案?恐怕该列表会增长到20000个网站,然后没有足够的时间在我需要ping的5分钟内全部ping通它们。基本上,我是在描述PingDom、UptimeRobot等的工作原理。我正在使用node.js和RubyonRails构建这个系统。我也倾向于使用MongoDB来保存所有ping和监控结果的历史记录。建议?非常感谢!

  7. ruby-on-rails - 如何在 Rails 中使用空格作为 '%20' 而不是 '+' 获取 url 的参数 - 2

    如果我有这个参数用于添加到URLparams={name:'JohnKey'}并使用方法to_param:params.to_param=>"name=John+Key"重点是'+'没有被所使用的服务正确读取,需要'%20'而不是name=John%20Key:Whentoencodespacetoplus(+)or%20?有没有办法在不使用gsub的情况下返回带有“%20”的参数? 最佳答案 我会建议只坚持使用gsub,也许用注释来解释这种行为的必要性。虽然您可以通过使用URI.escape解决问题,但据说它已被弃用,因为它不完全

  8. 【算法题解】20. 两数之和 - 2

    这是一道简单题题目来自:https://leetcode.cn/problems/two-sum/题目给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。提示:22nums.length104−109−109nums[i]109−109−109target109只会存在一个有效答案进阶:你可以想出一个时间复杂度小于O(n2)O(n^2)O(n2)的算法吗?示例1:输入:nums=[2,7,11,15],targe

  9. 【哈士奇赠书活动 - 20期】-〖从程序员到架构师〗 - 2

    文章目录⭐️赠书活动-《从程序员到架构师》⭐️编辑推荐⭐️作者简介⭐️赠书活动→获奖名单⭐️赠书活动-《从程序员到架构师》内容简介:《从程序员到架构师:大数据量、缓存、高并发、微服务、多团队协同等核心场景实战》分为数据持久化层场景实战、缓存层场景实战、基于常见组件的微服务场景实战、微服务进阶场景实战和开发运维场景实战5个部分。基于对十余个架构搭建与改造项目的经验总结,介绍了大数据量、缓存、高并发、微服务、多团队协同等核心场景下的架构设计常见问题及其通用技术方案,包含冷热分离、查询分离、分表分库、秒杀架构、注册发现、熔断、限流、微服务等具体需求下的技术选型、技术原理、技术应用、技术要点等内容,将

  10. Ruby:为什么 1.025.round(2) 四舍五入为 1.02? - 2

    据我了解.round()-ruby中的功能将小数向上舍入,最后一个有效数字是5?例如1.5.round(0)#=>2(OK)但为什么1.025.round(2)#=>1.02而不是我期望的1.03?irb(main):037:0>1.025.round(2)=>1.02我该怎么做才能解决这个问题? 最佳答案 这与最后一位数字为5无关,与将十进制值转换为double浮点值有关。http://en.wikipedia.org/wiki/Double_precision_floating-point_format基本上,十进制数必须以有限

随机推荐