猫盘折腾记:WD笔记本蓝盘的待机问题
前言:真没想到在实现硬盘待机(准确地说,是搞清楚这块硬盘的待机逻辑究竟是什么)上花了这么多的时间。本文是猫盘折腾记:Debian下的LED、风扇自动控制脚本这篇教程的番外篇,记录在硬盘待机上所花费的功夫...
工作过程
既然把猫盘定位为一个使用频率很低的轻量级NAS,那自然做就做到极致,把硬盘不工作时待机作为必须目标来实现。不为省电,只为延长硬盘使用寿命、降低设备工作温度、降低噪音、延长风扇寿命。
猫盘的刷机是照葫芦画瓢,完全按照猫盘 (ARMADA A3720) 刷机教程进行的,非常顺利,在此再次感谢原作者精准而周到的文字记录!!!
刷机成功后,从废笔记本上拆下硬盘,西数320G,WD Scorpio Blue蓝盘,具体型号是WD3200BPVT。安装进猫盘后,按照教程末尾提到的方法,修改了待机时间为10分钟,即把/etc/udev/rules.d/99-hdparm.rules
里面的hdparm -S
后面的参数改成120。
在没有精确计时的情况下,猫盘一直放置着,过了一段时间后硬盘的确是停止了工作,检测方法是用手触摸,感觉不到硬盘的转动。也可以用命令行hdparm -C /dev/sda
,输出为standby表示已经待机,如果是active/idle则表示还在工作状态。
问题
既然硬盘待机没问题,那么就开始编写我的控制脚本。第一次写Linux Shell,边学边写,大概半天时间也就搞定了。另外,为了检测硬盘温度,安装了smartmontools。脚本一开始运行的效果似乎不错,但经过仔细测试,发现在硬盘待机上存在问题:
- (1)当脚本运行时,硬盘大多数情况下不能进入standby待机状态。
- (2)如果开机后不运行脚本,等待硬盘进入待机状态,再运行脚本,并不会唤醒硬盘。
这两个现象的并存,让我几乎人格分裂。(1)会让你觉得脚本有问题,导致没有待机,(2)则证明脚本并不会操作硬盘,不会触发唤醒。
进一步搜索资料,发现有人说使用hdparm -S
设置待机等待时间的命令,必须要先使用hdparm -B 数字
来设置APM节能级别,数字大于127时不会待机。通过hdparm -B /dev/sda
我能看到当前APM数值为254,可之前硬盘明明是能待机的... 还是试试吧,于是在/etc/udev/rules.d/99-hdparm.rules
中的命令中增加了-B127
,但结果是没有看到任何变化。
在种种现象的相互矛盾、各种参数设置无法达到预计效果的情况下,不由的开始怀疑硬盘并没有按照软件预想进行工作。在搜了很多资料后,发现这一篇文章
提到,hdparm的-B、-S参数可能在西数的某些硬盘上不能按设计工作,甚至有人遇到问题的硬盘型号跟我的一模一样:
The HD claims to support APM, but settings > 128 don't disable standby as claimed, so it exhibits the cycling problem. This is a "Blue" model as follows: "Model Family: Western Digital Scorpio Blue Serial ATA (AF) Device Model: WDC WD3200BPVT-22JJ5T0"
又经过几天零零碎碎的调查、测试,得出以下结论(此处省略描写辛酸的1万字):
- 在调用smartmontools的命令smartctrl查看硬盘温度时,虽然命令本身并没有读写硬盘,但却会让Active状态的硬盘无法进入Standby状态。然而该命令却不会唤醒已经进入standby状态的硬盘。这可能是WD硬盘固件的bug。网上没有看到有人说这个,为找到脚本妨碍硬盘休眠的原因耗费大量时间。
- 为了获取硬盘温度而安装的smartmontools,会启动一个smartd服务。该服务似乎会干扰硬盘进入待机状态前的等待时间,导致即使不用脚本,仅仅在命令行调试待机控制命令,也得不到稳定的结果。找到这个干扰因素也耗费了我大量时间。
- hdparm -B和-S的参数组合,在WD某些硬盘上不能按照预期工作。这种情况下,因为难以找到逻辑规律,很难排查。
- 经过实际多轮参数组合测试(参见下面的表格),确认在我的这块硬盘上,硬盘待机的逻辑似乎是这样的:
(1) 当APM<=64时,无论-S参数为多少,无操作10秒钟左右进入待机
(2)当APM>64时,-S参数决定待机等待时间,但如果指定的待机等待时间小于10分钟,则实际为10分钟。
(3)APM>127时效果同(2),并不是网上说的不能Standby。
APM(hdparm的-B参数) | Spin down time (-S参数) | 待机等待时间 |
---|---|---|
1 | 60 | 10秒 |
1 | 120 | 10秒 |
63 | 60 | 10秒 |
64 | 60 | 10秒 |
65 | 60 | 10分钟 |
70 | 60 | 10分钟 |
90 | 60 | 10分钟 |
127 | 60 | 10分钟 |
127 | 96 | 10分钟 |
127 | 144 | 12分钟 |
127 | 180 | 15分钟 |
200 | 60 | 10分钟 |
254 | 60 | 10分钟 |
解决办法
在我的这块硬盘上,使用hdparm -B127 -S120 /dev/sda
,并且不安装smartmontools,可以按照预期,在硬盘无操作10分钟后进入待机状态。如果需要调整为等待15分钟,则-S参数设置为180,以此类推。
终极解决办法
在上面提到的那篇帖子中,提到了终极解决方法, 使用hd-idle来控制硬盘待机。其原理好像是监控/proc/diskstats
中的硬盘读写计数器,当持续不变的时间达到预设值时,就发送指令让硬盘待机。这样相当于利用操作系统的监控能力,避开了硬盘厂商五花八门的电源管理机制,理论上在任何硬盘上都能工作,的确是一个好办法。不过因为我已经把这块硬盘的待机工作机制基本研究清楚,就没有再试了。