为了写入Bootloader, 要开启SSH, 要开启SSH, 就需要将小米路由器的 ROM 更新为开发版.
在小米的 miwifi 下载页面找到路由器对应的开发版 ROM(R3G ROM 开发版).
ROM 的升级有两种方式
下载工具包时显示的信息
工具包使用方法:小米路由器需升级到开发版0.5.28及以上, 小米路由器mini需升级到开发版0.3.84及以上, 小米路由器3即将支持. 注意:稳定版不支持
请将下载的工具包bin文件复制到U盘(FAT/FAT32格式)的根目录下, 保证文件名为miwifi_ssh.bin;
断开小米路由器的电源, 将U盘插入USB接口;
按住reset按钮之后重新接入电源, 指示灯变为黄色闪烁状态即可松开reset键;
等待3-5秒后安装完成之后, 小米路由器会自动重启, 之后您就可以尽情折腾啦 :)
如果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 https://breed.hackpascal.net/ 在下面找到 breed-mt7621-xiaomi-r3g.bin, 当前版本的日期是 2021-12-16. 这个版本有专为R3G准备的"小米R3G设置", "环境变量编辑", "小米 R3G Bdata"配置界面
使用winscp
使用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控制台.
normal_firmware_md5这个键值, 因为刷新刷的固件 md5 值与原来的不一致会导致无法开机(删了, 不删是否不能开机未验证)xiaomi.r3g.bootfw, 值为2. 这个必须要设置, 否则进不去原来的小米系统.如果写入 Breed 到 bootloader, 这个参数是必须的. Breed的启动流程如下
如果通过mtd写入了OpenWrt 到Kernel1, 但是不写这个环境变量, Breed就会从kernel0启动, 无法进入系统, 然后重启, 再次从kernel0启动, 这样一直循环下去.
因为小米R3G的存储使用的是NAND, 和普通的路由器不一样, 所以写入方式不太一样.
对于单文件的第三方固件, 包括官方的固件, 可以和以往的固件一样, 启动到 Breed 界面下, 在界面中直接上传刷入.
对于 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
如果使用原Bootloader, 切换启动分区是用的flag_try_sys1_failed和flag_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分区启动
fw_setenv flag_try_sys1_failed 0
fw_setenv flag_try_sys2_failed 1
fw_setenv flag_boot_success 0
通过xiaomi.r3g.bootfw变量进行控制
//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
需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/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
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值小于等
提供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安装微信
我正在尝试从使用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
每5分钟(例如)ping20个网站的列表以了解该网站是否响应HTTP202的最佳方法是什么?最简单的想法是将20个URLS保存在数据库中,然后运行数据库并对每个URL执行ping操作。但是,当一个人不回答时会发生什么?之后的人会怎样?此外,是否有更好但更简单的解决方案?恐怕该列表会增长到20000个网站,然后没有足够的时间在我需要ping的5分钟内全部ping通它们。基本上,我是在描述PingDom、UptimeRobot等的工作原理。我正在使用node.js和RubyonRails构建这个系统。我也倾向于使用MongoDB来保存所有ping和监控结果的历史记录。建议?非常感谢!
如果我有这个参数用于添加到URLparams={name:'JohnKey'}并使用方法to_param:params.to_param=>"name=John+Key"重点是'+'没有被所使用的服务正确读取,需要'%20'而不是name=John%20Key:Whentoencodespacetoplus(+)or%20?有没有办法在不使用gsub的情况下返回带有“%20”的参数? 最佳答案 我会建议只坚持使用gsub,也许用注释来解释这种行为的必要性。虽然您可以通过使用URI.escape解决问题,但据说它已被弃用,因为它不完全
这是一道简单题题目来自: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
文章目录⭐️赠书活动-《从程序员到架构师》⭐️编辑推荐⭐️作者简介⭐️赠书活动→获奖名单⭐️赠书活动-《从程序员到架构师》内容简介:《从程序员到架构师:大数据量、缓存、高并发、微服务、多团队协同等核心场景实战》分为数据持久化层场景实战、缓存层场景实战、基于常见组件的微服务场景实战、微服务进阶场景实战和开发运维场景实战5个部分。基于对十余个架构搭建与改造项目的经验总结,介绍了大数据量、缓存、高并发、微服务、多团队协同等核心场景下的架构设计常见问题及其通用技术方案,包含冷热分离、查询分离、分表分库、秒杀架构、注册发现、熔断、限流、微服务等具体需求下的技术选型、技术原理、技术应用、技术要点等内容,将
据我了解.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基本上,十进制数必须以有限