SMART-Test 永远不会结束

bot*_*t47 20 hard-drive maintenance smart

使用 smartmontools 运行 SMART-Tests 时,它们永远不会完成。我总是在各种不同的系统和磁盘上遇到“中断(主机重置。)”,包括 x86 和 ARM 中的 Debian、x64 上的 OS X,以及外部和内部驱动器。即使在磁盘全部为空的俘虏模式下运行(用 dd 清零)。

我究竟做错了什么?

小智 15

当驱动器在测试期间不处理任何输入/输出活动时,它可能会进入待机状态,从而引发这种Interrupted (host reset)情况。尝试以合适的时间间隔从磁盘读取:

while true; do dd if=/dev/disk1 of=/dev/null count=1; sleep 60; done
Run Code Online (Sandbox Code Playgroud)

(替换/dev/disk1为适当的设备;每 60 秒从该设备读取一个扇区,直到您点击ctrl-c

这对我的环境有帮助:OS X 10.6.8、WD Elements USB 连接驱动器、SAT-SMART-driver 0.8。

强制测试理论上应该保持驱动器在线。然而,smartctl在测试完成之前发送的硬件命令可能会超时,导致内核重置链接并最终出现与上述相同的情况(错误 #303)。

有关更多详细信息,请参阅smartmontools-support 邮件列表上的此线程。我感谢 Christian Franke 在这里给出的洞察力。


小智 11

Ari 的答案的一个变体是使用watch,因为smartctl输出实际上对于跟踪状态可能很有趣:

sudo watch -d -n 60 smartctl -a /dev/sdx
Run Code Online (Sandbox Code Playgroud)

这将每 60 秒自动更新一次输出smartctl -a,因此您可以看到还剩多少自检时间,并突出显示更改(因此更容易发现测试确实正在进行)。


Ari*_*Ari 5

我尝试了 Tobu 的解决方案,在我的情况下,在开始测试并中断它之后的某个时间,我一直在睡眠模式下找到外部 USB 驱动器,似乎 dd 最终从内核缓存中读取,并且缓存对于磁盘来说足够大进入睡眠模式。我注意到调用 smartctl 来询问状态总是能够“唤醒”磁盘。所以:这个想法的这个版本对我有用:

sudo bash -c 'while true; do smartctl -a /dev/sdb > /dev/null; sleep 60; done'
Run Code Online (Sandbox Code Playgroud)

5 小时后,外部 USB 磁盘仍在旋转。我第一次可以在外部磁盘中看到 smartctl 长测试完成。

我相信这个解决方案还有一个优点,即磁盘磁头不会每分钟都不必要地移动。长时间运行几乎完全在预测的时间内完成(保持唤醒脚本没有为运行增加时间)