了解您的硬盘何时故障,使用 smartd
“咔嚓... 咔嚓... 咔嚓... 滴答... 滴答... 滴答... 咔嚓... 咔嚓...” 这绝对不是你想从硬盘听到的声音。这是硬盘尝试将其读/写磁头移动到它们似乎不想去的位置,或者它正在尝试读取不再存在的扇区的声音。当然,现代硬盘已经取得了长足的进步,并且非常可靠,但是如果您使用计算机足够长的时间,您肯定会遇到硬盘故障的情况。
我知道关于 smartd 的文章已经很多了,我本来不想再添油加醋,但现在就说,我写的是我了解的东西,而且最近,我开始了解很多关于硬盘驱动器故障的知识...
在您的服务器和工作站上运行 smartd 就像执行备份一样;这是您知道应该做的事情,但可能没有做,或者至少不是定期做。我希望这篇文章能帮助您相信现在是开始的时候了。
SMART,或自我监控、分析和报告技术,几乎是所有现代 IDE 和 SCSI 磁盘驱动器内置的功能,它允许驱动器控制器监控自身的健康状态。这意味着支持 SMART 的驱动器可以为您提供有关其即将发生故障的线索。您所要做的就是监听这些线索,而这正是 smartd 的用武之地。Smartd 是 smartmontools 软件包的一部分,并在您的系统上作为守护进程运行。Smartd 会定期轮询您安装的硬盘驱动器,并本质上“询问它们”它们的状况如何。Smartmontools 支持 ATA/ATAPI/SATA-3 到 -8 磁盘和 SCSI,因此 smartd 应该可以在各种驱动器上使用。
执行基本的 smartd 配置几乎非常简单。我们大多数人都在使用具有某种软件包管理功能的 Linux 发行版,因此安装 smartmontools 应该相当简单,因为该套件已针对所有主要发行版进行了打包。安装完成后,配置非常容易。该工具默认情况下会发现并扫描您系统中的所有驱动器,并且默认配置文件看起来是合理的。大多数时候,我什至懒得更改 /etc/smartd.conf 文件。只有在您需要 smartd 处理行为不端的硬件,或者您需要它执行特定的、非默认的功能时,才需要更改配置文件。最后,您必须安排您的系统在系统启动过程中启动 smartd。这部分取决于您使用的发行版。在我的 Gentoo 机器上,我使用
rc-update add smartd default 并且我就完成了。
现在套件已安装,守护进程正在运行,我们应该在我们的 syslog 中找到偶尔的日志条目。以下是我在重启 smartd 时看到的内容
Dec 1 16:50:32 localhost smartd[6219]: smartd 接收到信号 15:已终止
Dec 1 16:50:32 localhost smartd[6219]: smartd 正在退出(退出状态 0)
Dec 1 16:50:33 localhost smartd[2549]: smartd 版本 5.38 [i686-pc-linux-gnu] 版权所有 (C) 2002-8 Bruce Allen
Dec 1 16:50:33 localhost smartd[2549]: 主页是 http://smartmontools.sourceforge.net/
Dec 1 16:50:33 localhost smartd[2549]: 已打开配置文件 /etc/smartd.conf
Dec 1 16:50:33 localhost smartd[2549]: 驱动器:DEVICESCAN,在文件 /etc/smartd.conf 的第 23 行上隐含 '-a' 指令
Dec 1 16:50:33 localhost smartd[2549]: 已解析配置文件 /etc/smartd.conf,找到 DEVICESCAN,正在扫描设备
Dec 1 16:50:33 localhost smartd[2549]: 创建设备名称扫描列表时出现问题
Dec 1 16:50:33 localhost smartd[2549]: 设备:/dev/hda,已打开
Dec 1 16:50:33 localhost smartd[2549]: 设备:/dev/hda,在 smartd 数据库中找到。
Dec 1 16:50:33 localhost smartd[2549]: 设备:/dev/hda,支持 SMART。添加到“监控”列表。
Dec 1 16:50:33 localhost smartd[2549]: 设备:/dev/hdc,已打开
Dec 1 16:50:33 localhost smartd[2549]: 设备:/dev/hdc,数据包设备 [此设备 CD/DVD] 不支持 SMART
Dec 1 16:50:33 localhost smartd[2549]: 正在监控 1 个 ATA 和 0 个 SCSI 设备
Dec 1 16:50:33 localhost smartd[2573]: smartd 已 fork() 到后台模式。新 PID=2573。
Dec 1 16:50:33 localhost smartd[2573]: 文件 /var/run/smartd.pid 已写入,包含 PID 2573
这就是 smartd 成功启动的样子。如您所见,我的工作站只有一个支持 SMART 的硬盘驱动器和一个不支持 SMART 的 CD/DVD 驱动器。只要守护进程正在运行,我们就会看到日志条目,指示我的驱动器的健康状态是否发生变化。
但是我们并不总是阅读我们的日志。没关系,smartmontools 套件有一个命令行工具,您可以交互式地使用它来了解您的驱动器的健康状况。例如,我们可以使用 smartctl 来找出我们拥有的驱动器类型
# smartctl -i /dev/hda
smartctl 版本 5.38 [i686-pc-linux-gnu] 版权所有 (C) 2002-8 Bruce Allen
主页是 http://smartmontools.sourceforge.net/
=== 信息区开始 ===
型号系列:Western Digital Caviar SE 系列
设备型号:WDC WD3200JB-00KFA0
序列号:WD-WCAMR3566562
固件版本:08.05J08
用户容量:320,072,933,376 字节
设备为:在 smartctl 数据库中 [有关详细信息,请使用:-P show]
ATA 版本为:6
ATA 标准为:未指明确切的 ATA 规范草案版本
本地时间为:Mon Dec 1 16:57:28 2008 MST
SMART 支持为:可用 - 设备具有 SMART 功能。
SMART 支持为:已启用
当然,大多数这些内容实际上并不有趣,只是暴露了我的系统有多么老。(将来,我将剥离标题信息以获得进一步的输出)但是我们也可以使用 smartctl 来询问驱动器的总体健康状况
# smartctl -H /dev/hda
=== 读取 SMART 数据区开始 ===
SMART 总体健康状况自评估测试结果:通过
但是,在这一点上,我们需要讨论“总体健康状况自评估”结果为“通过”意味着什么。在实践中,我发现它实际上并没有太大意义。它告诉您的是 IDE 驱动器控制器已检测到问题。但这并不意味着不存在其他问题,只是 IDE 控制器尚未看到它们。我在一个我知道是坏的驱动器上得到了通过的结果。尽管如此,这仍然是一个有价值的检查,因为如果 IDE 控制器发现了问题,您真的需要知道它。
通过 smartctl -t short /dev/hda 命令可以获得更彻底的测试结果。正如您可能想象的那样,通过将上述命令中的“short”更改为“long”可以获得更彻底的测试结果。但是,此命令不会立即返回任何结果。它只是告诉您稍后再回来询问结果
# smartctl -t short /dev/hda
=== 离线立即和自检区开始 ===
正在发送命令:“立即在离线模式下执行 SMART 短自检例程”。
驱动器命令“立即在离线模式下执行 SMART 短自检例程”成功。
测试已开始。
请等待 2 分钟以完成测试。
测试将在 Mon Dec 1 17:15:50 2008 后完成
使用 smartctl -X 中止测试。
好吧,测试完成后,我们可以使用 smartctl -l selftest /dev/hda 命令查看结果
# smartctl -l selftest /dev/hda
=== 读取 SMART 数据区开始 ===
SMART 自检日志结构修订号 1
编号 测试_描述 状态 剩余寿命(小时) 首个错误 LBA
# 1 短时离线 已完成,无错误 00% 14942 -
在这里您可以看到我的工作站中的驱动器运行良好。但是,本着传播痛苦的精神,让我们看一下我拥有的几个状况不佳的驱动器。
这是我在我的 MythTV 服务器的日志文件中发现的一个不祥的消息
Nov 27 04:12:51 media smartd[6884]: 设备:/dev/hda,SMART 预故障属性:8 Seek_Time_Performance 从 251 更改为 252
所有这些的妙处在于,我们每天都将此服务器用作家庭服务器,并且我们没有注意到任何异常。尽管如此,驱动器说它即将发生故障。猜猜怎么着?我们将很快更换它。我可能会复制系统并在一次操作中更换驱动器,并在 30 分钟内恢复运行。
这是另一个例子。我的家庭文件服务器中的两个驱动器正在发生故障。我已经备份了它们,并且正在等待更换驱动器的到来。与此同时,这是其中一个驱动器上的短时自检结果
# smartctl -l selftest /dev/hdd
=== 读取 SMART 数据区开始 ===
SMART 自检日志结构修订号 1
编号 测试_描述 状态 剩余寿命(小时) 首个错误 LBA
# 1 短时离线 已完成:读取失败 90% 23678 200910
# 2 扩展离线 已完成:读取失败 90% 23676 200910
# 3 短时离线 已完成:读取失败 90% 23676 200910
碰巧的是,这些驱动器问题是在我注意到问题之前通过 syslog 宣布的。看一看
Nov 27 03:34:10 dominion smartd[30161]: 正在监控 4 个 ATA 和 0 个 SCSI 设备
Nov 27 03:34:11 dominion smartd[30161]: 设备:/dev/hdc,463 个当前无法读取(待处理)扇区
Nov 27 03:34:11 dominion smartd[30161]: 设备:/dev/hdc,1210 个离线无法纠正的扇区
Nov 27 03:34:11 dominion smartd[30161]: 设备:/dev/hdd,1430 个当前无法读取(待处理)扇区
Nov 27 03:34:11 dominion smartd[30161]: 设备:/dev/hdd,1429 个离线无法纠正的扇区
我一直在关注无法纠正和无法读取的扇区数量在一个月左右的时间内增加。这就是本文的重点。早在我的驱动器实际发生故障之前,我就知道它们正在发生故障。具有一两个坏扇区的驱动器可以很容易地恢复或修复。但是此驱动器不会持续很长时间。因为我使用了 smartd 并查看了我的日志,所以我能够备份我的数据,考虑我的更换选项并计划更换。我或您最不需要做的事情,就是有一天早上醒来,发现一台重要的服务器在夜间毫无预警地死机了…… 经历过。做过了。再也不想做第二次了。