使用 SMART 监控硬盘
所有硬盘最终都会坏掉,这是一个不争的事实,而且很容易理解原因。现代硬盘驱动器中的盘片每秒旋转超过一百次,在磁头和存储数据的磁介质之间保持亚微米级的公差。它们通常在布满灰尘、过热的环境中 24/7 全天候运行,在负载过重或管理不善的机器上不停地工作。因此,经验丰富的用户非常熟悉硬盘即将损坏的症状也就不足为奇了。奇怪的事情开始发生。难以理解的内核错误消息覆盖控制台,然后系统变得不稳定并锁定。通常,会浪费整天的时间重复最近的工作,重新安装操作系统并尝试恢复数据。即使您有最近的备份,突如其来的硬盘故障也是一场小灾难。
许多用户和系统管理员不知道大多数现代 ATA 和 SCSI 硬盘都内置了自我监控、分析和报告技术系统 (SMART)。SMART 硬盘驱动器在内部监控自身的健康状况和性能。在许多情况下,硬盘本身会提前发出警告,表明某些地方出了问题,从而有助于避免上述情况的发生。SMART 的大多数实现还允许用户对硬盘执行自检,并监控许多性能和可靠性属性。
我的职业是物理学家。我的研究小组运行着一个大型计算集群,拥有 300 个节点和 600 个硬盘驱动器,存储了超过 50TB 的物理数据。几年前,当我意识到 SMART 可以帮助减少停机时间并使我们的集群更可靠地运行时,我对 SMART 产生了兴趣。大约一年来,我一直在维护一个名为 smartmontools 的开源软件包,它是 UCSC smartsuite 软件包的分支,目的就是为了这个。
在本文中,我将解释如何使用 smartmontools 的 smartctl 实用程序和 smartd 守护程序来监控系统硬盘的健康状况。有关下载和安装说明,请参阅 smartmontools.sourceforge.net,并查阅 WARNINGS 文件以获取问题硬盘/控制器的列表。其他文档可以在手册页中找到(man smartctl和man smartd)以及在 Web 页面上。
smartmontools 的版本适用于 Slackware、Debian、SuSE、Mandrake、Gentoo、Conectiva 和其他 Linux 发行版。Red Hat 的现有产品包含 UCSC smartsuite 版本的 smartctl 和 smartd,但 smartmontools 版本将包含在即将发布的版本中。
要理解 smartmontools 的工作原理,了解 SMART 的历史很有帮助。最初的 SMART 规范 (SFF-8035i) 由一组硬盘驱动器制造商编写。在修订版 2(1996 年 4 月)中,硬盘保留了一个内部列表,其中包含多达 30 个属性,这些属性对应于不同的性能和可靠性指标,例如读取和寻道错误率。每个属性都有一个介于 1 到 253 之间的一个字节的标准化值和一个相应的一个字节的阈值。如果一个或多个标准化属性值小于或等于其相应的阈值,则要么预计硬盘将在 24 小时内发生故障,要么它已超过其设计或使用寿命。一些属性值会随着硬盘的运行而更新。其他属性值仅通过离线测试进行更新,这些测试会暂时降低硬盘的读取/写入速度,因此必须使用特殊命令运行。1995 年末,SFF-8035i 的部分内容被合并到 ATA-3 标准中。
从 ATA-4 标准开始,取消了硬盘维护内部属性表的要求。相反,硬盘只是对其健康状况的查询返回 OK 或 NOT OK 响应。否定响应表明硬盘固件已确定硬盘可能发生故障。ATA-5 标准在 SMART 命令集中添加了 ATA 错误日志和运行硬盘自检的命令。
要使用这些硬盘功能,您需要知道如何使用 smartmontools 来检查硬盘的属性(大多数硬盘都向后兼容 SFF-8035i),查询硬盘的健康状态,运行硬盘自检,检查硬盘的自检日志(最近 21 次自检的结果)以及检查硬盘的 ATA 错误日志(最近 5 个硬盘错误的详细信息)。尽管本文重点介绍 ATA 硬盘,但有关 SCSI 设备的更多文档可以在 smartmontools Web 页面上找到。
首先,以 root 身份给出命令smartctl -a /dev/hda,使用硬盘的正确路径。如果硬盘上未启用 SMART,您必须首先使用-s on选项启用它。然后您会看到类似于清单 1-5 中显示的输出。
输出的第一部分(清单 1)列出了有关硬盘的型号/固件信息——这是一个 IBM/Hitachi GXP-180 示例。Smartmontools 有一个硬盘类型数据库。如果您的硬盘在数据库中,它可能能够正确解释原始属性值。
清单 1. 输出smartctl -i /dev/hda
Device Model: IC35L120AVV207-0 Serial Number: VNVD02G4G3R72G Firmware Version: V24OA63A Device is: In smartctl database [for details use: -P show] ATA Version is: 6 ATA Standard is: ATA/ATAPI-6 T13 1410D revision 3a SMART support is: Available - device has SMART capability. SMART support is: Enabled
输出的第二部分(清单 2)显示了健康状态查询的结果。这是硬盘健康状况的单行执行摘要报告;此处显示的硬盘已通过。如果您的硬盘健康状态为 FAILING(失败),请立即备份您的数据。输出的其余部分提供了有关硬盘的功能以及执行短时和长时硬盘自检的估计时间的信息。
清单 2. 输出smartctl -Hc /dev/hda
SMART overall-health self-assessment test result: PASSED General SMART Values: Off-line data collection status: (0x82) Offline data collection activity was completed without error. Auto Off-line Data Collection: Enabled. Self-test execution status: ( 0) The previous self-test routine completed without error or no self-test has ever been run. Total time to complete off-line data collection: (2855) seconds. Offline data collection capabilities: (0x1b) SMART execute Offline immediate. Automatic timer ON/OFF support. Suspend Offline collection upon new command. Offline surface scan supported. Self-test supported. No Conveyance Self-test supported. No Selective Self-test supported. SMART capabilities: (0x0003) Saves SMART data before entering power-saving mode. Supports SMART auto save timer. Error logging capability: (0x01) Error logging supported. General Purpose Logging supported. Short self-test routine recommended polling time: ( 1) minutes. Extended self-test routine recommended polling time: ( 48) minutes.
输出的第三部分(清单 3)列出了硬盘的最多 30 个属性表(来自最多 255 个属性的集合)。请记住,属性不再是 ATA 标准的一部分,但大多数制造商仍然支持它们。尽管 SFF-8035i 没有定义属性的含义或解释,但许多属性都有事实上的标准解释。例如,此硬盘的第 13 个属性(ID #194)跟踪其内部温度。
清单 3. 输出smartctl -A /dev/hda
Vendor Specific SMART Attributes with Thresholds: ID# ATTRIBUTE_NAME FLAG VALUE WORST THRESH TYPE UPDATED WHEN_FAILED RAW_VALUE 1 Raw_Read_Error_Rate 0x000b 100 100 060 Pre-fail Always - 0 2 Throughput_Performance 0x0005 155 155 050 Pre-fail Offline - 225 3 Spin_Up_Time 0x0007 097 097 024 Pre-fail Always - 293 (Average 270) 4 Start_Stop_Count 0x0012 100 100 000 Old_age Always - 10 5 Reallocated_Sector_Ct 0x0033 100 100 005 Pre-fail Always - 0 7 Seek_Error_Rate 0x000b 100 100 067 Pre-fail Always - 0 8 Seek_Time_Performance 0x0005 125 125 020 Pre-fail Offline - 36 9 Power_On_Hours 0x0012 100 100 000 Old_age Always - 3548 10 Spin_Retry_Count 0x0013 100 100 060 Pre-fail Always - 0 12 Power_Cycle_Count 0x0032 100 100 000 Old_age Always - 10 192 Power-Off_Retract_Count 0x0032 100 100 050 Old_age Always - 158 193 Load_Cycle_Count 0x0012 100 100 050 Old_age Always - 158 194 Temperature_Celsius 0x0002 189 189 000 Old_age Always - 29 (Lifetime Min/Max 23/33) 196 Reallocated_Event_Count 0x0032 100 100 000 Old_age Always - 0 197 Current_Pending_Sector 0x0022 100 100 000 Old_age Always - 0 198 Offline_Uncorrectable 0x0008 100 100 000 Old_age Offline - 0 199 UDMA_CRC_Error_Count 0x000a 200 200 000 Old_age Always - 0
研究表明,将硬盘温度降低低至 5°C 可以显着降低故障率,尽管对于最新一代的流体驱动轴承驱动器来说,这已不再是一个主要问题。您可以采取的最简单且最便宜的步骤之一来确保硬盘可靠性是添加一个冷却风扇,将冷空气直接吹到系统硬盘上或吹过系统硬盘。
每个属性都有一个六字节的原始值 (RAW_VALUE) 和一个字节的标准化值 (VALUE)。在本例中,原始值存储三个温度:硬盘的摄氏温度 (29),加上其生命周期最小值 (23) 和最大值 (33)。原始数据的格式是特定于供应商的,并且未被任何标准指定。为了跟踪硬盘的可靠性,硬盘的固件将原始值转换为介于 1 到 253 之间的标准化值。如果此标准化值小于或等于阈值 (THRESH),则认为该属性已失败,如 WHEN_FAILED 列中所示。该列为空,因为这些属性中没有一个失败。还显示了最低 (WORST) 标准化值;它是自硬盘启用 SMART 以来达到的最小值。属性的 TYPE 指示属性失败是否意味着设备已达到其设计寿命 (Old_age) 或即将发生硬盘故障 (Pre-fail)。例如,硬盘启动时间(ID #3)是一个预先故障属性。如果此属性(或任何其他预先故障属性)失败,则预计硬盘将在 24 小时内发生故障。
属性的名称/含义及其原始值的解释未被任何标准指定。不同的制造商有时会将相同的属性 ID 用于不同的目的。因此,可以使用-v选项来修改特定属性的解释smartctl;请参阅手册页了解详细信息。例如,某些硬盘使用属性 9 来存储硬盘的通电时间(以分钟为单位);-v 9,minutes选项来修改特定属性的解释smartctl正确地修改了属性的解释。如果您的硬盘型号在 smartmontools 数据库中,则会自动设置这些 -v 选项。
下一个部分的smartctl -a输出(清单 4)是硬盘错误的日志。此特定硬盘没有错误,日志为空。通常,只有当硬盘错误开始大量出现时才应该担心。偶尔发生的瞬时错误通常是良性的,不会再次发生。smartmontools Web 页面上有许多smartctl -a输出示例,显示了一些说明性的错误日志条目。它们带有时间戳,指示错误发生时硬盘的通电寿命(以小时为单位),并且导致错误的各个 ATA 命令带有时间戳,指示硬盘通电后经过的时间(以毫秒为单位)。这表明错误是最近发生的还是很久以前发生的。
清单 4. 输出smartctl -l error /dev/hda
SMART Error Log Version: 1 No Errors Logged
的最后一部分smartctl输出(清单 5)是硬盘上运行的自检报告。这些报告显示了两种类型的自检,短时和长时。(ATA-6/7 硬盘也可能具有运输和选择性自检。)这些可以使用以下命令运行smartctl -t short /dev/hda和smartctl -t long /dev/hda并且不会损坏硬盘上的数据。通常,短时测试只需一两分钟即可完成,而长时测试大约需要一个小时。这些自检不会干扰硬盘的正常功能,因此这些命令可以用于运行系统上已挂载的硬盘。在我们的计算集群节点上,每周日早上都会使用 cron 作业运行一次长时自检。清单 5 中的条目都是在没有错误的情况下完成的自检;LifeTime 列显示了运行自检时硬盘的通电年龄。如果自检发现错误,则逻辑块地址 (LBA) 会显示错误在硬盘上的位置。Remaining 列显示了发现错误时自检的剩余百分比。如果您怀疑硬盘有问题,我强烈建议运行长时自检以查找问题。
清单 5. 输出smartctl -l selftest /dev/hda
SMART Self-test log, version number 1 Num Test_Description Status Remaining LifeTime(hours) LBA_of_first_error # 1 Extended off-line Completed 00% 3525 - # 2 Extended off-line Completed 00% 3357 - # 3 Short off-line Completed 00% 3059 -
该smartctl -t offline命令可用于执行离线测试。这些离线测试不会在自检日志中创建条目。它们可以追溯到 SFF-8035i 标准,并更新在正常硬盘操作下不会自动更新的属性值(请参阅清单 3 中的 UPDATED 列)。某些硬盘支持自动离线测试,可通过smartctl -o on启用,它会自动每隔几个小时运行一次离线测试。
SMART 标准提供了一种运行硬盘自检和监控硬盘性能方面的方法。它的主要缺点是它没有提供直接的机制来告知操作系统或用户是否发现了问题。事实上,由于硬盘 SMART 状态经常未被监控,因此许多硬盘问题在导致灾难性故障之前都不会被检测到。当然,您可以像我描述的那样,使用 smartctl 实用程序定期监控硬盘,但这很麻烦。
smartmontools 软件包的其余部分是 smartd 守护程序,它可以为您进行定期监控。它监控硬盘的 SMART 数据,以查找问题的迹象。它可以配置为向用户或系统管理员发送电子邮件,或者在检测到问题时运行任意脚本。默认情况下,当 smartd 启动时,它会注册系统的硬盘。然后,它每 30 分钟检查一次其状态,以查找失败的属性、失败的健康状态或增加的 ATA 错误或失败的自检次数,并将此信息记录在 SYSLOG 中,默认情况下位于 /var/log/messages 中。
您可以使用配置文件 /etc/smartd.conf 控制和微调 smartd 的行为。此文件在 smartd 启动时读取,然后它会派生到后台。每一行都包含与不同硬盘相关的指令。我们的计算集群节点上的配置文件如下所示
# /etc/smartd.conf config file /dev/hda -S on -o on -a -I 194 -m sense@phys.uwm.edu /dev/hdc -S on -o on -a -I 194 -m sense@phys.uwm.edu
第一列指示要监控的设备。-o on指令启用自动离线测试,而-S on指令启用自动属性自动保存。-m指令后跟一个电子邮件地址,警告消息将发送到该地址,并且-a指令指示 smartd 监控硬盘的所有 SMART 功能。在此配置中,smartd 记录所有标准化属性值的更改。-I 194指令表示忽略属性 #194 中的更改,因为硬盘温度经常变化,并且定期记录此类更改很烦人。
通常,smartd 由正常的 UNIX init 机制启动。例如,在 Red Hat 发行版上,/etc/rc.d/init.d/smartd start和/etc/rc.d/init.d/smartd stop可用于启动和停止守护程序。
有关 smartd 及其配置文件的更多信息,可以在手册页中找到(man smartd),摘要可以使用以下命令找到smartd -D和smartd -h。例如,-M test指令发送测试电子邮件警告消息,以确认警告电子邮件消息是否正确传递。其他指令提供了额外的灵活性,例如监控原始属性值的更改。
如果硬盘出现问题迹象,您应该怎么办?如果硬盘自检失败或硬盘的 SMART 健康状态失败怎么办?首先,尽快将您的数据从硬盘中取出并转移到另一个系统。其次,运行一些扩展硬盘自检,看看问题是否在相同的 LBA 上重复出现。如果是,则硬盘可能存在问题。如果硬盘的 SMART 健康状态失败并且在保修期内,则供应商通常会更换它。如果硬盘自检失败,许多制造商都提供专门的硬盘健康程序,例如 Maxtor 的 PowerMax 或 IBM 的 Drive Fitness Test。有时,这些程序实际上可以通过重新映射坏扇区来修复硬盘。通常,它们会报告一个特殊的错误代码,该代码可用于获得更换硬盘。
本文介绍了 smartmontools 的基础知识。要了解更多信息,请阅读手册页和 Web 页面,然后如果您需要进一步的帮助,请写信给支持邮件列表。请记住,smartmontools 不能替代备份您的数据。SMART 不能也不预测所有硬盘故障,但它通常会提供一些线索,表明某些地方出了问题,并帮助许多计算集群可靠地运行。
几位开发人员正在将 smartmontools 移植到 FreeBSD、Darwin 和 Solaris,并且我们最近添加了扩展,以允许 smartmontools 监控和控制 3ware RAID 控制器后面的 ATA 硬盘。如果您想为 smartmontools 的开发做出贡献,请写信给支持邮件列表。我们对有关特定于供应商的 SMART 属性和原始值的解释和含义的信息特别感兴趣。
Bruce Allen 是威斯康星大学 - 密尔沃基分校的物理学教授。他从事引力波和极早期宇宙的研究工作,并且他为数据分析用途构建了几个大型 Linux 集群。