美文网首页盒子
猫盘折腾记:WD笔记本蓝盘的待机问题

猫盘折腾记:WD笔记本蓝盘的待机问题

作者: 重案组知乎 | 来源:发表于2019-10-04 20:39 被阅读0次

    前言:真没想到在实现硬盘待机(准确地说,是搞清楚这块硬盘的待机逻辑究竟是什么)上花了这么多的时间。本文是猫盘折腾记: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中的硬盘读写计数器,当持续不变的时间达到预设值时,就发送指令让硬盘待机。这样相当于利用操作系统的监控能力,避开了硬盘厂商五花八门的电源管理机制,理论上在任何硬盘上都能工作,的确是一个好办法。不过因为我已经把这块硬盘的待机工作机制基本研究清楚,就没有再试了。

    相关文章

      网友评论

        本文标题:猫盘折腾记:WD笔记本蓝盘的待机问题

        本文链接:https://www.haomeiwen.com/subject/yugjpctx.html