小米路由器 pro (r3p) 官方稳定版固件开启telnet、ssh方法及软件

偶然发现网上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的方法,http://www.52hwl.com/2157.html ,但具体到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 ,如图所示
小米路由器 pro (r3p) 官方稳定版固件开启telnet、ssh方法及软件

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

小米路由器 pro (r3p) 官方稳定版固件开启telnet、ssh方法及软件

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

小米路由器 pro (r3p) 官方稳定版固件开启telnet、ssh方法及软件
小米路由器 pro (r3p) 官方稳定版固件开启telnet、ssh方法及软件

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,见附件。
小米路由器 pro (r3p) 官方稳定版固件开启telnet、ssh方法及软件

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

关于安装软件

虽然获取了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,可以直接在路由器上编译二进制程序

相关文件下载地址
©下载资源版权归作者所有;本站所有资源均来源于网络,仅供学习使用,请支持正版!

文章版权声明

 1 原创文章作者:汇维网,如若转载,请注明出处: http://www.52hwl.com/2149.html

 2 温馨提示:软件侵权请联系469472785#qq.com(三天内删除相关链接)资源失效请留言反馈

 3 下载提示:如遇蓝奏云无法访问,请修改lanzous(把s修改成x)

 免责声明:本站为个人博客,所有软件信息均来自网络 修改版软件,加群广告提示为修改者自留,非本站信息,注意鉴别

发表评论

登录后才能评论