微博 微信

Hao4K影音

[其他] 分享OpenWrt的硬盘休眠经验

2021-6-18 00:11:50 348 0 回帖奖励 |倒序浏览 |阅读模式

小uu 帖主

2021-6-18 00:11:50

比来在软路由上加装了一块3.5寸的机械硬盘,算上之前已经挂载的一块仓库盘,软路由上共有两块SATA硬盘。按照插座上的功耗计显现,一块机械硬盘的运转功耗大约在5瓦左右。是以我筹算设备硬盘超时休眠来下降功耗和乐音。
这本是一件简单的工作,由于OpenWrt的luci界面便可以间接操纵。

但让人郁闷的是,luci界面只能对一块硬盘设备超时休眠。能够是由于软路由相比公用nas,挂载多硬盘的场景不多,一般只会毗连一块下载盘,所以这项功用很弱鸡。
看来需要在背景停止一些设备,大概借助第三方的磁盘治理工具了。
大多摆设在办事器真个Linux系统由于利用处景的关系,并不太需要硬盘休眠功用。而面向小我用户的众多刊行版中,可以操纵硬盘休眠的工具也不多,最多见是hd-idle,hdparm和sdparm。
OpenWrt默许工具就是hd-idle,软件仓库里也能找到hdparm,而sdparm已经被抛弃了。
opkg update

opkg install hdparm

hd-idle玲珑精悍,操纵简洁;而支持APM的hdparm在功用上似乎加倍丰富一些。固然,可以起感化,才是终极挑选的来由。
参考了很多利用教程和“troubleshooting case”后,我感觉“起感化”的标准应当以下:
1)硬盘在超时(timeout)无拜候后,会自动进入休眠状态(standby);
2)休眠硬盘在被叫醒后(active/idle),仍然可以反复进入状态1)
3)系统重启后,可以进入状态1)和2)
首先测试法式能否停止休眠操纵:
hd-idle -t sda

hdparm -y /dev/sda #留意不要输入-Y参数,是进入就寝形式(sleep),硬盘完全断电

看到功率计数字降下来5瓦;大概在luci的磁盘治理页面下,也能检察休眠状态;再大概利用S.M.A.R.T.工具。
smartctl -n standby /dev/sdx

#检察电源状态且不会叫醒休眠磁盘,输出 Device is in ACTIVE or IDLE mode 或 Device is in STANDBY mode, exit(2)

今朝大大都磁盘都能支持hd-idle和hdparm。
然后设备超时休眠:
hd-idle -i 0 -a sda -i 1200 -a sdb -i 1200 #-a参数指定硬盘称号,-i指定休眠时候秒

hdparm -S 240 /dev/sda

hdparm -S 240 /dev/sdb #1个数值对应5秒

那末题目来了~~
我测试了一段时候,不管用哪个工具,休眠设备偶然生效,偶然无效。
究其缘由,大都教程只是讲授怎样用参数号令来设备,但这是一次性操纵,休眠后再被叫醒就不起感化了;大概纯真把号令写入启动加载文件rc.local,系统重启后仍然是一次性操纵;再大概把号令写入crontab按时履行,我不肯定这么做有没有结果,但假如到了设定周期时,硬盘正在高速读写会怎样?吃着暖锅唱着歌然后忽然就被休眠了?自动休眠的初衷是有读写就工作,没读写且超时才休眠,并不是时辰预备着要休眠。
处理这个题目生怕需要编写和加载正确的法式设置文件。
先来查找hdparm的设置文件:

root@OpenWrt:~# find / -name hdparm

/overlay/upper/sbin/hdparm

/sbin/hdparm


貌似OpenWrt上安装的hdparm是个精简版,并没有默许设置文件/etc/hdparm.conf,而分歧Linux刊行版上的设置文件也不不异,重写一个似乎毫无眉目。放弃~~
再来查找hd-idle的设置文件:
root@OpenWrt:~# find / -name hd-idle

/etc/config/hd-idle

/etc/init.d/hd-idle

/overlay/upper/etc/config/hd-idle

/rom/etc/config/hd-idle

/rom/etc/init.d/hd-idle

/rom/usr/bin/hd-idle

/usr/bin/hd-idlevv

其中可编辑的设置文件只要/etc/config/hd-idle和/etc/init.d/hd-idle,其他是无需编辑的设置文件(/overlay和/rom)和没法编辑的二进制文件 (/usr/bin)。设置源文件见:
hd-idle.config
hd-idle.init
点窜设置文件/etc/config/hd-idle ,为第二块硬盘增加一个字段:
config 'hd-idle'

option 'disk' 'sda'

option 'enabled' '1' #假如是封闭状态'0',可以删去

option 'idle_time_unit' 'minutes'

option 'idle_time_interval' '20'



config 'hd-idle'

option 'disk' 'sdb'

option 'enabled' '1' #假如是封闭状态'0',可以删去

option 'idle_time_unit' 'minutes'

option 'idle_time_interval' '20'

保存后重启hd-idle:
/etc/init.d/hd-idle enable

/etc/init.d/hd-idle start


生效后可以找到相关进程:
root@OpenWrt:~# ps | grep hd-idle

28553 root 716 S /usr/bin/hd-idle -d -i 0 -a sda -i 1200 -a sdb -i 1200

28577 root 1096 S grep hd-idle


这里不由得吐槽一下,手册上讲硬盘称号也可利用symlinks,即/dev/disk/by-id/...,益处是插拔某些存储装备形成硬盘途径改变后,不会影响休眠设备。但我试过很多号令,除了能看到磁盘分区的uuid之外,没法查到块装备的id。系统也没法安装udev,只能作罢。
发现设置成功后,luci界面的“硬盘休眠”也能显现两块硬盘了。

还是原生工具给力
那末现在硬盘休眠能否满足上文的“起感化”三标准呢?虽然确切有硬盘休眠/叫醒事务,可是检察系统日志并没有响应记录,而法式号令也没有在默许目录天生日志文件
hd-idle -l /var/log/hd-idle.log


所以还是有那里差池。
留意到上文中ps | grep hd-idle的输出信息了吗?
28553 root 716 S /usr/bin/hd-idle -d -i 0 -a sda -i 1200 -a sdb -i 1200


其中的-d参数,依照手册的说明:
-d Debug mode. This will prevent hd-idle from becoming a daemon and print debugging info to stdout/stderr


调试形式会阻止hd-idle成为保护进程及标准信息输出,这应当就是日志没法天生的缘由。
找到这个参数的由来,在/etc/init.d/hd-idle设置文件中:
...

hdidle_append() {

[ "$2" = 0 ] || return



[ "$enabled" -gt 0 ] || return



if [ "$numdisks" = "0" ]; then

procd_open_instance

procd_set_param command /usr/bin/hd-idle

procd_append_param command -d -i 0

fi

procd_append_param command -a $disk

procd_append_param command -i "$(compute_seconds $idle_time_interval $idle_time_unit)"

numdisks=$(( numdisks + 1 ))


删去procd_append_param command -d -i 0中的-d,重启hd-idle后再次履行hd-idle -l /var/log/hd-idle.log。 此次可以看到进程数变多了:
root@OpenWrt:~# ps | grep hd-idle

2385 root 1096 S grep hd-idle

4014 root 716 S /usr/bin/hd-idle -i 0 -a sda -i 1800 -a sdb -i 1800

6393 root 716 S /usr/bin/hd-idle -i 0 -a sda -i 1800 -a sdb -i 1800

7610 root 716 S /usr/bin/hd-idle -i 0 -a sda -i 1800 -a sdb -i 1800

8342 root 716 S /usr/bin/hd-idle -i 0 -a sda -i 1800 -a sdb -i 1800

8669 root 716 S /usr/bin/hd-idle -i 0 -a sda -i 1800 -a sdb -i 1800

10241 root 716 S /usr/bin/hd-idle -i 0 -a sda -i 1800 -a sdb -i 1800

12490 root 720 S hd-idle -l /var/log/hd-idle.log


检察日志(日志只要在叫醒活动后才会天生,而且有一定提早):
root@OpenWrt:~# cat /var/log/hd-idle.log

date: 2021-06-17, time: 01:01:42, disk: sdc, running: 603, stopped: 2820

date: 2021-06-17, time: 08:06:43, disk: sdb, running: 600, stopped: 28324

date: 2021-06-17, time: 08:06:44, disk: sda, running: 600, stopped: 28325

date: 2021-06-17, time: 08:06:45, disk: sdc, running: 601, stopped: 24902

date: 2021-06-17, time: 08:33:47, disk: sdc, running: 782, stopped: 840

date: 2021-06-17, time: 21:32:48, disk: sdc, running: 601, stopped: 46140

date: 2021-06-17, time: 21:39:49, disk: sdb, running: 603, stopped: 48183

date: 2021-06-17, time: 21:39:50, disk: sda, running: 603, stopped: 48183

date: 2021-06-17, time: 22:03:54, disk: sdc, running: 1446, stopped: 420

date: 2021-06-17, time: 22:15:55, disk: sdb, running: 1023, stopped: 1143

date: 2021-06-17, time: 22:15:56, disk: sda, running: 1022, stopped: 1144

date: 2021-06-17, time: 22:15:57, disk: sdc, running: 601, stopped: 122


讲真这个日志我也看不大懂。Gayhub上有个项目是增强版的hd-idle(不是OpenWrt上预装的这个),开辟者老哥专门诠氏缢关于日志的内容。
How to understand logs #22
仅看sda,sdb的时候点和stopped值,可以对应上休眠时候:停止早晨08:06:44,夜间共休眠28325/60/60=7.868h,换算起头休眠时候为清晨00:14:39;停止早晨21:39:50,白天共休眠48183/60/60=13.384h,换算起头休眠时候为早晨08:16:48。连系上面的早晨日志输出时候也就是叫醒时候08:06:44,叫醒后只运转了10分钟?这就是running:600的由来?难道30分钟的超时设备没有生效吗?
不管那末多了,归正“起感化”的几条标准,根基上满足了。不需要经常检察日志的话,重启即可,究镇日志的读写也能够影响休眠状态。
原文来自张大妈 zurica
回复

使用道具 举报

   发表回复

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

返回列表 本版积分规则

  • 在线客服

  • 返回顶部