这本是一件简单的事情,因为OpenWrt的luci界面就可以直接操作。
但让人郁闷的是,luci界面只能对一块硬盘设置超时休眠。可能是因为软路由相比专用NAS,挂载多硬盘的场景不多,一般只会连接一块下载盘,所以这项功能很弱鸡。
解决这个问题恐怕需要编写和加载正确的程序配置文件。
先来查找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-idle
其中可编辑的配置文件只有/etc/config/hd-idle和/etc/init.d/hd-idle,其他是无需编辑的配置文件(/overlay和/rom)和无法编辑的二进制文件 (/usr/bin)。配置源文件见:
修改配置文件/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上预装的这个),开发者老哥专门解释了关于日志的内容。
仅看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分钟的超时设置没有生效吗?
不管那么多了,反正“起作用”的几条标准,基本上满足了。不需要经常查看日志的话,重启即可,毕竟日志的读写也可能影响休眠状态。
0 留言