找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
广告投放联系QQ68610888
查看: 36231|回复: 292

[PRO(R3P)] 1.9更新overlay-小米路由器 pro (r3p) 官方稳定版固件开启telnet、ssh方法及软件...

 火... [复制链接]
本帖最后由 ximiximi 于 2021-1-10 18:45 编辑

2021.1.9 更新    用MTK SDK编译了overlayfs模块,可以更方便的读写系统文件夹,不用为只读文件系统困扰了。

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

上个月入手了一台r3p,用了一段时间,官方固件稳定性还是不错的。
我需求比较佛系,只想跑个威土威就行,所以也不想刷三方固件去折腾,就找了找有没有官方固件拿root权限的方法

有幸看到坛友sheenic说可以开telnet,按照提示的方法试了试,成功开启。感谢恩山这个分享平台,现将自己的方法分享出来供有需求的朋友尝试。

2021.1.9 更新    编译了overlayfs模块,可以更方便的读写系统文件夹,不用为只读文件系统困扰了。

偶然发现网上MTK OPENWRT SDK用的Linux版本也是3.10.14,猜测小米应该是在这个版本的SDK基础上编译的r3p官方固件,所以打算试试

MTK SDK的Linux源码已经包含了overlayfs模块

但是由于不知道小米官方编译时使用的内核配置文件,我在编译过程中为了试出内核配置文件,还是花费了一些精力。

好在结果是好的,编译出的overlayfs模块运行平稳,顺便在模块中patch了一个ubifs有bug的函数,在此分享给大家使用。


只能在r3p最新官方稳定固件上使用!!


使用方法:

insmod overlayfs.ko

如果要读写/lib目录,可以创建一个upper目录,然后将原来的/lib与自己的upper合并后挂载到/lib,这样对/lib的写会自动转移到upper
mount -t overlayfs overlay -o rw,noatime,lowerdir=/lib,upperdir=/userdisk/my_lib /lib

如果要读写其他系统目录,类似原理。甚至可以挂载到根目录(不建议)

同时安全起见,建议在独立的namespace上overlay系统目录,创建namespace的方法可以查阅之前的文章内容。


如果要开机启动overlay,可以在/etc/rc.local中添加,同样强烈建议在独立namespace中,并且在insmod前sleep一段时间(非常重要),以防模块有问题,系统可能无限重启

/opt/bin/unshare --mount=/opt/share/my_mount_ns sh -c '
        sleep 30
        insmod /userdisk/overlayfs.ko
        mount -t overlayfs overlay -o rw,noatime,lowerdir=/lib,upperdir=/userdisk/my_lib /lib '


如果模块导致系统连续重启,sleep预留时间内,可以 ps | grep sleep  找到这个进程,手动kill掉(目前在我的系统上平稳运行,没任何问题)


解决了系统目录读写的问题,把openwrt的libc库放在upper中,openwrt的几乎所有软件包都可以运行起来

如果坛友有想编译的内核模块或者软件,可以留言,我有空帮大家编译。



分割线----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------



本方法主要思路是根据另一篇AX3600开telnet的方法,https://www.wutaijie.cn/?p=254,特此感谢原作者的分享。但具体到r3p有略微不同。

1,刷官方开发版固件,开ssh,这个不用多说了

2,ssh到路由器,查看分区情况

root@XiaoQiang:~# cat /proc/mtd
dev:    size   erasesize  name
mtd0: 0ff80000 00020000 "ALL"
mtd1: 00040000 00020000 "Bootloader"
mtd2: 00040000 00020000 "Config"
mtd3: 00040000 00020000 "Bdata"
mtd4: 00040000 00020000 "Factory"
mtd5: 00040000 00020000 "crash"
mtd6: 00080000 00020000 "crash_syslog"
mtd7: 00040000 00020000 "cfg_bak"
mtd8: 00400000 00020000 "kernel0"
mtd9: 00400000 00020000 "kernel1"
mtd10: 02800000 00020000 "rootfs0"
mtd11: 02800000 00020000 "rootfs1"
mtd12: 0a580000 00020000 "overlay"  


3.备份Bdata,crash

nanddump -o -f /tmp/Bdata_mtd3.img /dev/mtd3
nanddump -o -f /tmp/crash_mtd5.img /dev/mtd5


注意,这里有两点与原教程不同,一是分区布局不同,二是nanddump命令一定要加 -o,不然默认会导出flash的OOB数据,会导致导出的img比分区大,如果修改后再写回去一定会出错,千万注意。

4.将导出的Bdata_mtd3.img,crash_mtd5.img复制到本地,备份一下,然后用二进制修改工具修改。(搬运工具附件链接: https://pan.baidu.com/s/1tToNRcicIjcL9pIYClGMMQ 提取码: 9j7q

修改crash_mtd5.img,这个比较简单,crash是一个全是FF的img,将前面四个字节修改为 A5 5A 00 00 ,如图所示


修改Bdata_mtd3.img,添加数据,如图所示,可以直接在右边输入字符,telnet_en=1 ssh_en=1 uart_en=1 boot_wait=on 注意中间的 点 不是字符,而是00



修改Bdata_mtd3.img的校验数据,注意,这里与原教程不同,选择数据块的时候,起始偏移4,结束偏移填 3FFF,然后用 CRC-32 校验数据块,用倒序写到Bdata_mtd3.img的前面四个字节




5.将crash_mtd5.img上传到路由器/tmp目录,并写入分区

mtd write /tmp/crash_mtd5.img crash

然后重启

reboot

6.将Bdata_mtd3.img上传到路由器/tmp目录,并写入分区。注意,这里与原教程不同,Bdata首字母要大写,r3p的分区名字与原教程不同。

mtd write /tmp/Bdata_mtd3.img Bdata

然后重启

reboot

7.重启后用telnet工具连接192.168.31.1 23,注意telnet的默认端口是23。如果连接成功,大功告成,如果不能连接,进入路由器的web界面重置一下

8.成功开启telnet后,一定要擦掉crash分区,因为这可能是小米预留的调试代码,不擦掉的话会出现比较奇怪的现象

mtd erase crash

reboot

9.至此大功告成,用web界面再刷回官方稳定版固件,方法就不用多说了吧。

------------------------------------------------------------------------------------------------分割线

关于账户登录密码

就是小米给的ssh密码。 http://d.miwifi.com/rom/ssh

也可以用序列号算,详见 https://www.right.com.cn/forum/thread-189017-1-1.html
不用专门安装php,在线跑一下就可以啦。https://www.dooccn.com/php/

--------------------------------------------------------------------------------------------------分割线

关于SSH

官方稳定版固件把SSH删了,所以在Bdata里面写了ssh_en=1也没用

其实telnet跟ssh本质上差不多,只是传文件不方便,只能在PC上开一个FTP服务器,在shell里面用curl命令上传和下载文件。

如果想启动SSH,参考下面关于安装软件的部分

-----------------------------------------------------------------------------------------------------分割线

关于文件系统

官方固件将主要系统目录都挂载为只读,包括/bin  /lib  /usr /opt等

/etc是可写的

/userdisk是可写的,建议自建目录与文件都写在这个目录下

由于官方固件的内核版本是3.10,该版本不支持overlayfs,overlayfs是3.18后进入linux主线的,所以没办法像openwrt那样直接读写/usr等系统目录。

同时内核也没安装fuse (Filesystem in Userspace),所以fuse版的unionfs fuse也是不行的。


可行的办法是: mount --bind命令挂载,比如想读写/opt目录,先将/opt目录全部复制到/userdisk下(建议全部复制,否则有可能其他进程需要原来/opt目录中的文件,导致运行错误

cp -r /opt /userdisk
然后将自建的目录挂载过去

mount --bind /userdisk/opt /opt

如此,对/opt的访问都会转到对/userdisk/opt的访问,也就间接达到了读写的目的。如果要开机自动挂载,可以将mount --bind命令添加到 /etc/rc.local中

注意,如果需要对/bin /sbin /lib /usr等系统重要目录进行mount --bind操作,建议在独立的mount namespace中进行,特别是加入开机启动项,如果不熟悉linux启动过程,可能导致启动时telnet启动不了,甚至系统启动失败,那就悲剧了。

内核默认是支持mount namespace的,通过unshare、nsenter工具可以方便的管理,unshare、nsenter工具可以通过下文关于安装软件的方法安装。

touch /userdisk/my_mount_ns
unshare --mount=/userdisk/my_mount_ns sh -c ''

这样就创建了一个mount namespace。如果要开机自动创建,可以将命令添加到/etc/rc.local中
通过nsenter工具可以连接到这个namespace进行操作。
nsenter --mount=/userdisk/my_mount_ns

至此你完全可以把路由器当成一个普通的linux系统使用了。

独立的namespace与主namespace隔离,里面可以对系统目录随意mount --bind不影响主namespace正常运行,前提是你能否确定当前的shell是运行在独立namespace中
我写了个简单的脚本判断当前shell是否运行在主namespace,见附件。



------------------------------------------------------------------------------------------------------分割线

关于安装软件


虽然获取了telnet,但除了能修改/etc下面的配置文件和使用系统自带的软件工具,几乎什么都干不了。为系统安装新软件是必须的。

小米路由当然没有自带OPKG,这里有几种安装软件的途径,动手能力较好的坛友可以尝试。



1.首推必装entware,里面打包好了大部分常用的软件和动态库,包括ssh和上面提到的unshare、nsenter等软件,是安装运行其他软件的重要基础,甚至还包括python解释器。

安装entware的方法

1)entware默认的安装目录是/opt,里面打包的软件的默认动态库搜索路径也是以/opt为起点,所以需要先挂载可读写/opt目录,参考上文。

cp -r /opt /userdisk
mount --bind /userdisk/opt /opt

2)安装entware


cd /userdisk
wget http://bin.entware.net/mipselsf-k3.4/installer/generic.sh
chmod +x generic.sh
./generic.sh


3)entware使用opkg管理软件包,所以可以用各种opkg命令管理


先安装ssh试试


opkg update
opkg install dropbear


opkg会自动安装依赖包


安装完成后,可以手动启动ssh


/opt/etc/init.d/S51dropbear start


4)同时建议将上述mount --bind命令和entware的自启动脚本添加到开机启动


在/etc/rc.local中exit 0之前添加如下命令


mount --bind /userdisk/opt /opt
/opt/etc/init.d/rc.unslung start


rc.unslung脚本会自动启动/opt/etc/init.d下的所有脚本,当然也包括ssh,这样开机就有ssh了


5)同时建议将entware目录添加到环境变量


在/etc/profile最后面添加如下命令
export PATH=/opt/sbin/:/opt/bin/:$PATH

这里强调下,在后续的使用过程中,并不建议在/etc/profile中将/opt/lib添加到LD_LIBRARY_PATH
因为entware中使用了最新的glibc,与系统自带的uClibc并不完全兼容,如果强制改变动态链接库搜索路径可能会导致程序运行错误

至此,通过entware的软件库,路由器已经是一台功能较为完备的linux系统。


http://bin.entware.net/mipselsf-k3.4/
可以通过名字搜索entware包括的软件包






2.使用openwrt的软件包,楼主的威土威就是通过这个方案顺利运行起来的


entware提供了大部分常用软件和动态库,如果需要的软件不在entware中(比如楼主想要的威土威),但有openwrt的软件包,需要一定的linux知识,有兴趣的坛友可以通过下面的方案尝试

1)手动下载软件包

解压后,查看依赖文件,手动下载相同package系统下的依赖包,包括libc

2)创建独立mount namespace,并重新挂载/lib


由于libc的版本差异,建议使用与软件包编译时相同的libc版本,因此往往需要修改/lib目录以调用正确的libc,这时候就需要在独立mount namespace中挂载/lib目录,请参考上文中关于文件系统的部分


unshare、nsenter可以使用entware安装

opkg install unshare
opkg install nsenter

创建mount namespace,

touch /userdisk/my_mount_ns
unshare --mount=/userdisk/my_mount_ns
./where_am_i.sh

如果确认shell在独立mount namespace中,复制/lib,并重新挂载/lib目录

cp -r /lib /userdisk
mount --bind /userdisk/lib /lib

3)复制软件包使用的libc到/lib,并根据情况调整软链接和其他动态库

可以用LD_DEBUG、LD_TRACE_LOADED_OBJECTS、strace命令等方法查看和观察程序运行所需要的动态库,并根据需要修改/lib中的文件,这里就需要一定的linux知识了,有兴趣的坛友可以尝试





3.使用debian mipsel版本的软件包


debian有mipsel版本,从debian 8开始使用hard float编译。mt7621没有FPU,不能使用hard float,所以只能使用debian 7及之前的软件包

与使用openwrt软件包方法类似,需要一定的linux知识,有兴趣的坛友可自行尝试




4.安装软件终极大法,自己编译


前面的几种方法都是利用现有的二进制程序,能够满足80%以上的一般需求。


如果需要自行编译二进制程序,需要一定的linux知识,有兴趣的坛友可以尝试。这就不属于本文的重点了

1)小米路由器官方有提供r3p的SDK,里面有交叉编译toolchain,可以尝试
2)可以利用openwrt SDK
3)entware里有gcc,可以直接在路由器上编译二进制程序



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×

评分

参与人数 2恩山币 +2 收起 理由
qq303*** + 1 面对这种帖子,我内心复杂,真不知道说什么好……
pece*** + 1 一看就是觉得高端、大气、上档次!

查看全部评分

看看           
回复

使用道具 举报

看看一下
回复

使用道具 举报

回复

使用道具 举报

来自手机 | 显示全部楼层
谢谢分享!!!
回复

使用道具 举报

来自手机 | 显示全部楼层
牛!试试看
回复

使用道具 举报

牛!试试看
回复

使用道具 举报

最近都不想折腾了
回复

使用道具 举报

沙发一楼,围观一下,刚好入手。
来自微站
回复

使用道具 举报

谢谢分享!!!
回复

使用道具 举报

看看什么好办法
回复

使用道具 举报

好东西 ,下载来看看
回复

使用道具 举报

来自手机 | 显示全部楼层
感谢分享,来学习一下。
回复

使用道具 举报

感谢分享。      
回复

使用道具 举报

试试。。卡在了端口23
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

欢迎大家光临恩山无线论坛上一条 /1 下一条

有疑问请添加管理员QQ86788181|手机版|小黑屋|Archiver|恩山无线论坛(常州市恩山计算机开发有限公司版权所有) ( 苏ICP备05084872号 )

GMT+8, 2024-5-10 13:42

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

| 江苏省互联网有害信息举报中心 举报信箱:js12377 | @jischina.com.cn 举报电话:025-88802724 本站不良内容举报信箱:68610888@qq.com 举报电话:0519-86695797

快速回复 返回顶部 返回列表