关于固态硬盘S.M.A.R.T表中0F项的初步深入分析
固态硬盘吧
全部回复
仅看楼主
level 9
空none🐴 楼主
前言:

鼠鼠
买了一个傲腾D4800X-750GB,平时都当个宝一样[吐舌],但今天一看smart表,虽然0E项还是0,但是0F项已经到2731了(买回来才半个多月[阴险])。
虽然很清楚nvme固态应该看0E,但我就是想知道0F里面究竟是啥。于是折腾之旅开始了。
2025年04月06日 08点04分 1
level 9
空none🐴 楼主
下面接着续写
2025年04月06日 08点04分 2
level 9
空none🐴 楼主
长话短说,鼠鼠试了3个工具(intel MAS,Hard Disk Sentinel PRO,smartmontool)。其实本应该有nvmecli,但鼠鼠没装linux系统所以不了了之。(这D4800X上装系统格式化等操作之前,一定要关闭trim,否则给你表演无响应或掉盘)
2025年04月06日 08点04分 3
这里再补充一下,鼠鼠买的是那种拆开后加转接板的那种D4800X。(D4800X是双主板,双主控,可以在贴吧里搜一下,以前有人发过)
2025年04月06日 11点04分
level 9
空none🐴 楼主
工具1:intel MAS(intel固态专属,似乎其他固态也能用?),
工具1的安装及测试:
去intel官网下载并安装:英特尔® Memory and Storage Tool CLI (网址:https://www.intel.cn/content/www/cn/zh/download/19520/intel-memory-and-storage-tool-cli-command-line-interface.html),windows版和linux版都能用。
鼠鼠只会用windows版,安装完后,去cmd或powershell以管理员模式运行(重要),然后输入intelmas并回车,之后弹出一堆令人窒息的字母和标点符号就成功了。
不要去看那弹出来的一坨,记得去找压缩包里的CLI IMAS User Guide Public(后面简称Guide)。
为了确定固态位置,所以输入Guide里第22页的3.1.1.5 example里面给出的指令:intelmas show -intelssd
鼠鼠看到D4800X前面是3,所以它的顺序是3(其实这是启动顺序)。
所以傲腾D4800X的intelmas起手招式为:intelmas show -intelssd 3(根据Guide里第11页的1.6 Target格式要求,这里使用了show命令,意味着show不是固定的)。
鼠鼠推荐大家先看Guide里第2.2 Features的表格,但只建议先只用show命令,(除非你知道自己在做什么,)
根据Guide里第18页的2.2 Features表格的NVMe log命令,似乎能找到我想要的(smart的0F项内容)
根据它给的example,我们不妨把里面的SmartHealthInfo替换为ErrorInfo,即:
intelmas show -intelssd 3 -nvmelog ErrorInfo就可以得到:0F项甚至是0E项的具体内容
已知鼠鼠的D4800x没有0E,只有0F(鼠鼠全盘读取了3次)。
所以这重复的Status Field代码给鼠鼠淦傻了[疑问](你这对着一个不为0的LBA地址,连着用一串命令是怎么回事?command ID是啥?Status Field代码是啥?是这个LBA地方损坏了吗,但为什么全盘扫描3次都是正常的?)
鼠鼠的研究半路崩殂([心碎]
2025年04月06日 08点04分 4
level 9
空none🐴 楼主
勇敢鼠鼠不怕困难,软弱的鼠鼠已经无了,接下来是更强的鼠鼠。。
工具2前言:
鼠鼠在网上查到nvmecli和smartcti两款工具也能查看非常详细的smart。所以到处去找有没有windows版本的.
一个好消息:smartcti有windows版;一个坏消息nvmecli没找到windows版(鼠鼠太菜,求大佬放过)
工具2的安装及测试:
鼠鼠在chocolatey社区找到了smartcli的windows版本(网址:https://community.chocolatey.org/packages/smartmontools)。
但powershell说不知道choco命令怎么办?没有办法就要创造办法。
不妨搜一下大佬们的博客,终于找到了大佬的choco入门(网址:https://www.cnblogs.com/mu-zhang/p/10545388.html),(鼠鼠只是知识的搬运工,),我们只需要里面的2个步骤
在管理员模式的powershell里,我们输入 set-executionpolicy remotesigned后,推荐选Y,(如果实在担心,可以等安装完smartmontool后,再执行一次这个指令,然后选N就行。毕竟是“蚊子腿“”一样的安全性)
然后输入choco并回车,看看它理你吗
开始安装并测试smartctl:
好的,它理我了[吐舌]我们乘胜追击,接着输入 choco install smartmontools
(由于鼠鼠安装过了,且不能覆盖安装,所以就不演示了)
(推荐安装过程中关闭杀毒软件)
(切记!一定要知道自己在做什么!)
安装结束后,接着在powershell内输入 smartctl并回车(注意是smartctl,而不是smartcil),
显示这样就安装成功了。([酷]
我们直接输入 smartctl -a C: ("C:"是盘符),就能得到这样的
根据error information,我可以断定intel mas和smartctl结果是一样的(比如最关键的Status只是16进制与10进制的区别),那这status究竟是什么?[太开心](好问题,鼠鼠只不过从一个坑跳到了另一个坑[泪]
鼠鼠又挂了[泪]
2025年04月06日 09点04分 5
补丁:smartctl从7.4版本开始已经有status解释了。大家记得下载7.4及之后的版本
2025年04月11日 12点04分
level 6
我买了个1.5t的。你说的这个估计还是因为拆了之前的原装转接板,固件是适配之前双转接的。
2025年04月06日 09点04分 6
我也觉得应该是[真棒]
2025年04月06日 11点04分
level 9
空none🐴 楼主
“雄关漫道真如铁, 而今迈步从头越”
工具3前言:
由于中文网内关于0F项的解释,全是清一色的“只是固态错误日志”然后并没有解释Status Field值是什么含义。
但鼠鼠搜外国论坛时发现了意外之喜:Hard Disk Sentinel PRO版也可以查看smart影藏内容。(网址:https://superuser.com/questions/1789164/increasing-number-of-error-log-entries-on-a-nvme-ssd
所以开始了新旅途。
工具3的准备:
这个Hard Disk Sentinel PRO版软件到处都能下载,推荐6.20版本的(一定要PRO),你可以不用注册,只是用来查看特殊信息。
Hard Disk Sentinel PRO告诉我们:Status:0xc008对应的解释为:Generic: Command Aborted/SQ Deletion [Do Not Retry] (机翻过来是:通用:命令中止/SQ 删除 [不重试])
再结合“D4800X不关trim后,格式化或进行大量写入会导致卡死或掉盘”,
我认为结果是[酷]
在触发trim后,D4800X会开始大量写入或清除数据,
但由于某种原因(应该是固件问题?),
导致trim进行到某个LBA地址后出现异常导致(表现为:I/O在一个地方不断重试操作,从而导致硬盘无响应,甚至触发掉盘)
完结撒花 ✿✿ヽ(°▽°)ノ✿
2025年04月06日 10点04分 7
理论上傲腾也不需要trim啊,能直接覆写的。这是固件问题或者特地写的啥非标操作吧
2025年04月07日 02点04分
补充:Hard Diks Sentinel Pro的解释不可信。在smartctl v7.4版本中。Status field:0xc008是Data transfer error(0x?04),而不是Command Aborted/SQ Deletion (0x?08),切记status要除2
2025年04月07日 05点04分
@X-4丧钟 所以我在找原因啊[滑稽],非标操作究竟是:谁发出的什么命令造成的什么结果
2025年04月07日 05点04分
@空none🐴 不清楚了,我当初唯一一块摸过的摸了一年不到就0e0f都一起爆然后就退了。消费级用这些感觉有点太灵了
2025年04月07日 05点04分
level 9
空none🐴 楼主
外篇之Error information里面的Status Field分析。
虽然已经清楚Status:0xc008对应着generic这一串解释,但万一有吧友需要其他的解释呢?
鼠鼠又去外网论坛搜了一下,发现了Status值的详细解释。(网址:https://superuser.com/questions/1801429/looking-for-smartctl-nvme-log-error-explanation-0xa013-0x8004-and-0x90)终于洞悉了一切。
以鼠鼠的Status:0xc008为例,0xc008 /2 =0x6004,(说人话:必须先给Status值除以2后,才能使用)
然后就开始了:
使用掩码0x7ff,提取右边3个字节(鼠鼠不是计算机专业不懂这个,只能猜),得到0x004(0x6004--->0x004),根据这位大佬整理的Status代码含义,
0x0??:对应NVME_SCT_GENERIC(说人话:范围很广,包括成功、不支持 opcode 和无效字段等。)
0x?08:对应
NVME_STATUS_COMMAND_ABORTED_DUE_TO_SQ_DELETION(由于为提交队列收到的“删除 I/O 提交队列”请求,命令已中止。)说人话:系统或某软件开始消除重复I/O操作,避免写入碎片化(比如软件dymaxIO就可以,但我推荐也不抵制,这个软件现在有点鸡肋,第一次使用要调节它的内存最大使用量,教程网上有,注:dymaxIO是diskeeper的升级版,基本教程一致)
关于NVME_xxxxxxxx:0x0??之类的解释,大家可以去微软的(nvme.h) NVME_STATUS_TYPES 枚举 解释文档(https://learn.microsoft.com/zh-cn/windows/win32/api/nvme/ne-nvme-nvme_status_types
关于NVME_xxxxxx:0x?00之类的解释,大家可以去微软的NVME_STATUS_GENERIC_COMMAND_CODES枚举 (nvme.h)解释文档(https://learn.microsoft.com/zh-cn/windows/win32/api/nvme/ne-nvme-nvme_status_generic_command_codes
注意:
0x0??的意思是:第一位已确定的前提下(可以是0x1??,0x2??之类的,微软有详细解释),查看第一位的解释。
0x?00的意思是:在已确定(或不确定)第一位的前提下,查看后1-2位的解释。
注:
鼠鼠非计算机科班,也不是爱好编程,只是想研究一下这个原理,文章还有一些是借鉴来的。(所以文章有理解性错误在所难免)
如果文章有错误,请务必指出,鼠鼠一定会改。
2025年04月06日 11点04分 9
图片又放错地方了…算了不改了,越改越错[怒][喷]
2025年04月06日 12点04分
这一部分还是有点问题[阴险] 大家切记步骤是:(Status值/2)并取右边3位=0x???才能用。 我举例的时候Status:0xc008应该是:0xc008/2=0x6004,取右边3位是:0x004。对应了0x0??和0x?04,解读为:NVME_Status_Type_generic_command(通用指令,看不出什么)+NVME_Status_Transfer_error(数据或元数据传输中出现错误)
2025年04月07日 00点04分
补丁:大家切记nvmecli的status field值已经处理好的,不需要除2; smartcli等其他软件的status值需要除2才能拿去解释。 如果真的想核对status值是否准确,建议用多个软件进行相互对照,以验证准确性
2025年04月11日 12点04分
level 9
0e了才有0f
2025年04月06日 13点04分 11
回复 ✨神野蓝✨ :根据我的研究,0F其实比0E要大(0F毕竟是所有和信息记录,0E有的,它也有)。 0E只针对:(Status值)/2 =0x2??(NVME_STATUS_TYPE_MEDIA_ERROR。解释: 指示 NVM 中发生媒体特定错误或数据完整性错误的状态值。) 而0F包括:(Status值)/2 =0x0??/0x1??/0x2??/0x7?? 具体参考我最后关于Status field的分析
2025年04月06日 13点04分
你这0E和0F一样,说明就是被(Status值)/2 =0x2??联动了
2025年04月06日 13点04分
level 1
我放游戏那个盘0f多,装资料和系统的盘就没有0f,应该还是跟大量读写有关
2025年04月06日 14点04分 12
level 14
这里面还挺复杂,我以前有块硬盘也想查查,但是nvmecli没看明白就算了。
2025年04月06日 15点04分 13
就是没什么错误吗?
2025年04月06日 15点04分
@文曲花 Status:0xx(generic通用指令无含义) Status:x00(NVME_STATUS_SUCCESS_COMPLETION 命令成功完成。只是告诉你指令成功执行了) 所以(Status值)/2 并取右边3位=0x000,只是告诉你指令执行成功了[滑稽]
2025年04月06日 23点04分
level 1
我e18 e16群联主控都有of ,之前新盘做测试出来就出来了,还有就是这2块都是转接卡的.不知道是否这个i/0有关
2025年04月06日 23点04分 17
不清楚,得看到status值才能知道
2025年04月07日 02点04分
level 1
我用的三星企业pm983,每次开机0f就+1[笑眼]
2025年04月07日 05点04分 18
三星企业盘的这种,可能用了不支持的特殊指令导致0F上涨(不过你也可以根据Status 值进行分析[勉强]
2025年04月07日 07点04分
level 9
空none🐴 楼主
找到原因了
xdm

原来是主板的DMA保护的锅,
DMA保护阻碍了傲腾信号传输[喷]
导致傲腾被强行延迟启动,
所以每次开机0F就增加18个,而关闭DMA就不会增长了。
刚好就对上(0xc008 /2)=0x6004--(取右边3位)-->0x004(即:0x0??+0x?04=generic+transfer error),
原来我这里的transfer error是指:傲腾D4800X想进行DMA数据搬运,结果被主板设置禁止了[喷]
2025年04月07日 07点04分 19
所以兄弟们,单独出现0F并不影响硬盘寿命。但如果0E增长就要小心了。因为0x2??这种代表数据储存出错的指令是不会凭空产生的
2025年04月07日 07点04分
对了,这也就说明Hard disk Sentinel Pro给的Status值解释有问题。你把它的Status ÷2 ,再取右边3位就正常了。()
2025年04月07日 07点04分
level 9
空none🐴 楼主
番外2,关于查看Status值的软件推荐,如下图:
top0:nvmecli
虽然只能linux使用(目前),
但它自动给你处理了Status值并给出相应解释。
你还能根据它的Status field直接查询微软文档。无需多余操作。
(本来是想顺便用LVFS更新D4800X固件的,没想到根本没有D4800X的OEM固件更新[怒],参考:https://www.chiphell.com/thread-2415075-2-1.html
top1;smartctl
linux和windows下都能用,但切记需要下载7.4及以后的版本(否则没有代码解释)
Status值需要除以2才能取后3位使用。
且windows下安装有点繁琐
top2: intel MAS 、Samsung DC Toolkit等专用工具
并不是特别推荐,因为它们大多数功能都可以被上面2个代替,
用他们主要是为了 解析/使用 特殊指令(一般用不到)
top3;Hard Disk Sentinel Pro
虽然查看Status最方便,但它的解释通常有问题的(为什么没有除2就直接分析)
只相当于Status值の查看器,
(当然,如果你Status:0的话,那一定是
正确的
,因为 0/2 =0)
其实吧,微软文档里面的指令代码很多都没有详细解释。(感觉是在抄NVME白皮书?)
你也可以问问联网的AI大模型,毕竟中文网站里还是有nvme手册等相关的内容,甚至有大佬的博客)
感兴趣可以手动查阅nvme白皮书,(https://nvmexpress.org/specifications/),虽然看了也无法彻底解惑(大概率)
也就对问题排查有点作用。(大方面,具体要自己试了)
此贴真的真的真的完结,后续我只会打补丁,不会继续内容大更新了。[滑稽]
2025年04月07日 13点04分 20
1 2 尾页