固态硬盘吧 关注:952,759贴子:7,131,141
  • 9回复贴,共1

关于固态硬盘S.M.A.R.T表中0F项的初步深入分析

取消只看楼主收藏回复

前言:
鼠鼠买了一个傲腾D4800X-750GB,平时都当个宝一样,但今天一看smart表,虽然0E项还是0,但是0F项已经到2731了(买回来才半个多月)。

虽然很清楚nvme固态应该看0E,但我就是想知道0F里面究竟是啥。于是折腾之旅开始了。


IP属地:新疆1楼2025-04-06 16:25回复
    下面接着续写


    IP属地:新疆2楼2025-04-06 16:26
    回复
      2025-08-30 06:58:06
      广告
      不感兴趣
      开通SVIP免广告
      长话短说,鼠鼠试了3个工具(intel MAS,Hard Disk Sentinel PRO,smartmontool)。其实本应该有nvmecli,但鼠鼠没装linux系统所以不了了之。(这D4800X上装系统格式化等操作之前,一定要关闭trim,否则给你表演无响应或掉盘)


      IP属地:新疆3楼2025-04-06 16:28
      收起回复
        工具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次都是正常的?)
        鼠鼠的研究半路崩殂(


        IP属地:新疆4楼2025-04-06 16:58
        回复
          勇敢鼠鼠不怕困难,软弱的鼠鼠已经无了,接下来是更强的鼠鼠。。
          工具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究竟是什么?(好问题,鼠鼠只不过从一个坑跳到了另一个坑
          鼠鼠又挂了


          IP属地:新疆5楼2025-04-06 17:47
          收起回复
            “雄关漫道真如铁, 而今迈步从头越”
            工具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在一个地方不断重试操作,从而导致硬盘无响应,甚至触发掉盘)
            完结撒花 ✿✿ヽ(°▽°)ノ✿


            IP属地:新疆7楼2025-04-06 18:13
            收起回复
              外篇之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位的解释。
              注:
              鼠鼠非计算机科班,也不是爱好编程,只是想研究一下这个原理,文章还有一些是借鉴来的。(所以文章有理解性错误在所难免)
              如果文章有错误,请务必指出,鼠鼠一定会改。


              IP属地:新疆9楼2025-04-06 19:45
              收起回复
                找到原因了xdm,
                原来是主板的DMA保护的锅,
                DMA保护阻碍了傲腾信号传输
                导致傲腾被强行延迟启动,
                所以每次开机0F就增加18个,而关闭DMA就不会增长了。
                刚好就对上(0xc008 /2)=0x6004--(取右边3位)-->0x004(即:0x0??+0x?04=generic+transfer error),
                原来我这里的transfer error是指:傲腾D4800X想进行DMA数据搬运,结果被主板设置禁止了


                IP属地:新疆来自Android客户端19楼2025-04-07 15:07
                收起回复
                  2025-08-30 06:52:06
                  广告
                  不感兴趣
                  开通SVIP免广告
                  番外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/),虽然看了也无法彻底解惑(大概率)
                  也就对问题排查有点作用。(大方面,具体要自己试了)

                  此贴真的真的真的完结,后续我只会打补丁,不会继续内容大更新了。


                  IP属地:新疆20楼2025-04-07 21:52
                  回复
                    这里一共有2种Status值。
                    对于0x0000仅仅是表示“命令执行成功”(不用解释了吧,它只是报告一下任务成功完成)

                    对于0x4004(转换后是0x002),表示:某些特殊设定,或是“此命令不支持”。
                    在这里,我认为是很大概率是「固件策略的问题」(本身无害)。
                    而且非常可能是:“不支持的命令”被驳回导致。
                    所以硬盘本身没问题,只是它固件策略不一样,把“什么任务成功完成”和“无效命令被驳回”都放到0F里,然后还让你“不小心看到了”。
                    --------------------------------------------------------------------------------------------------------
                    扩展内容(以下内容属于NVME白皮书,感兴趣可以去我之前提供的网站下载):
                    这些“invalid field in command”包括但不限于:
                    1.访问 其他非活动的命名空间 被驳回(NSID,其实只有企业级硬盘才能创建多个命名空间)

                    2.不支持 NVM集(NVM set)

                    3.不支持 耐久组标识符(Endurance group,NVM子系统 )

                    4.不支持 命令融合操作(fused operation)
                    5.元数据传输问题(MPTR,这个是硬盘固件编写才考虑的,和什么操作系统无关)
                    6.不支持Fabric指令(Fabric command,用于NVME跨网络通讯管理)
                    -------总之刚好印证我的结论


                    IP属地:新疆29楼2025-08-10 14:00
                    收起回复