本文主要是介绍猫盘onespace x3p系统使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
前言
猫盘用了大概快一年了,主要的使用的功能以及最长用的功能就是samba服务,当做家庭的影音存储中心,其他的nas相关下载,同步等等功能用的极少。
故最终的需求就是,将猫盘做成一个纯净版的samba服务器,其他不常用的功能全部关闭掉。同时要能够使硬盘进行休眠,一个是减少不必要的噪音,机械硬盘的声音还是挺大的;二个是减少硬盘的消耗,没有数据读取的时候硬盘进入休眠状态。
使用猫盘原版系统发现是系统是无法休眠的,强制将硬盘进入休眠状态后,一段时间硬盘又会自己启动,推测应该是在跟猫盘的服务器同步信息,造成硬盘无法休眠。各种百度之后,都没找到好的解决方案。剩下就一条路,刷机。刷成x3p系统,刷机过程在此不表。
最终效果展示
默认只开启samba服务。
为了偶尔非局域网操作,故添加了易有云服务组件,默认也是设置为关闭状态。
设置硬盘休眠
1、使用ssh登录到猫盘,采用root权限登录,默认为root,密码:Etech12。登录之后如果发现修改某些文件没有权限。可在要操作的目录下执行如下命令。该问题也是百度了好久才找到的解决办法。因为后面要调整哪些应用要默认开机启动,故需要修改系统的文件。
mount -o remount,rw /
2、通过浏览器登录到猫盘,在系统管理里将设置硬盘休眠时间。为了测试硬盘休眠效果,可以先将其设置为10分钟。
3、硬盘休眠相关操作命令
hdparm软件可以实现硬盘状态设置,状态查询
查看是否安装了hdparm,x3p系统是默认安装了
[root@onespace ~]# hdparm -V
hdparm v9.50
查看硬盘当前状态,如果是standby,则硬盘处于休眠状态
[root@onespace ~]# hdparm -C /dev/sda1/dev/sda1:drive state is: active/idle
让硬盘立刻进入休眠状态命令,此时如果查询硬盘状态,返回的应该是standby。休眠的时候硬盘只是停转,并不会断电,不会造成硬盘磁头频繁抬起放下,损伤硬盘。
[root@onespace ~]# hdparm -Y /dev/sda1/dev/sda1:issuing sleep command
设置硬盘无操作进入休眠的时间
[root@onespace ~]# hdparm -S 60 /dev/sda1/dev/sda1:setting standby to 60 (5 minutes)
这个数值设置为0则关闭这个功能,设置为1至240时,时间将为5秒的倍数,即5秒至20分钟,设置为241至251时,时间将为30分钟的1-11倍,即30分钟到5.5小时,设置为252象征着21分钟,253为?(不懂),255即为21分15秒。
如果不想用x3p自带的设置工具,只需要写一个bash启动脚本,放到/etc/init.d/文件家中,文件名要以大写S开头,然后chmod +x 可执行权限,每次开机运行一次即可。
4、测试休眠
注意事项:关闭掉所有上传下载的任务,关闭掉ssh登录,断开电脑映射的samba文件夹。一定要关闭所有与猫盘有通信的任务。
10分钟后,可以听到硬盘噪音没了,手接触硬盘也没有了微小的震动感,则硬盘休眠成功。
添加易有云服务
1、app启动流程说明
经过分析系统文件夹,发现,系统所有的启动脚本都是放在/etc/init.d/目录下面
系统首先会执行rcS文件,rcS文件会索引当前目录下以大写S开头的文件,然后一个一个执行。
以S88Shell为例
#!/bin/shexport PATH=/bin:/sbin:/usr/bin:/usr/sbincase "$1" instart)pidof shellinaboxdif [ $? -eq 0 ] ; thenecho "Start Shell Abort, already running"exitfiif [ -f /sata/.storage/appblock/shellinabox ] ; thenecho "Start ShellinAbox Abort, User Disabled"exitfishellinaboxd -b -t -s /:SSH:127.0.0.1echo "done.";;stop)killall shellinaboxdi=0while [ 1 ] ; dopidof shellinaboxdif [ $? -ne 0 -o $i -gt 10 ] ; thenbreakfiecho "sleep 1, wait"sleep 1((i++))doneecho "done.";;restart)$0 stop$0 start;;*)echo "Usage: /etc/init.d/S88shell {start|stop|restart}";;
esac
脚本里面定义了3个函数,sart,stop,restart。rcS脚本里面就是通过执行各个脚本的start函数来启动程序。
在start文件中会判断/sata/.storage/appblock/shellinabox 是否存在,如果存在,则脚本退出,不启动程序,如果不存在就启动。
说明启动脚本会根据shellinabox文件来启动shell程序。
通过分析文件夹名称也可以知道个大概,所有不需要开启自启的程序都会在appblock文件夹下面生成一个对应文件。那么问题来了,是什么程序来负责生成这些文件呢。
2、设置开机禁止运行服务
通过继续分析系统文件,发现了S23init脚本,init说明是在进行一些系统初始化操作。打开该文件
#!/bin/shif [ X$1 = "Xstop" ]; thenkillall hd_fan.shexit
fi#mount -o remount,rw //opt/bin/hd_fan.sh &mountpoint -q /sata
if [ $? -ne 0 ] ; thentouch /tmp/nosata.flagexit 0
fiecho "------- remunt to rw for S23 --------"
mount -o remount,rw /mkdir -p /sata/.storage
mkdir -p /sata/.storage/etc
if [ ! -d /sata/.storage/appblock ] ; thenmkdir -p /sata/.storage/appblocktouch /sata/.storage/appblock/aria2touch /sata/.storage/appblock/thundertouch /sata/.storage/appblock/transmissiontouch /sata/.storage/appblock/nfstouch /sata/.storage/appblock/rsynctouch /sata/.storage/appblock/minidlnatouch /sata/.storage/appblock/proftptouch /sata/.storage/appblock/phptouch /sata/.storage/appblock/shellinaboxtouch /sata/.storage/appblock/cupstouch /sata/.storage/appblock/linkeasetouch /sata/.storage/appblock/afpd
fimkdir -p /sata/home
chmod 755 /sata/homemkdir -p /sata/public
chmod 777 /sata/publicmkdir -p /sata/public/.recycle
chmod 777 /sata/public/.recycle
chown admin /sata/public/.recyclemkdir -p /sata/public/WWW
chmod 777 /sata/public/WWW
chown admin /sata/public/WWWmkdir -p /sata/.storage/mysql
chmod 777 /sata/.storage/mysqlmkdir -p /sata/.storage/tmp
chmod 777 /sata/.storage/tmp
rm -rf /sata/.storage/tmp/*mkdir -p /sata/public/USBDISK
chmod 755 /sata/public/USBDISK
chown admin /sata/public/USBDISK
rm -rf /sata/public/USBDISK/*if [ ! -e /sata/.storage/etc/passwd ] ; thencp -f /etc/passwd /sata/.storage/etc/cp -f /etc/group /sata/.storage/etc/cp -f /etc/shadow /sata/.storage/etc/cp -f /etc/samba/smbpasswd /sata/.storage/etc/cp -f /opt/rsync/rsyncd.secrets /sata/.storage/etc/
ficheck_file()
{file=$1grep -q admin ${file}if [ $? -ne 0 ]; then grep -q default ${file}if [ $? -ne 0 ]; thenecho 1 # not passelseecho 0 # passfielseecho 0 # passfi
}if [ -e /sata/one2017.flag ] ; thenresult=`check_file '/sata/.storage/etc/passwd'`diff -q /etc/passwd /sata/.storage/etc/passwdif [[ $? -ne 0 && $result -ne 1 ]] ; thencp -f /sata/.storage/etc/passwd /etc/passwdchmod 644 /etc/passwdfiresult=`check_file '/sata/.storage/etc/group'`diff -q /etc/group /sata/.storage/etc/groupif [[ $? -ne 0 && $result -ne 1 ]] ; thencp -f /sata/.storage/etc/group /etc/groupchmod 644 /etc/groupfiresult=`check_file '/sata/.storage/etc/shadow'`diff -q /sata/.storage/etc/shadow /etc/shadowif [[ $? -ne 0 && $result -ne 1 ]] ; thencp -f /sata/.storage/etc/shadow /etc/shadowchmod 600 /etc/shadowfi
else
确实是会创建appblock文件夹及下面的文件。所以不需要不需要启动只需要在里面添加要创建的文件。
if [ ! -d /sata/.storage/appblock ] ; thenmkdir -p /sata/.storage/appblocktouch /sata/.storage/appblock/aria2touch /sata/.storage/appblock/thundertouch /sata/.storage/appblock/transmissiontouch /sata/.storage/appblock/nfstouch /sata/.storage/appblock/rsynctouch /sata/.storage/appblock/minidlnatouch /sata/.storage/appblock/proftptouch /sata/.storage/appblock/phptouch /sata/.storage/appblock/shellinaboxtouch /sata/.storage/appblock/cupstouch /sata/.storage/appblock/linkeasetouch /sata/.storage/appblock/afpd
fi
笔者已经将其他不需要启动的文件都添加进来了,修改重启系统后,发现没有生效。原因是,脚本会先判断appblock文件夹是否存在,如果文件夹不存在,则创建;如果存在就不会往文件夹里面写文件。
故添加不需要启动的服务后,要将硬盘中的appblock文件夹删除掉。
删除后,重启系统,正常了,在应用管理里面可以看到只有samba服务在运行。
3、添加易有云服务
3.1下载安装
下载易友云https://www.ddnsto.com/linkease/download/#/disk。下载对应的版本,由于没有对应的onespace版本,故下载linux通用版,linkease.arm文件。
为了方便查找,笔者将其放置到home目录下
记得chomod +x 添加可执行权限。./linkease.arm
[root@onespace home]# ./linkease.arm
15:37:34 WARNING: device binding
15:37:34 WARNING: save preconfig failed, err= open /home/preconfig.data: read-only file system
15:37:34 WARNING: branch= other log= /tmp/logs178097771/LinkEase.log serial= ST-other-6DBC0973 rootDir= /sata/share
15:37:34 WARNING: Device 6DBC0973 Port 8897 Version 0.3.60 BuildVersion 660eb113f93f3bacf0a96fe9a88b7c5983a7a888 BuildDate .20210520.022302
访问ip:8897进行访问易有云,具体绑定操作见易有云官网。
3.2创建启动脚本
在/etc/init.d/文件夹中,创建S96linkease文件,名称要以大写S开头。
参照shell脚本写入如下内容,通过判断appblock/linkease文件来启动服务。脚本要加可执行权限。
#!/bin/shexport PATH=/bin:/sbin:/usr/bin:/usr/sbincase "$1" instart)pidof linkease.armif [ $? -eq 0 ] ; thenecho "Start linkease Abort, already running"exitfiif [ -f /sata/.storage/appblock/linkease ] ; thenecho "Start linkease Abort, User Disabled"exitfi/home/linkease.arm & echo "done.";;stop)killall linkease.armecho "done.";;restart)$0 stop$0 start;;*)echo "Usage: /etc/init.d/S93linkease {start|stop|restart}";;
esac
3.3添加易有云到应用管理。
再次分析系统文件,发现在/opt/www有一个www的文件夹。在www文件夹下面有一个app文件夹。发现其中有如下文件,看到了熟悉samba shell 文件夹
打开shell文件夹发现里面有如下四个文件
将该目录下载到本地,发现app.png 就是应用管理里面的shell图标
依次开打开下其他文件
conf.js
{"pack": "shell","ver": "2.19","verno": 21900,"name": "SHELL","logo": "app.png","url": "/shell/","canstat": true,"canoff": true,"candel": false
}
可以看到里面配置的版本号就是应用管理里面的shell的版本号。
off.sh
#!/bin/shexport PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/bin/X11:/usr/local/bin/etc/init.d/S88shell stopif [ $# -eq 0 ] ; thentouch /sata/.storage/appblock/shellinabox
fi
on.sh
#!/bin/shexport PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/bin/X11:/usr/local/binrm -f /sata/.storage/appblock/shellinabox
/etc/init.d/S88shell start
stat.sh
#!/bin/shexport PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/bin/X11:/usr/local/binpidof shellinaboxd > /dev/nullif [ $? -ne 0 ] ; thenecho -n "off"
elseecho -n "on"
fi
通过分析这个内容,发下这三个脚本就是,启动shell 关闭shell 查询shell运行状态的脚本。再结合app文件夹下的文件目录,与应用管理里面的任务是对应的。
由此可以说明,只需要按照app里面文件夹的格式,新建一个文件夹,该内容将会呈现在应用管理里面。笔者已经通过测试,发现确实如此。
接下来就好说了,只要将shell文件夹下面的文件的内容替换为linkease的,就可以实现在应用管理里面显示。
在app目录下面新建一个linkease文件,放入linkease logopng文件,再在对应的文件写入如下内容。
#conf.js
{"pack": "linkease","ver": "0.3.6","verno": 36000,"name": "linkease","logo": "app.png","url": "","canstat": true,"canoff": true,"candel": false
}#on.sh
#!/bin/shexport PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/bin/X11:/usr/local/binrm -rf /sata/.storage/appblock/linkease
/etc/init.d/S96linkease start#off.sh
#!/bin/shexport PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/bin/X11:/usr/local/bin/etc/init.d/S96linkease stopif [ $# -eq 0 ] ; thentouch /sata/.storage/appblock/linkeasefi#stat.sh
#!/bin/shexport PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/bin/X11:/usr/local/binpidof linkease.arm > /dev/nullif [ $? -ne 0 ] ; thenecho -n "off"
elseecho -n "on"
fi
完成后,所有文件要加权限,chmod 755 。完成后,重启系统,即可在应用管理里面发现了linkease服务
至此,添加linkease服务完成,后续要添加其他的功能也可依据此方法操作。
备注:
1、推荐用FinalShell程序进行ssh操作,非常方便进行文件上传下载
2021-7-29硬盘休眠设置更新
经过测试发现如下命令是不起作用的,硬盘到了设定的时间后完全没反应,不会进入standby状态。经过多次测试均是如此
hdparm -S 60 /dev/sda1
硬盘休眠之路只能另求他法。于是开始寻找系统自带的休眠脚本,经过一番努力,发现休眠脚本位于
/opt/standby/
目录下,里面有start stop spindown等三个脚本
其中最主要的是spindown脚本,发现该脚本存在问题。那就是。
当设置的硬盘休眠时间到了,脚本会不管当前硬盘是否在读写,都会强制将硬盘设置为休眠状态。原因是,脚本用于判断判断硬盘状态的命令是错的。
其采用了 如下命令,该命令返回的只有两种状态
1、standby
2、active/idle
[root@onespace standby]# hdparm -C /dev/sda1/dev/sda1:drive state is: standby无法判断硬盘当前是否在读写。原版的spindown脚本如下```bash
#Logging enable set to true (/var/log/diskstate.log)
echo 1 > /proc/sys/vm/block_dump
# Where is your Ramdrive?
# Check it out with df -h or mount command.
# Possible Values Examples: /dev/shm , /run/shm
mkdir -p /tmp/shm
ramdrive=/tmp/shm# Cyle time between checks, normally between 60 up to 300 Seconds. Protect the CPU/BUS Load.
time_cyle=60
time_spindown=$1# The Spindwon Time in Seconds for the harddisk drives, less then the time_cyle will only act on time_cyle.
# 300=5min, 600=10min, 900=15min, 1200=20min etc ..
time_disk_a=$time_spindown
time_disk_b=$time_spindown
time_disk_c=$time_spindown
time_disk_d=$time_spindown
time_disk_e=$time_spindown
time_disk_f=$time_spindown
time_disk_g=$time_spindown
time_disk_h=$time_spindown
time_disk_i=$time_spindown
time_disk_j=$time_spindown
time_disk_k=$time_spindown# Wich harddisk drives are handled to spindown
# No changes required, but if you need/like you can change.
#diskvolumes_spindown="a b c d e f g h i j k"
diskvolumes_spindown="a b c d e f g h i j k"# Wich harddisk drives are handled to send the apm = 255 command. (Disble AutoPowerManager in Firmware of the given Drives)
# No changes required, but if you need/like you can change.
#diskvolumes_apm_off="a b c d e f g h i j k"
diskvolumes_apm_off="a b c d e f g h i j k"# Drives exist?
for disk in $diskvolumes_spindown; do hdparm -B /dev/sd$disk >/dev/null 2>&1; test $? = 0 && drives_spindown=$(printf "$drives_spindown"; printf $disk" "); done#apm off
for disk in $diskvolumes_apm_off; do hdparm -B /dev/sd$disk >/dev/null 2>&1; test $? = 0 && hdparm -B 255 /dev/sd$disk; done # Set ones on start time variable time_noise_$(disk), like noise from harddrive
for disk in $diskvolumes_spindown; do eval time_noise_${disk}=$(date +"%s"); donefor disk in $diskvolumes_spindown; do eval spindown_flag_${disk}=false; done# Build onece the tempfiles
if [ ! -f $ramdrive/diskstate1 ]; then touch $ramdrive/diskstate1;fi
if [ ! -f $ramdrive/diskstate2 ]; then touch $ramdrive/diskstate2;fi# Here we go...
while [ true ] ; do# cycle it to test for activity mv $ramdrive/diskstate1 $ramdrive/diskstate2 cat /proc/diskstats > $ramdrive/diskstate1# Loop through all array disks and spin down idle disks. for disk in $drives_spindown; dodiskstat1=`grep sd$disk $ramdrive/diskstate1`diskstat2=`grep sd$disk $ramdrive/diskstate2`#if [ "$(diff $ramdrive/diskstate1 $ramdrive/diskstate2 | grep sd$disk )" = "" ]; thenif [ X"$diskstat1" = X"$diskstat2" ]; thentime_silent=$(date +"%s")time_noise=$(eval echo \${time_noise_${disk}})time_disk=$(eval echo \${time_disk_${disk}})time_idle=$(($time_silent - $time_noise))if [ $time_idle -ge $time_disk ]; then STATUS0=`hdparm -C /dev/sd$disk | sed -n '3p' | awk '{print $4}'`if [ X"$STATUS0" != "Xstandby" ];thenspindown_flag=$(eval echo \${spindown_flag_${disk}})if [ $spindown_flag = true ];thenecho `date` "/dev/sd$disk was activated" >> /tmp/nginx/error.log/opt/bin/udp_send 127.0.0.1 81 '{"level":"info", "type":"system", "user":"system", "action":"wakeup", "content":{} }'eval spindown_flag_${disk}=falseeval time_noise_${disk}=$(date +"%s")elseecho `date` "set /dev/sd$disk standby" >> /tmp/nginx/error.log
# /opt/bin/udp_send 127.0.0.1 81 '{"level":"info", "type":"system", "user":"system", "action":"sleep", "content":{} }'
# sleep 2synchdparm -Y /dev/sd$disk >/dev/null 2>&1;eval spindown_flag_${disk}=true fififielseeval time_noise_${disk}=$(date +"%s")spindown_flag=$(eval echo \${spindown_flag_${disk}})if [ $spindown_flag = true ];thenecho `date` "/dev/sd$disk was activated 1" >> /tmp/nginx/error.log/opt/bin/udp_send 127.0.0.1 81 '{"level":"info", "type":"system", "user":"system", "action":"wakeup", "content":{} }'eval spindown_flag_${disk}=falsefifidone # Cycle Waitsleep $time_cyle
done
而且该脚本写的太复杂了,而且逻辑不清楚,于是修改如下:
#!/bin/shrm -rf /tmp/spindown.log
oldstate=''
n=`expr $1 '*' 6`
n1=$n
echo "n is " $n
while :; do
#!/bin/sh #!/bin/sh rm -rf /tmp/spindown.log
oldstate=''
n=`expr $1 '*' 6`
n1=$n
echo "n is " $n
while :; donewstate=$(grep "sda1" /proc/diskstats) echo date $newstate >> /tmp/spindown.logif [ "$newstate" = "$oldstate" ]; thenn1=$(($n1 - 1))
# [ "$n" != 0 ] || hdparm -y /dev/"$1"if [ "$n1" == 0 ]; thenhdparm -Y /dev/sda1echo "set hd standby ! sleep param is " $1 "minutes; n:" $n1 >> /tmp/spindown.logfielsen1="$n"oldstate=$newstatefistate=`hdparm -C /dev/sda1 | sed -n '3p' | awk '{print $4}'`if [ "$state" != "standby" ]; thenecho `date` "hd is actived ! sleep param is " $1 "minutes; n:" $n1 >> /tmp/spindown.logelsen1="$n"echo `date` "hd is sleep ! sleep param is " $1 "minutes; n:" $n1 >> /tmp/spindown.logfilogsize=`ls -l /tmp/spindown.log | awk '{print $5}'`if [ $logsize -ge 100000 ]; thenrm -rf /tmp/spindown.logfisleep 10
done
运行逻辑说明:
1、通过判断硬盘的读取状态来确定硬盘是否处于空闲状态
2、只有硬盘持续空闲时间到了设定睡眠时间,才会将硬盘置为休眠状态、
这篇关于猫盘onespace x3p系统使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!