18个回答

微软 Win11 最新 KB5063878 更新导致特定情况下 SSD 和 HDD 故障,如何解决?

李爻中
246个点赞 👍

今天找了台机 找了个库存全新盘 小容量的ssd 无缓存的 复现一下这个bug 经过我反复作死,现在硬盘炸了.

两件事:

1,这事跟群联没多大关系,啥盘都会炸,是所有的都有可能炸,无论有没有缓存

2,抓紧自查smart 重点查 媒体与数据完整性错误计数 主机指令超时 编程失败计数 编程失败计数最差值 坏块计数

这个事其实就是不知道怎么情况,硬盘就卡死了或者无法访问了,这时候硬盘可能还在写,然后可能界面或者什么操作就卡住了。看到这个情况一慌,来个强制重启或者关机啥的,硬盘就报废了。

最开始是硬盘变成1MB,然后是Diskgeinus打开报错,我把硬盘拆了。接linux系统上, 又经过我的一顿操作,现在直接不认盘了,凉凉……

硬盘信息现在无法读取了。




已报废,凉凉 呵呵哒。

这个盘是没有缓存的,当然只要眼睛不瞎都能看出来。

主控上面印刷的rmc,上面印的型号是RTS5735DLQ L420ZP1 GL18AA

闪存颗粒是ADATA 上面印的60079381 530449181B 121965911A81441

这特么是什么颗粒现在也搞不清楚,估计也没法用开卡工具刷活了。

中间尝试拿镊子短接量产了几次,依然没救活,因为不知道具体的开卡参数和芯片型号,呵呵哒。凉凉,撒有哪啦。牛逼plus 。

当然这个事跟我一顿胡乱操作有很大的关系,不能怪别人。 损失不大,就当娱乐了。因为本身也是想测试一下到底ssd的可靠程度如何,所以搞了很多远超出正常使用的场景的测试,加上一些错误的操作。当然我一开始也没想到这玩意真的会挂掉。


如果你不幸遇到掉盘之类的故障,千万不要急着重启或者断电,这样很容易会造成硬盘严重损坏,就像我这样.

正确的操作是,不要理它,放在那里继续通电30分钟.或者时间更久,然后再尝试重启或者别的操作.

原理就是给主控芯片一点时间,让它看看能不能自检,自我修复. 如果断电就可能造成不可逆的损坏.


nand闪存有很多数据,这个数据是要有一个目录的,把数据当成书,目录当成书架

  1. 如果你想修改书中的某一页,你不能直接在上面涂改。你必须把整本书抄写一遍,在抄写的过程中做出修改,然后把旧的书扔掉,把新的书放到一个新的空书架上。
  2. 每个书架(闪存块/Block)被来回搬动书籍(写入/擦除数据)的次数是有限的,太多次之后就会损坏。

现在,操作系统来找书,它只知道一个简单的“逻辑地址”,比如“我想看第 205 号书”。它完全不知道这本书实际放在哪个物理角落。

FTL(Flash Translation Layer,闪存转换层) 就是这个图书馆里无所不知的超级图书管理员。它手里有一张巨大的索引卡(FTL 表),记录着:

逻辑地址(Logical Block Address, LBA):读者要的“第205号书”。

物理地址(Physical Block Address, PBA):这本书实际存放的“C区,第8排,第15个书架,第3层”。

每当操作系统要读取或写入数据时:

读数据:操作系统说“我要LBA 205的数据”,FTL查表,立刻知道数据实际在PBA (C,8,15,3),然后去那里把数据取出来。

写数据:操作系统说“我要把新数据写到LBA 205”。FTL会做以下几件事:

  1. 找一个新的空书架(空的物理页面) 来存放新数据。
  2. 把新数据写进去。
  3. 在索引卡(FTL表)上,把LBA 205指向这个新的物理地址。
  4. 把原来旧数据所在的地址标记为“无效的、可回收的垃圾”。

这个过程就是 “写时重分配(Write-on-rewrite)” 和 “垃圾回收(Garbage Collection)” 的基础。正是FTL的存在,才让SSD能够模拟成和传统硬盘一样可以随机读写的块设备,对操作系统完美隐藏了NAND闪存不能就地覆盖写入的复杂物理特性。

FTL表不是一成不变的,它随着数据的写入而不断更新。这些更新不会每次立即永久写入闪存(那样太慢了),可能会先在DRAM缓存中操作,然后定期刷写到NAND中。如果正在刷写的过程中,或者刚更新完DRAM中的映射表但还没来及写回NAND时,突然断电,就会导致:

1,NAND中的FTL表是旧版本。

2,DRAM中的新映射表因为断电而丢失。

3,当下次通电时,SSD主控用旧的FTL表去查找数据,会发现逻辑地址指向的物理位置可能存放的是无效的旧数据,或者根本找不到数据,导致全盘数据错乱、无法识别。

SSD的主控芯片和固件是管理FTL的核心大脑。如果固件算法存在缺陷,可能在异常情况下错误地更新了FTL表,或者执行垃圾回收时发生了错误,误删了有效数据的映射关系,导致FTL逻辑混乱。

如果存储驱动程序或系统服务有Bug,这个Bug有可能导致了对SSD的写入指令流(I/O Pattern)出现异常。

1. 对FTL元数据区域的直接错误写入

这是最直接、最致命的可能性。操作系统本不应直接访问SSD上存储FTL表的“系统区块”。这个区域应由SSD主控全权管理。

驱动Bug可能错误地将用户数据或日志文件的写入操作,其逻辑地址(LBA) 指向了原本用于存放FTL元数据的物理地址。

主控执行了写入命令,用无用的用户数据覆盖了FTL表的一部分。当主控下次需要加载FTL时,发现其校验失败、结构破碎,整个盘的“地图”就丢失了,导致“掉盘”或容量识别错误(如变成1MB)。

2. 极端情况下的缓存刷新(Flush)指令风暴

现代操作系统为了确保数据安全,会定期向存储设备发送“缓存刷新”指令(如 FLUSH CACHE),要求设备将内部缓存(DRAM缓存或SRAM缓存)中的数据真正写入到NAND闪存中。

Bug可能导致系统在极短时间内疯狂发送海量的、不必要的缓存刷新指令。

对于无DRAM缓存、依赖HMB(主机内存缓冲)的SSD:其FTL映射表的一部分存放在系统内存中。频繁的刷新指令迫使主控需要不断地将映射表更新写回闪存。这个过程会极大占用主控的资源,并显著增加对存储FTL的NAND区块的写入磨损。在极端压力下,可能引发超时错误或写入失败,导致元数据损坏。

指令风暴可能打乱主固件的正常操作队列(如垃圾回收GC),引发不可预见的错误状态。

3. 触发了主控固件中潜藏的Bug(“Combination”问题)

这在软件/硬件交互中非常常见。Windows的异常I/O行为触发并放大了特定主控固件中原本处于休眠状态的缺陷。

主控固件可能没有对某种极端、非正常的写入请求(比如非常规大小的写入、对齐错误的请求)进行很好的容错处理。

bug驱动恰好发出了这种“异常请求”,主控固件在处理时发生逻辑错误,例如:

错误地更新了FTL表(记录了错误的映射关系)。

在执行垃圾回收(GC)时,误将包含有效数据的块标记为无效并擦除。

这些操作都会直接导致FTL逻辑混乱,最终崩溃。

4. 电源管理相关的Bug

SSD对突然断电非常敏感。虽然这次事件不是物理断电,但软件层面的“指令断电” 也可能造成类似效果。电源状态转换(如DIPM设备初始化电源管理)相关的Bug,导致SSD在活跃工作状态和低功耗状态之间频繁且快速地切换。

在状态切换的瞬间,如果发生I/O请求,可能会造成指令未完成就被中断。如果这个未完成的指令恰好是更新FTL元数据的操作,其结果就等同于一次“软件层面上的突然断电”,导致FTL数据不一致。

来自评论区的@松鹤 给出了一个smart图 我这里分析一下

首先我们看一下它这个06读取,显示读取了47.6TB的数据.07写入了31.6TB的数据

他这个0E是非常严重的,任何时候0E的值都不应该大于0

记录的是在读取存储的数据时,发生的无法通过内部ECC纠错算法纠正的错误累计次数

0E出现的可能原因:

1,物理层损坏:这意味着NAND闪存颗粒的某些存储单元已经物理性退化或损坏,导致存储的电荷不稳定,无法正确读出之前写入的数据。

2,直接关联FTL:当主控读取一个页面(Page)失败时,它会触发一系列恢复机制。如果最终恢复失败,主控会:

  • 将这个无法读取的页面标记为坏块。
  • 从其他冗余备份中尝试恢复数据(如果支持的话)。
  • 更新FTL表,将这个出错的逻辑块地址(LBA) 重新映射到备用的物理块上。
  • 在这个过程中,0e 计数就会增加

3,数据损坏风险:如果错误无法恢复,操作系统读到的就是损坏的数据。对于程序文件会导致崩溃,对于用户数据(文档、照片)会造成永久性损坏

0E数值为 10,454 意味着什么?

1,绝对故障任何大于0的值都是一个明确的危险信号。而 10,454 这个数字表明错误已经发生了上万次,这证明故障不是偶发的,而是持续且恶化的。

2,FTL压力巨大:FTL表正在进行大量的重映射操作来尝试掩盖这些坏块。这会导致性能下降和延迟增加。

3,濒临死亡:硬盘的NAND闪存正在大量失效。备用块(Spare Blocks)很可能即将被耗尽。一旦备用块用尽,下一次写入错误就会直接导致硬盘无法写入,甚至彻底变砖。

0F错误日志4代表什么:

0F属性的核心含义:主机指令超时计数

这个属性记录的是硬盘在响应主机(你的电脑)的指令时,发生了超时(Timeout) 错误的次数。

意味着这块硬盘在其生命周期内,已经发生过 4 次 主机命令没有在预期时间内完成的错误。

为什么会发生超时?

当主机向硬盘发送一个读写或其他命令时,主控芯片需要在规定时间内处理完毕并返回结果。如果超过这个时间,主机就会认为这次操作“超时”了。0F值增加一次。

导致超时的可能原因包括:

  1. 固件 Bug:主控固件在处理某些特定指令时出现卡顿或死锁。
  2. 硬件压力:主控因过热或高负载而性能下降,无法及时响应。
  3. NAND 闪存问题:读取或写入NAND闪存时遇到困难(比如需要非常强的ECC纠错),导致操作耗时远超预期。这与 0e错误密切相关

单独看 0f=4,这个数字本身并不算非常高,可能只是硬盘生涯中的几次小意外。

但是, 0e=10454 结合起来看!

  • 0e(媒体与数据完整性错误):表示“读”数据时发现了无法纠正的错误
  • 0f(主机指令超时):表示“响应命令”时发生了延迟或失败

这两者同时出现异常,极大地增加了问题的严重性:

0f超时很可能就是因为 0e错误引起的。过程可能是这样的:

  1. 主机请求读取某个逻辑扇区的数据。
  2. 主控通过FTL表找到对应的物理页面。
  3. 读取该物理页面时,发现数据错误严重(0e 错误增加),需要启动复杂的纠错算法来尝试恢复数据。
  4. 这个恢复过程非常耗时,导致主控无法在规定时间内响应主机
  5. 主机等不及了,记录一次 指令超时(0f 错误增加)
  6. 最后,主控要么成功恢复数据返回给主机,要么返回错误。


  1. 立即备份数据:这是最高优先级的任务。这块盘的可靠性已经严重下降,随时可能完全失效。
  2. 停止使用:不要再将它用于任何重要任务。
  3. 监控变化:如果你暂时还需观察,可以记录下 0e和 0f 的当前值。过一段时间再查看,如果这两个值还在继续增长,那就是硬盘正在加速死亡的明确信号。

总而言之,0f值为 4 本身不算灾难,但它和 0e 错误同时出现,就像病人不仅得了重病0e,还开始出现严重的并发症0f,这无疑确认了病情的严重性。

正常的smart数据应该是什么样的

=== START OF SMART DATA SECTION ===
SMART 整体健康自检测试结果: 通过
SMART/健康信息 (NVMe 日志 0x02, NSID 0xffffffff)
严重警告:                   0x00
温度:                        27 摄氏度
可用 Spare:                    100%
可用 Spare Threshold:          10%
已使用百分比:                    1%
读取数据单元:                    98,076,866 [50.2 TB]
写入数据单元:                    28,889,068 [14.7 TB]
主机读取命令:                    217,147,442
主机写入命令:                    146,219,369
控制器繁忙时间:                  114
电源循环次数:                    348
通电小时数:                      15,594
不安全关机次数:                   152
介质和数据完整性错误:    0
错误信息日志条目:       0
警告组件温度时间:       0 
严重组件温度时间:       0
温度传感器 1:               28 摄氏度
温度传感器 2:               39 摄氏度
错误信息 (NVMe 日志 0x01, 64个条目中的16个)
                    没有记录错误
自测日志 (NVMe 日志 0x06, NSID 0xffffffff)
自测状态: 无自测进行中
No Self-tests Logged

建议赶紧自查一下硬盘smart信息! 避免潜在的数据丢失风险!

还没有人送礼物,鼓励一下作者吧
高宇
自由评论 (0)
分享
Copyright © 2022 GreatFire.org