数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 468|回复: 7

不刷机把驭盾mr616-h1路由器改成小型NAS

[复制链接]
发表于 7 天前 | 显示全部楼层 |阅读模式
# 0x00 写在前面
这几天有空折腾了下驭盾路由器MR616-H1,实现了一个小型家用NAS的功能,下面大都是文字记录,当时也没有特别详细的截图或拍照啥的,大家凑合看吧。


传输速度能到30MB/s,带宽相当于250Mbit,千兆网的优势还是有的。
大屏电视机现在也支持DLNA,可以直接播放NAS上的文件。

# 0x01 我的需求
家里有个小房间信号弱,本来想找个路由器增加一下覆盖,发现3年前跟风买的驭盾路由器MR616-H1还在吃灰,这个路由器还可以装SATA硬盘,说不定还可以做个NAS,决定折腾下兴许能用上。
在网上找了一圈,也没有搜到有什么openwrt固件可以刷新,倒是有刷其他的固件,但是都说有些问题,主要是我喜欢openwrt这种固件,相当于一个linux操作系统,可玩性更大。
先看下原本的固件能不能用吧,用mysmarthome密码进入设置界面,发现不能改成桥接模式,因为家里已经有主路由了,不能桥接,那么也就不能做NAS了,必须改。

# 0x01 单片机的功能
去网上看了一下前人研究过的这个主板上带的单片机的问题,我把TTL的TX和MCU的TX线分别接到我电脑的串口,监听一下这个串口在干啥,
发现MCU会监控路由器的console串口输出的数据判断路由器状态,同时不断的执行nvram set McUrEt=0?0?和nvram get McUrEt来判断路由是不是正常工作。
一旦TTL串口线故障,或者主机故障无响应,MCU就会通过pin16脚产生一个短暂高电平,控制电源断开再接上,相当于自动重启。
开机的时候MCU接上电也会第一时间拉低pin16,让主板断电(MCU是单独供电,会一直有电),按下开机按钮(好像是连接到pin13脚,有点不记得了)后MCU才给pin16信号决定开机。
关机的时候web服务会在console打印出一些状态码,比如连续打印McUrEt=0204这种,然后单片机就会根据这个信息来关机,实现了软件关机的功能。
此外,单片机的除了连TTL串口和电源控制以外,还要接LED的控制(pin14和pin15都是)。

搞清楚MCU的功能以后,我本来想写个新的固件替换掉开关机的功能,后来发现我研究MCU的时候,不小心弄掉了2个焊盘,就放弃了。

焊盘很容易掉,PCB还至少是4层版。
拆掉MCU的路由器,不能实现软件关机了,而且一插上电源就开机了,不过对于长期使用的NAS来说不算问题。重启可以在后台用reboot命令

# 0x02 登录系统
那么用原版的固件如何绕过web修改配置呢,那就需要登录后台系统了。
扫描了一下端口,发现有8200和1123两个端口可以通。8200好像是minidlna端口,1123一连发现是个telnet:


尝试了admin,root等弱口令,都没有办法登录,还得想其他办法找到系统里面的passwd文件。
我自己没有备份过固件,就从网上下载了原版备份的固件,然后分析了下,找到了一个jffs2文件系统的mtblock2.bin,打开以后找到了passwd.old


然后丢到hashcat,还真给跑出来几个密码。不过admin的还是跑了7位都找不到。
support,user和nobody的密码都是1234,而且登录以后相当于root,因为uid=0


# 0x03 修改系统
先看了下启动以后系统做了些啥


然后再看runtime-setup.sh
  1. # cat /etc/runtime-setup.sh
  2. #!/bin/sh

  3. export STG_SVR_ADDR="192.168.4.245"
  4. export STG_SVR_PORT="5555"

  5. if [ -n "$1" ]
  6. then
  7.     STG_SVR_ADDR = "$1"
  8. fi

  9. if [ -n "$2" ]
  10. then
  11.     STG_SVR_PORT = "$2"
  12. fi

  13. export MEDIA=/media
  14. export RUNTIME=$MEDIA/runtime
  15. export DSS=$MEDIA/dss
  16. export DATA=$MEDIA/data
  17. export TMP=$MEDIA/tmp
  18. export FILE_SERVER="http://$STG_SVR_ADDR:$STG_SVR_PORT/files"
  19. export BOARD_SKU="MR616-H"

  20. export LD_LIBRARY_PATH=$RUNTIME/lib:$RUNTIME/usr/lib:$LD_LIBRARY_PATH
  21. export PATH=$PATH:$RUNTIME/usr/bin:$RUNTIME/bin
  22. export PYTHONPATH=$RUNTIME/lib/python3.4
  23. export PYTHONDONTWRITEBYTECODE=1
  24. export SSL_CERT_FILE=$RUNTIME/etc/ssl/certs/ca-bundle.crt

  25. export STAGING_DIR=/tmp/.staging

  26. export PGDATA=$DATA
  27. export DBNAME=smarthome

  28. export AUTO_UPDATE=$TMP/update/auto_update
  29. export INSTALLER=$TMP/update/__installer.sh
  30. DB_RESTORE_FILE=$DATA/db.restore

  31. mftagent

  32. ubiattach -m 4 -d 0 -O 2048

  33. mkdir -p $RUNTIME
  34. mkdir -p $DSS
  35. mkdir -p $DATA
  36. mkdir -p $TMP

  37. find /dev -name ubi0_* -exec umount {} \;

  38. mount -o no_chk_data_crc -t ubifs /dev/ubi0_2 $DATA
  39. if [ $? -ne 0 ]
  40. then
  41.     echo "Mounting /dev/ubi0_2 failed, remove 2 volume and create new..."
  42.     ubirmvol /dev/ubi0 -n 2
  43.     ubimkvol /dev/ubi0 -s 100MiB -N data -n 2

  44.     mount -o no_chk_data_crc -t ubifs /dev/ubi0_2 $DATA
  45.     if [ $? -ne 0 ]
  46.     then
  47.         echo "Mounting failed, remove $DATA..."
  48.         rm -rf $DATA
  49.     fi
  50. fi

  51. mount -o no_chk_data_crc -t ubifs /dev/ubi0_3 $TMP
  52. if [ $? -ne 0 ]
  53. then
  54.     echo "Mounting /dev/ubi0_3 failed, remove 3 volume and create new..."
  55.     ubirmvol /dev/ubi0 -n 3
  56.     ubimkvol /dev/ubi0 -m -N tmp -n 3

  57.     mount -o no_chk_data_crc -t ubifs /dev/ubi0_3 $TMP
  58.     if [ $? -ne 0 ]
  59.     then
  60.         echo "Mounting failed, remove $TMP..."
  61.         rm -rf $TMP
  62.     fi
  63. fi

  64. if [ -f "$AUTO_UPDATE" ]
  65. then
  66.     echo "Mounting runtime readable/writeable..."
  67.     mount -t ubifs /dev/ubi0_1 $RUNTIME

  68.         echo "Starting update..."
  69.         $INSTALLER

  70.     echo "Umounting runtime..."
  71.     umount -l /dev/ubi0_1
  72. fi

  73. echo "Mounting runtime dss data tmp..."
  74. mount -r -t ubifs /dev/ubi0_0 $DSS
  75. mount -r -t ubifs /dev/ubi0_1 $RUNTIME

  76. echo "Initializing database..."

  77. pg_ctl init -o "-E UTF8"
  78. pg_ctl start -w -o "-c listen_addresses='' -c max_connections=10 -c shared_buffers=16MB -c temp_buffers=2MB -c checkpoint_segments=1"

  79. ok=0
  80. until [ $ok == 1 ]
  81. do
  82.     echo "Waiting until database server is started..."
  83.     psql -l
  84.     if [ $? == 0 ]; then
  85.         ok=1
  86.     else
  87.         sleep 1
  88.                 pg_ctl start -w -o "-c listen_addresses='' -c max_connections=10 -c shared_buffers=16MB -c temp_buffers=2MB -c checkpoint_segments=1"
  89.     fi
  90. done

  91. echo "Checking smarthome restore factory settings..."
  92. res=`nvram get __p_smarthome_restore_factory_settings`
  93. nvram set __p_smarthome_restore_factory_settings=0
  94. if [ ${res} == 1 ]; then
  95.         psql -l | grep $DBNAME
  96.         db=$?
  97.         until [ ${db} != 0 ]
  98.         do
  99.                 dropdb smarthome
  100.                 psql -l | grep $DBNAME
  101.             db=$?
  102.         done
  103.         echo "Smarthome restore factory settings OK..."
  104. fi


  105. echo "Checking database existence..."

  106. psql -l | grep $DBNAME
  107. if [ $? != 0 ]; then
  108.     echo "Database not exist, creating..."
  109.     createdb $DBNAME
  110. fi

  111. if [ -f $DB_RESTORE_FILE ]; then
  112.    echo "Restoring database..."
  113.    dropdb $DBNAME
  114.    createdb $DBNAME
  115.    pg_restore -c --if-exists -d $DBNAME $DB_RESTORE_FILE
  116.    rm -f $DB_RESTORE_FILE
  117. fi

  118. sync
  119. nvram commit

  120. ps | grep [m]rtech.smarthome.host | grep S | grep -v grep > /dev/null 2>&1
  121. if [ $? -ne 0 ]; then
  122.    systemd &
  123. fi
复制代码

主要就是挂载4个ubifs文件系统,/tmp/media/data和/tmp/media/tmp是可写的,data是存放PGSQL数据库的数据文件
/tmp/media/runtime和/tmp/media/dss都是只读的,runtime是存放可执行程序,dss是存放网站的证书和私钥等。
在runtime-setup.sh的最后一段,可以看到启动了systemd这个命令
我们再看下systemd里有啥:
  1. #!/media/runtime/bin/python3

  2. import os, time

  3. from urllib.request import urlopen
  4. from urllib.error import *

  5. os.system('export LD_PRELOAD=/media/runtime/lib/libsigsegv.so')
  6. os.system('export RUNTIME="/media/runtime"')
  7. os.system('export FILE_SERVER="http://$STG_SVR_ADDR:$STG_SVR_PORT/files"')
  8. os.system('export BOARD_SKU="MR616-H"')

  9. os.system('export LD_LIBRARY_PATH=$RUNTIME/lib:$RUNTIME/usr/lib:$LD_LIBRARY_PATH')
  10. os.system('export PATH=$PATH:$RUNTIME/usr/bin:$RUNTIME/bin')
  11. os.system('export PYTHONPATH=$RUNTIME/lib/python3.4')
  12. os.system('export SSL_CERT_FILE=/media/runtime/etc/ssl/certs/ca-bundle.crt')

  13. os.system("ps -w | grep [p]ython3 | grep [s]marthome-web | grep -v grep | awk {'print $1'} | xargs kill")
  14. os.system("killall mrtech.smarthome.host")
  15. os.system("killall ntsclientcon_brcm_static")

  16. os.chdir('/tmp/')

  17. WEB_START_DELAY = 40
  18. web_started = time.monotonic()
  19. delay_nts = 2

  20. while True:
  21.     if os.system('ps -w | grep [p]ython3 | grep [s]marthome-web | grep -v grep > /dev/null 2>&1'):
  22.         os.system('smarthome-web &')
  23.         web_started = time.monotonic()
  24.     elif time.monotonic()-web_started > WEB_START_DELAY:
  25.         need_restart = False
  26.         try:
  27.             with urlopen('http://127.0.0.1/__health_check', timeout=10) as response:
  28.                 res = response.read().decode('utf-8')
  29.                 need_restart = res!='OK'
  30.         except HTTPError:
  31.             pass
  32.         except:
  33.             need_restart = True

  34.         if need_restart:
  35.             print('systemd: Web server is not responding to heart beat test, restarting anyway...')
  36.             os.system("ps -w | grep [p]ython3 | grep [s]marthome-web | grep -v grep | awk {'print $1'} | xargs kill -SIGKILL")
  37.             os.system('smarthome-web &')
  38.             web_started = time.monotonic()

  39.     if delay_nts > 0:
  40.         delay_nts = delay_nts - 1
  41.     elif os.system('ps | grep [n]tsclientcon_brcm_static | grep -v grep > /dev/null 2>&1'):
  42.         os.system('taskset -c 1 ntsclientcon_brcm_static &')

  43.     if os.system('ps | grep [m]rtech.smarthome.host | grep -v grep > /dev/null 2>&1'):
  44.         os.system('umount /media/Public')
  45.         os.system('taskset -c 1 mrtech.smarthome.host &')

  46.     time.sleep(5)
复制代码

这里就是主要启动web界面和一些辅助程序,比如ntsclientcon_brcm_static和mrtech.smarthome.host。
我测试了一下,杀掉这些进程似乎对网络没有影响。
我的改造方法就是先把runtime这个文件系统先重新mount成读写的,然后修改systemd程序。
wifi的功能默认也是开启的,如果不修改配置的话建议关闭web服务的启动。
经过一段时间的摸索和测试,去掉一些自带的无用程序和web启动(配置基本上都可以在后台修改,当然web前台修改也更方便),我的systemd改成了这样:
  1. #!/media/runtime/bin/python3

  2. import os, time

  3. from urllib.request import urlopen
  4. from urllib.error import *

  5. os.system('export LD_PRELOAD=/media/runtime/lib/libsigsegv.so')
  6. os.system('export RUNTIME="/media/runtime"')
  7. os.system('export FILE_SERVER="http://$STG_SVR_ADDR:$STG_SVR_PORT/files"')
  8. os.system('export BOARD_SKU="MR616-H"')

  9. os.system('export LD_LIBRARY_PATH=$RUNTIME/lib:$RUNTIME/usr/lib:$LD_LIBRARY_PATH')
  10. os.system('export PATH=$PATH:$RUNTIME/usr/bin:$RUNTIME/bin')
  11. os.system('export PYTHONPATH=$RUNTIME/lib/python3.4')
  12. os.system('export SSL_CERT_FILE=/media/runtime/etc/ssl/certs/ca-bundle.crt')

  13. os.system("ps -w | grep [p]ython3 | grep [s]marthome-web | grep -v grep | awk {'print $1'} | xargs kill")
  14. os.system("killall mrtech.smarthome.host")
  15. os.system("killall ntsclientcon_brcm_static")

  16. os.system('/tmp/media/tmp/init.sh')                      #自定义启动脚本,放在tmp区可以随时修改

  17. while True:
  18.     os.system('/tmp/media/tmp/watch.sh 2>/dev/null')    #这里可以添加需要试试处理的工作
  19.     time.sleep(5)
复制代码

可以把需要启动的程序放到/media/tmp/init.sh里,目前我的init.sh是这样的:
  1. #!/bin/sh
  2. cp /media/tmp/passwd /tmp    #这里是修改默认的账号和密码,否则连到外网被黑了可不好,如果不出网就不用改
  3. export TZ=CST-8
  4. export LD_PRELOAD=/media/runtime/lib/libsigsegv.so
  5. export RUNTIME="/media/runtime"
  6. export FILE_SERVER="http://$STG_SVR_ADDR:$STG_SVR_PORT/files"
  7. export BOARD_SKU="MR616-H"

  8. export LD_LIBRARY_PATH=$RUNTIME/lib:$RUNTIME/usr/lib:$LD_LIBRARY_PATH
  9. export PATH=$PATH:$RUNTIME/usr/bin:$RUNTIME/bin
  10. export PYTHONPATH=$RUNTIME/lib/python3.4
  11. export SSL_CERT_FILE=/media/runtime/etc/ssl/certs/ca-bundle.crt

  12. utelnetd -d -p 1123 -i lo -l /bin/login

  13. route add default gw 192.168.1.1 dev br0                #解决路由不能访问外网的问题
  14. route -A inet6 add default gw fe80::1 dev br0
  15. echo 'nameserver 8.8.8.8' > /etc/resolv.conf
  16. echo 'nameserver 192.168.1.1' >> /etc/resolv.conf   #192.168.1.1是我主路由的IP
  17. killall dnsmasq
  18. sed -i 's/192.168.1.100/192.168.1.1/g' /tmp/dnsmasq.conf
  19. /usr/sbin/dnsmasq -K -h -n -i br0 -r /tmp/resolv.conf -C /tmp/dnsmasq.conf   #解决wifi不能桥接上网的问题
  20. killall sysdog netgd

  21. mount /dev/sda1 /media/Public    #挂载SATA盘

  22. cp /media/tmp/minidlna.conf /tmp
  23. minidlnad -f /tmp/minidlna.conf -d &   #启动minidlna服务

  24. cd /media/tmp/frp_0.63.0_linux_arm  
  25. ./frpc -c frpc.toml &                           #启动内网穿透服务
复制代码

# 0x04 NAS必要的服务
systemd里不用保留什么,smb默认就是启动的,init.sh里也启动了minidlna服务,这样PC端、手机、平板和大屏电视机都可以直接访问。
但是需要注意的是smb协议只支持1.0,win10以上的操作系统需要在程序里手工添加SMB1.0和CIFS的支持。
还有就是smb服务是有MAC地址白名单的(否则找不到网络共享),建议先通过原版的web页面配置好。如果实在不想启动web进行配置,也可以直接设置nvram:
  1. nvram set smb_aclrule='11:22:33:44:55:66  11:22:33:44:55:67 ...'
复制代码
多个MAC地址中间用空格隔开,然后用reboot重启就可以生效了
反正在后台可以做的事情很多,其实能进后台基本就相当于一个openwrt了,只是没有那么多安装包软件可以用。不过自带的基本也够了,linux下常用的工具都有。

# 0x05 锦上添花
这个NAS我还想作为百度盘的下载工具和一些文件下载的工具,找了很久都没有找到类似的工具,网上下的aric2和BaiduPCS也不能运行。
没办法,只好自己手工编译一个BaiduPCS-go针对这个arm架构的特别版本。


另外还需要个类似curl的工具,方便下载文件用,curl官网提供的包也不能用,需要libc的支持,如果那样得需要重装系统,只好作罢。从github上找了个bat工具,用go重新编译可以跑,给它改了个curl的名字,方便使用。


这两个编译好的文件放附件了,如果大家有兴趣可以按我这篇文章折腾下,或者有什么问题的也可以在这里提问交流。

本帖子中包含更多资源

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

x

打赏

参与人数 1家元 +99 收起 理由
家睦 + 99

查看全部打赏

 楼主| 发表于 6 天前 | 显示全部楼层
jbm1 发表于 2025-7-20 19:03
台繁琐,还不如刷机

找不到合适的固件,总是有各种问题。能找到早就刷了
回复 支持 反对

使用道具 举报

发表于 7 天前 | 显示全部楼层
进来学习一下
回复 支持 反对

使用道具 举报

发表于 7 天前 来自手机浏览器 | 显示全部楼层
楼主太厉害了,固件都能自己写。
回复 支持 反对

使用道具 举报

发表于 7 天前 | 显示全部楼层
能编程的都是高手,我一直都弄不明白。
回复 支持 反对

使用道具 举报

发表于 7 天前 | 显示全部楼层
谢谢分享~进来学习一下
回复 支持 反对

使用道具 举报

发表于 7 天前 | 显示全部楼层
台繁琐,还不如刷机
回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-7-27 07:18 , Processed in 0.109200 second(s), 12 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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