PCEVA,PC绝对领域,探寻真正的电脑知识
开启左侧

SMART数据结构入门

[复制链接]
nighttob 发表于 2016-2-13 19:33 | 显示全部楼层 |阅读模式
点击数:13126|回复数:23
本帖最后由 nighttob 于 2016-2-13 20:16 编辑

SMART,也就是Self-Monitoring, Analysis, and Reporting Technology,一般玩家对它的理解就是CDI或者HD Tune这类工具对一块磁盘状态信息的报告。在最必要限度内这么理解没问题,但是现在的工具软件都很傻瓜化,用户门槛也很低,这也就造成绝大多数人根本看不懂SMART报告的意思。

这里就仅针对我们经常接触到的部分做一个入门讲解。

CDI截图中红框部分也就是SMART区域,每一行都是一个SMART属性,一个ATA设备最多有30个SMART属性,上面“主机写入”、“主机读取”、“通电次数”和“通电时间”的数据就是从SMART属性中取得的。

但SMART的数据结构并不像软件显示的这样简单。如果有人点过CDI“编辑”菜单里的“复制选项”的话,就会发现里面有两个跟SMART有关的复选,分别是“SMART_READ_DATA”和“SMART_READ_THRESHOLD”。是的,SMART中的“阈值/Threshold”和其他数据是分开的,二者通过ID对应起来。每个SMART属性长12字节,并缀有2字节的版本信息,位于“SMART_READ_DATA”和“SMART_READ_THRESHOLD”的前362字节内。


上面红框圈出来的位置就是SMART属性的原始数据。因为Intel 730只有25个SMART属性,所以有60字节的占位0。每个属性的起始位有蓝色下划线。

在“SMART_READ_DATA”的一个SMART属性的12个字节中,第1个字节是“ID”,也就是CDI里面第一列的“ID”;第2-3个字节是“Flag/标记”,表示这个属性的性质;第4个字节是“当前值/Current value/Normalized”;第5个字节是“最差值/Worst value”;第6-11字节是“原始值/Raw data”;第12字节保留。“SMART_READ_THRESHOLD”就只有第1个字节的“ID”和第2个字节的“阈值/Threshold”,剩余10字节都是保留。这里面需要细说的就是“Flag/标记”,因为这个值极少出现,但却是一个SMART属性有没有用的关键。一个一个来说:

第1个字节“ID”,代表这个SMART属性的定义内容。0是无效值,其余都是有效值。比如我们看到05h就知道是重映射扇区数,09h就是通电时间。注意只有少部分ID是“国际统一”的,绝对不要把厂家A的定义内容硬搬到厂家B的产品上,甚至同厂家不同方案的产品都不一样。较为严谨的SMART工具在处理不明定义的ID时都会描述为“厂商特定/Vendor Specific”,而不是找个自己知道的显示出来。

第2-3个字节“Flag/标记”,表示这个SMART属性的性质,并细分为6类。为方便表达,这里把十六进制的BYTE转换为二进制的BIT:
BIT 描述
0 故障保修属性/Pre-fail warranty attribute
为0时表示这个属性失败与否都不在保修范围内(大多数)
为1时表示这个属性失败就应寻求保修,比如B8h 端到端错误计数
1 在线记录属性/Online collection attribute
为0时表示这个属性只在离线活动时记录,比如C6h 离线不可纠正扇区计数
为1时表示这个属性在在线活动和离线活动时都记录(大多数)
2 性能属性/Performance attribute
为0是表示这个属性不是性能属性(大多数)
为1时表示这个属性是性能属性,比如02h 吞吐性能
3 错误率属性/Error rate attribute
为0时表示这个属性不是错误率属性(大多数)
为1时表示这个属性是错误率属性,比如01h 原始读取错误率
4 事件计数属性/Event count attribute
为0时表示这个属性不是事件计数属性,比如C2h 温度
为1时表示这个属性是事件计数属性(大多数)
5 自维护属性/Self-preserving attribute
为0时表示这个属性是驱动器与主机交互中记录的,比如C5h 不稳定扇区数
为1时表示这个属性是驱动器不需与主机交互自行记录的(大多数)
6-15 保留

如果厂家提供手册的话,每个SMART属性的Flag/标记会有单独标注。但我们在CDI导出的原始信息里面看到的都是十六进制数,这里我们挑几个数实战一下:
05h 重映射扇区计数 (0032)hex=(00000000 00110010)bin,所以这是一个在线记录属性、事件计数属性和自维护属性;
B8h 端到端错误计数 (0033)hex=(00000000 00110011)bin,所以这是一个故障保修属性、在线记录属性、事件计数属性和自维护属性;
C2h 温度 (0022)hex=(00000000 00100010)bin,所以这是一个在线记录属性和自维护属性。
注意:上述举例并不适用于所有设备,不同设备相同SMART属性的Flag/标记很可能不同。
了解了Flag/标记的意义以后就能知道哪些SMART属性代表一块盘是否健康,以及厂家是否会承担保修责任。

第4个字节“当前值/Current value/Normalized”,这个值是根据“原始值/Raw data”算出来的,表示一个SMART属性当前的状况。这个值为0、254(FEh)和255(FFh)时都是无效的,最大值是253(FDh),最小为1,通常情况下初始值是100(64h)。

第5个字节“最差值/Worst value”,表示当前值的历史最低值。最差值的有效范围和当前值一样。

第6-11字节“原始值/Raw data”,表示一个SMART属性的原始记录值,这就跟这个属性的定义有关了,不同厂家不同产品对同一属性的定义都有不同。这里要特别说明一点就是,原始值有6字节长,厂家可以将这6字节分成几段,分别赋予不同的定义。温度就是最明显的例子,很多厂家都会在这一属性上分三段分别定义当前温度、最低温度和最高温度,其中当前温度和最高温度经过计算会显示到当前值和最差值上。这里用BEh 温度或者说气流温度举例,原始值是(00001D09001C)hex=(0,29,9,28)dec,也就是最高温是29℃,最低温9℃,当前28℃,反映到当前值上就是(100-28)=72,反映到最差值上就是(100-29)=71,不存在阈值。

第12字节保留,通常情况下这1字节填0留空,但有的厂商觉得原始值那6字节不够用,所以也用了这1字节,这也就是俗话说的48位原始值和56位原始值。只不过一般的SMART工具都不会去显示保留的这1字节,导致原始值显示不完全。

在“SMART_READ_THRESHOLD”里面有用的就只有第1字节的“ID”和第2字节的“阈值/Threshold”。ID跟上面的一样,阈值表示一个SMART属性设计时的最差情况,一般来说就是故障预警,当当前值或最差值小于等于阈值的时候就代表一块盘出现功能失效了,应尽早着手处理。阈值为0时表示这个SMART属性永远正常,阈值为255(FFh)表示这个属性永远不正常,阈值为254(FEh)为无效值,阈值在1-253(FDh)之间是有效值。比如大部分HDD的B8h 端到端错误计数的阈值都是99,意思就是只要侦测到出现端到端错误就SMART报警,这也确实是极为关键的功能失效,代表数据在磁盘内部存储路径上已经不能保持完整性,需要马上采取措施,但一般来说就是没救了。

通常情况下拿当前值或者最差值与有效阈值进行对比就能知道一块盘是否工作正常,当然SMART工具会直接代劳。但也存在特例,比如很多HDD的BEh属性定义的阈值是45,也就是设计工作最高温不能超过55℃,但难保不会有偶然一次温度超标,这种阈值的触发就会导致SMART报警,对这种情况的SMART报警就可以视而不见了。

以上就是ATA设备的SMART数据结构入门,下面再简单说一说NVMe设备的SMART。

NVMe设备有不止一个SMART,其中一个是有统一定义的主SMART位于“Log Page Identifiers 02h”,另外的由厂家自行设定,但也是在“Log Page Identifiers”中,比如Intel是“Log Page Identifiers CAh”。

NVMe的主SMART有512字节长
Bytes 描述
0 关键警告,每个Bit为1的时候代表触发了某个警报
Bit 0 可用备用块数低于阈值
Bit 1 温度超高或者超低
Bit 2 可靠性失效
Bit 3 只读模式
Bit 4 易失性存储保障措施失效(暂可以理解为外置缓存掉电保护失效)
Bits 5-7 保留
2:1 温度
3 可用备用块数百分比
4 可用备用快数阈值
5 已用寿命(0起,最大到255)
31:6 保留
47:32 读取扇区数(1:512000字节)
63:48 写入扇区数(1:512000字节)
79:64 读取指令数
95:80 写入指令数
111:96 主控忙碌时间(单位分钟)
127:112 通电周期数
143:128 通电小时数
159:144 异常断电次数
175:160 介质错误数(UECC和CRC错误等)
191:176 错误信息记录(开头)数
195:192 温度超警时长(单位分钟)
199:196 温度超危时长(单位分钟)
201:200 温度传感器#1
203:202 温度传感器#2
205:204 温度传感器#3
207:206 温度传感器#4
209:208 温度传感器#5
211:210 温度传感器#6
213:212 温度传感器#7
215:214 温度传感器#8
511:256 保留

NVMe的SMART不同于ATA设备,不再有ID、Flag等这种表示,而是由固件根据预设信息自行判断健康状况,并直接在Byte0上给出警告信息。额外的SMART则由厂家自行定义属性及数据结构,详见各家的手册,这里没法说了。

正文就到这里结束。

SMART能提供很多信息,我们要读懂它才有利于维护好手中设备,不然就有可能贻误病情造成额外损失,甚至造成身心上的双重负担。当然这也就需要厂家提供准确的信息,至少是不能含糊的信息。现在SMART几乎是摆设的产品有不少,当前值、阈值一片0的产品,这种SMART信息有什么用?虽然ATA设备的SMART没有标准化定义,但连最起码的属性都不设置也没有替代属性(比如端到端错误、重映射/剩余备用块数等)的,这样的产品很难称得上是一个靠谱的产品。无形的数据损失最为可怕。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

评分

参与人数 2代金券 +50 绝对值 +1 收起 理由
fastslz + 1 赞一个!
石头 + 50 1精

查看全部评分

overthink 发表于 2016-2-13 19:43 | 显示全部楼层
SMART有没有隐藏信息,我是指工厂专用工具才能读出来的,使用CDI读不出来的项?
nighttob  楼主| 发表于 2016-2-13 19:55 | 显示全部楼层
overthink 发表于 2016-2-13 19:43
SMART有没有隐藏信息,我是指工厂专用工具才能读出来的,使用CDI读不出来的项? ...

SMART_READ_DATA里面包含所有的SMART信息,一般CDI这种工具能读懂的也就是前362字节,后面也有厂家定义的空间,那么理论上是有厂家自己发挥的空间的。

关键在于不是所有信息都需要以SMART属性形式表现出来。
固件能记录的信息和详细程度都可以远超SMART,所以才会有浴室开发的改M4固件显示隐藏属性。
http://bbs.pceva.com.cn/thread-54728-1-1.html


评分

参与人数 1绝对值 +1 收起 理由
overthink + 1 很给力!

查看全部评分

xffsfy 发表于 2016-2-13 23:57 | 显示全部楼层
SMART应该每个厂商的定义都有细微的不同吧?没有对应的手册读出来也不明白啊。
ym221479 发表于 2016-2-14 09:42 | 显示全部楼层
有点高级,慢慢消化,关键是要有正确的对照表
applelovekula 发表于 2016-2-14 09:45 | 显示全部楼层
看不懂。
alphaboy 发表于 2016-2-14 10:40 | 显示全部楼层
盘霸硬是要得,硬着头皮先看!
小虾 发表于 2016-2-14 11:58 | 显示全部楼层
别的百度一下就知道啥意思,就是谜一样的厂商特定项目,不知道上哪去查代表什么
fastslz 发表于 2016-2-14 13:49 | 显示全部楼层
就是想拜读这样的文章,维基的部分实在看不懂,度娘百科粘贴党....
SSD品牌商遍地开花,门槛越来越低,而有的OEM根本没有这个技术积累和实力,而ODM只顾产品生产,甚至部分厂商直接委托山寨厂,使得SMART被这些厂商给弱化了,SMART值无用论也开始产生了。
fastslz 发表于 2016-2-14 14:12 | 显示全部楼层
本帖最后由 fastslz 于 2016-2-14 14:58 编辑

SMART工具开发其实门槛也很低,Windows WMI接口直接可以查询,我就搞不懂厂商们都不愿意做。
http://bbs.pceva.com.cn/thread-126236-1-1.html
我写这个里面的计算公式当初google好长时间的,现在能根本不可能完成的,春节期间 甚至能临时看看围墙外面的 网 站 都xx了。
所以我就很纳闷这不是扼杀年轻一代跑出去学习更多技术,印度软件业如此发达,一来民众除母语以外就是英文二来比 较 开 放....
以下最最简单的二条命令组合就可以获取SMART
  1. WMIC.EXE /NAMESPACE:\\root\wmi PATH MSStorageDriver_FailurePredictData
  2. WMIC.EXE /NAMESPACE:\\root\wmi PATH MSStorageDriver_FailurePredictThresholds
复制代码

所以我的脚本只注重列出、计算、显示排版,其它的真的没有技术含量的,也只会用自己已经学会的语言,不然写个EXE了
fastslz 发表于 2016-2-14 14:54 | 显示全部楼层
本帖最后由 fastslz 于 2016-2-14 15:10 编辑

我想请教一下,就拿我手头正在使用的二个SSD来说
东芝盘C2  DEC数值158913789965   我的脚本计算得出13° 和CDI一样的
定制盘      DEC数值6163740           我的脚本计算得出388380,这个完全不是温度,CDI显示28°

而这个定制盘很多工具不能正确显示,包括AIDA64任何版本及Hard Disk Sentinel4.6,其它小工具也是要么读不出要么计算有误,目前就CDI和HD Tune。
曾经怀疑自己的计算公式,查找解决方法,甚至下载CDI源码,所以引申出一个疑问贴一个验证贴
http://bbs.pceva.com.cn/thread-126834-1-1.html
http://bbs.pceva.com.cn/thread-126949-1-1.html
当然我的脚本计算 机械盘直读温度,计算得出的均问题的

nighttob  楼主| 发表于 2016-2-14 15:36 | 显示全部楼层
本帖最后由 nighttob 于 2016-2-14 15:43 编辑
fastslz 发表于 2016-2-14 14:54
我想请教一下,就拿我手头正在使用的二个SSD来说

而这个定制盘很多工具不能正确显示,包括AIDA64任何版本 ...

我说过了,Raw data是6字节,每一字节都可以有单独定义。
在温度这个属性里,可以是每2字节定义一个值,也可以每1字节定义一个值,剩余置0。
定制版这个很明显就是只用了前3个字节,每1字节定义一个值。
你导出的时候用HEX不好么,转换到DEC还得转换回来才能解读。

原始数据是1C 0D 5E 00 00 00,按从高位到低位顺过来再去零以后就是5E0D1C,翻译成十进制就是94 13 28,分别是最高、最低、当前。
你出来一个388340,转换到十六进制就是5ED1C,显然是你取值的时候算法有问题。
fastslz 发表于 2016-2-14 16:08 | 显示全部楼层
使用DEC方式,是之前习惯了HD Tune,几年前用SSD后才知道有CDI这么一个 软件更适合SSD,而习惯也延续下来了。
6163740十六进制5E0D1C,388340之前谷歌到的计算方法,大多数也使用这个方法,AIDA HDS估计也是这种算法,计算得出非温度值干脆就不显示。
5E0D1C翻译成十进制就是94 13 28,这个数值正确的那个帖子我慢加温到82°那时CDI确实显示94°,好的谢谢解读,现在有更好的思路了。
正因为这些值换算方式不同,代码复杂度更大
nighttob  楼主| 发表于 2016-2-14 16:13 | 显示全部楼层
本帖最后由 nighttob 于 2016-2-14 16:14 编辑
fastslz 发表于 2016-2-14 16:08
使用DEC方式,是之前习惯了HD Tune,几年前用SSD后才知道有CDI这么一个 软件更适合SSD,而习惯也延续下来了 ...

就算是按2字节为一段取的值,也应该是0000,005E,0C1D,你在做算法的时候肯定是把0C1D的0给舍去了,然后直接跟高位的5E合并,最后出来一个看不懂的数。

专业的SMART工具碰到自己不懂的算法就直接不去解读,也不是你说的数据异常所以不显示。

评分

参与人数 1绝对值 +1 收起 理由
fastslz + 1 很给力!

查看全部评分

fastslz 发表于 2016-2-14 16:19 | 显示全部楼层
想想,我瞎操心干嘛
建兴、AIDA、 HDS才关注的事情
业余写出和AIDA、 HDS一样的结果已经不错了


u设备名称:TOSHIBATHNSNJ128GCSU
ID 属性描述              当前值 最差值 临界值 数据  状态
1  (1) 数据读取错误率           100 100 0   0  正常
2  (2) 数据传输效能            100 100 50  0  正常
3  (3) 马达旋转同步时间          100 100 50  0  正常
5  (5) 重新映射扇区计数          100 100 50  0  正常
7  (7) 寻道错误率             100 100 50  0  正常
8  (8) 寻道时间性能            100 100 50  0  正常
9  (9) 累计加电时间            100 100 0   6902  正常
10 (A) 启动重试次数            100 100 50  0  正常
12 (C) 通电次数              100 100 0   1201  正常
167(A7) 硬盘保护模式            100 100 0   0  正常
168(A8) SATA物理层错误计数         100 100 0   0  正常
169(A9) 坏快数总计             100 100 10  100  正常
173(AD) 擦除计数              191 191 0   0  正常
175(AF) <厂商特定>             100 100 10  0  正常
192(C0) 不安全关机次数           100 100 0   471  正常
194(C2) 硬盘温度              89  63  20  11  正常
197(C5) 待映射的扇区计数          100 100 0   0  正常
240(F0) 磁头飞行时间            100 100 50  0  正常
设备名称:LITEONT9__200
ID 属性描述              当前值 最差值 临界值 数据  状态
5  (5) 重新映射扇区计数          100 100 5   0  正常
9  (9) 累计加电时间            100 100 10  227  正常
12 (C) 通电次数              100 100 0   56  正常
177(B1) 磨损范围对比值           99  99  0   4633  正常
179(B3) <厂商特定>             100 100 0   0  正常
180(B4) <厂商特定>             100 100 0   8160  正常
181(B5) 编程失败计数            100 100 0   0  正常
182(B6) 擦写失败计数            100 100 5   0  正常
194(C2) 硬盘温度              100 100 0   388380  正常
195(C3) 硬件ECC恢复             100 100 10  0  正常
199(C7) Ultra DMA CRC 错误计数       100 100 0   0  正常
229(E5) <厂商特定>             100 100 0   0  正常
232(E8) 预留空间剩余量           100 100 0   100  正常
241(F1) 主机写入量总计           100 100 0   33794  正常
242(F2) 主机读取量总计           100 100 0   19863  正常
设备名称:ST1000DM003-1ER162
ID 属性描述              当前值 最差值 临界值 数据  状态
1  (1) 数据读取错误率           118 99  6   1066560  正常
3  (3) 马达旋转同步时间          98  97  0   0  正常
4  (4) 启动/停止次数            100 100 20  689  正常
5  (5) 重新映射扇区计数          100 100 10  0  正常
7  (7) 寻道错误率             69  60  30  526815  正常
9  (9) 累计加电时间            93  93  0   6378  正常
10 (A) 启动重试次数            100 100 97  0  正常
12 (C) 通电次数              100 100 20  682  正常
183(B7) <厂商特定>             100 100 0   0  正常
184(B8) 终端校验出错            100 100 99  0  正常
187(BB) 硬件无法恢复的错误计数       100 100 0   0  正常
188(BC) 命令超时              100 100 0   0  正常
189(BD) 磁头非正常高度写入         98  98  0   2  正常
190(BE) 气流温度              81  61  45  1359891  正常
191(BF) 加速感应器错误率          100 100 0   0  正常
192(C0) 不安全关机次数           100 100 0   67  正常
193(C1) 磁头加载/卸载循环计数        99  99  0   2956  正常
194(C2) 硬盘温度              19  40  0   19  正常
197(C5) 待映射的扇区计数          100 100 0   0  正常
198(C6) 无法修正的扇区数          100 100 0   0  正常
199(C7) Ultra DMA CRC 错误计数       200 200 0   0  正常
240(F0) 磁头飞行时间            100 253 0   6297  正常
241(F1) 主机写入量总计           100 253 0   14150235 正常
242(F2) 主机读取量总计           100 253 0   7398145  正常
设备名称:ST500DM002-1BD142
ID 属性描述              当前值 最差值 临界值 数据  状态
1  (1) 数据读取错误率           118 99  6   1103408  正常
3  (3) 马达旋转同步时间          100 96  0   0  正常
4  (4) 启动/停止次数            96  96  20  4686  正常
5  (5) 重新映射扇区计数          100 100 36  0  正常
7  (7) 寻道错误率             83  60  30  855938  正常
9  (9) 累计加电时间            78  78  0   20111  正常
10 (A) 启动重试次数            100 100 97  0  正常
12 (C) 通电次数              96  96  20  4569  正常
183(B7) <厂商特定>             100 100 0   0  正常
184(B8) 终端校验出错            100 100 99  0  正常
187(BB) 硬件无法恢复的错误计数       100 100 0   0  正常
188(BC) 命令超时              100 95  0   459  正常
189(BD) 磁头非正常高度写入         100 100 0   0  正常
190(BE) 气流温度              79  46  45  1490965  正常
194(C2) 硬盘温度              21  54  0   21  正常
195(C3) 硬件ECC恢复             44  33  0   1103408  正常
197(C5) 待映射的扇区计数          100 100 0   0  正常
198(C6) 无法修正的扇区数          100 100 0   0  正常
199(C7) Ultra DMA CRC 错误计数       200 200 0   0  正常
240(F0) 磁头飞行时间            100 253 0   20365  正常
241(F1) 主机写入量总计           100 253 0   4708612  正常
242(F2) 主机读取量总计           100 253 0   5246576  正常


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
dy4932 发表于 2016-2-14 17:26 | 显示全部楼层
能不能教我们16进制,都忘了,所以看不懂。
fastslz 发表于 2016-2-14 17:36 | 显示全部楼层
nighttob 发表于 2016-2-14 16:13
就算是按2字节为一段取的值,也应该是0000,005E,0C1D,你在做算法的时候肯定是把0C1D的0给舍去了,然后直 ...

非常感谢,经过探讨后,增加代码容错能力得以解决此问题
增加代码
If aID = 194 Then
     If Raw > 200 Then
          Raw=aData(i+5)
     End If
End If

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
fastslz 发表于 2016-2-14 17:45 | 显示全部楼层
dy4932 发表于 2016-2-14 17:26
能不能教我们16进制,都忘了,所以看不懂。

10进位(0~9)~16进位(0~F)

0=0
1=1
2=2
3=3
4=4
5=5
6=6
7-7
8=8
9=9
10=A
11=B
12=C
13=D
14=E
15=F
16=10

Windows计算器 科学或程序员
固特异轮胎 发表于 2016-2-14 19:31 | 显示全部楼层
intel的这个盘怎么还是没有nand的写入量?
nighttob  楼主| 发表于 2016-2-14 20:18 | 显示全部楼层
固特异轮胎 发表于 2016-2-14 19:31
intel的这个盘怎么还是没有nand的写入量?

有NAND写入的是少数
统计这个比统计每个块擦除了多少次可困难多了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部