如何通过解读 SMART 信息预测硬盘故障,SMART 关键指标解析

585 阅读10分钟

说明
本文介绍磁盘 S.M.A.R.T信息,在linux 上如何根据 smartctl 的输出判断磁盘是否快要损坏(即使此时smartctl 给出磁盘状态依然是 PASSED),就像window上很多软件做的那样。即如何预先判断磁盘可能失败的情况,注意此文章只针对机械硬盘。
定义
S.M.A.R.T.,全称为“Self-Monitoring Analysis and Reporting
Technology”,即“自我监测、分析及报告技术”,是一种自动的硬盘状态检测与预警系统和规范。通过在硬盘硬件内的检测指令对硬盘的硬件如磁头、盘片、马达、电路的运行情况进行监控、记录并与厂商所设定的预设安全值进行比较,若监控情况将或已超出预设安全值的安全范围,就可以通过主机的监控硬件或软件自动向用户作出警告并进行轻微的自动修复,以提前保障硬盘数据的安全。除一些出厂时间极早的硬盘外,现在大部分硬盘均配备该项技术。
问题
下面两张图分别是同一块磁盘在 windows HDtune 输出 和linux 上的 " samrtctl -x /dev/sdb" 的输出,通过对比两张图片可以发现,同一块盘,相同的S.M.A.R.T.属性值(197属性 raw value值为8),windows上HDtune 判断为警告状态,但是 Linux 上的 S.M.A.R.T 仍然为 PASSED 状态,显然 Linux 上 smartctl 工具对于磁盘的状态监控是不够敏感的。
实际上当磁盘出现一些“可以控制”错误的时候,S.M.A.R.T.并不会报告硬盘状态“FAILED”,即使是这些“可以控制”很有可能引起进一步的“不可以控制”错误,当S.M.A.R.T.报告硬盘状态“FAILED”即“不可以控制”的错误发生的时候,磁盘可能已经无法使用了。所以为了提前预计磁盘可能的失效,我们应该通过S.M.A.R.T.的输出来预计磁盘的状态,即使S.M.A.R.T.报告硬盘状态“PASSED”的值。
实际上,很多windows上的磁盘监控软件中的S.M.A.R.T.属性监控软件(例如上面的HDtune)就是这么做的,但是相关的软件却并没有Linux支持命令行输出的的版本来让程序使用,所以需要我们自行判断。
那么在 linux 上应该如何向 Windows 上的软件(如HDtune)那样根据具体的输出SAMRT数值进行可能失效的判断呢?

image.png

image.png 解决方案
资料
首先要了解 S.M.A.R.T.的各个属性值的意义,可以参照有详细的介绍:
www.cnblogs.com/york-hust/p…
但是 S.M.A.R.T.有非常多的属性,并且各个属性的意义不尽相同,并且其判断方式也不进相同,那么应该选取那几个属性值进行监控并且判断呢?
这里可以参照著名的备份厂商 backblaze 的文章中的建议
www.backblaze.com/blog/hard-d…
backblaze 建议主要监控以下五个属性的 RAW_VALUE 的值:
SMART 5 – Reallocated Sectors Count( 重映射扇区计数,数据应为0,当前值应远大于临界值。
当硬盘的某扇区持续出现读/写/校验错误时,硬盘固件程序会将这个扇区的物理地址加入缺陷表(G-list),将该地址重新定向到预先保留的备用扇区并将其中的数据一并转移,这就称为重映射。执行重映射操作后的硬盘在Windows常规检测中是无法发现不良扇区的,因其地址已被指向备用扇区,这等于屏蔽了不良扇区。 
这项参数的数据值直接表示已经被重映射扇区的数量,当前值则随着数据值的增加而持续下降。当发现此项的数据值不为零时,要密切注意其发展趋势,若能长期保持稳定,则硬盘还可以正常运行;若数据值不断上升,说明不良扇区不断增加,硬盘已处于不稳定状态,应当考虑更换了。如果当前值接近或已到达临界值(此时的数据值并不一定很大,因为不同硬盘保留的备用扇区数并不相同),表示缺陷表已满或备用扇区已用尽,已经失去了重映射功能,再出现不良扇区就会显现出来并直接导致数据丢失。 
这一项不仅是硬盘的寿命关键参数,而且重映射扇区的数量也直接影响硬盘的性能,例如某些硬盘会出现数据量很大,但当前值下降不明显的情况,这种硬盘尽管还可正常运行,但也不宜继续使用。因为备用扇区都是位于磁盘尾部(靠近盘片轴心处),大量的使用备用扇区会使寻道时间增加,硬盘性能明显下降。 
这个参数在机械硬盘上是非常敏感的,而对于固态硬盘来说同样具有重要意义。闪存的寿命是正态分布的,例如说MLC能写入一万次以上,实际上说的是写入一万次之前不会发生“批量损坏”,但某些单元可能写入几十次就损坏了。换言之,机械硬盘的盘片不会因读写而损坏,出现不良扇区大多与工艺质量相关,而闪存的读写次数则是有限的,因而损坏是正常的。所以固态硬盘在制造时也保留了一定的空间,当某个存储单元出现问题后即把损坏的部分隔离,用好的部分来顶替。这一替换方法和机械硬盘的扇区重映射是一个道理,只不过机械硬盘正常时极少有重映射操作,而对于固态硬盘是经常性的。 
在固态硬盘中这一项的数据会随着使用而不断增长,只要增长的速度保持稳定就可以。通常情况下,数据值=100-(100×被替换块/必需块总数),因此也可以估算出硬盘的剩余寿命。 
Intel固态硬盘型号的第十二个字母表示了两种规格,该字母为1表示第一代的50纳米技术的SSD,为2表示第二代的34纳米技术的SSD,如SSDSA2M160G2GN就表示是34nm的SSD。所以参数的查看也有两种情况: 
50nm的SSD(一代)要看当前值。这个值初始是100,当出现替换块的时候这个值并不会立即变化,一直到已替换四个块时这个值变为1,之后每增加四个块当前值就+1。也就是100对应0~3个块,1对应4~7个块,2对应8~11个块…… 
34nm的SSD(二代)直接查看数据值,数据值直接表示有多少个被替换的块。)
SMART 187 – Reported_Uncorrectable_Errors.(无法校正的错误 ,报告给操作系统的无法通过硬件ECC校正的错误。如果数据值不为零,就应该备份硬盘上的数据了。 报告给操作系统的在所有存取命令中出现的无法校正的RAISE(URAISE)错误。)
SMART 188 –  Command_Timeout.(命令超时,由于硬盘超时导致操作终止的次数。通常数据值应为0,如果远大于零,最有可能出现的是电源供电问题或者数据线氧化致使接触不良,也可能是硬盘出现严重问题。)
SMART 197 –  Current_Pending_Sector_Count.(当前待映射扇区计数,数据应为0,当前值应远大于临界值。这个参数的数据表示了“不稳定的”扇区数,即等待被映射的扇区(也称“被挂起的扇区”)数量。如果不稳定的扇区随后被读写成功,该扇区就不再列入等待范围,数据值就会下降。 仅仅读取时出错的扇区并不会导致重映射,只是被列入“等待”,也许以后读取就没有问题,所以只有在写入失败时才会发生重映射。下次对该扇区写入时如果继续出错,就会产生一次重映射操作,此时重映射扇区计数(05)与重映射事件计数(C4)的数据值增加,此参数的数据值下降。)
SMART 198 –  Offline_Uncorrectable.(脱机无法校正的扇区计数,数据应为0,当前值应远大于临界值。这个参数的数据累计了读写扇区时发生的无法校正的错误总数。数据值上升表明盘片表面介质或机械子系统出现问题,有些扇区肯定已经不能读取,如果有文件正在使用这些扇区,操作系统会返回读盘错误的信息。下一次写操作时会对该扇区执行重映射。)
如果发现该五项值中有大于0的情况,就说明该磁盘应该对它进行持续的关注了,因为根据其经验这5项S.M.A.R.T.指标的增长表明即将发生磁盘驱动器故障。
那么通过这5项属性,可以有多大把握预测到磁盘失效呢?
根据其文章:
www.backblaze.com/blog/what-s…

image.png 其运营的磁盘中有 4.2%的磁盘会出现上述5个 S.M.A.R.T. RAW_VALUE大于零的情况,并且其中有 76.7%的磁盘在之后真的出现了故障。当然还有23.3%的磁盘的故障无法通过这5个指标提前预测到。
实际上值得关注的参数还有一个即
SMART 10 Spin_Retry_Count(主轴起旋重试次数 ,数据应为0,当前值应大于临界值。主轴起旋重试次数的数据值就是主轴电机尝试重新启动的计数,即主轴电机启动后在规定的时间里未能成功达到额定转速而尝试再次启动的次数。数据量的增加表示电机驱动电路或是机械子系统出现问题,整机供电不足也会导致这一问题。)
据称此值的增加可能导致磁盘在短时间内失效,但是时十分罕见的一种错误
可见下文中的评论区:
www.backblaze.com/blog/what-s…

image.png 结论
根据上文在Linux上,通过smartcl 命令输出中这五项指标(也可以再添加一个SMART 10 Spin_Retry_Count) :
SMART 5 – Reallocated_Sector_Count.
SMART 187 – Reported_Uncorrectable_Errors.
SMART 188 – Command_Timeout.
SMART 197 – Current_Pending_Sector_Count.
SMART 198 – Offline_Uncorrectable.
RAW_VALUE的值大于零为依据,即可以有7成的机率提前预测磁盘的失效。但是这些属性的RAW_VALUE值
出现了大于零的数值,并不代表这些盘一定会损坏,有可能磁盘已经自动修复了这些错误。所以这些值可以作为判断的依据,是否要更换磁盘还需要将管理员自行判断。

举例:从下面一个smart信息可以看到,扇区相关的错误统计值都为0,但是Command_Timeout这项值远大于0,说明磁盘处理io已经出现多次错误,虽然没有介质错误,但是也必须进行换盘处理

image.png