硬盘读取错误...停止?

Ric*_*shi 10 hardware linux errors drive-failure

我的故事开始很简单。我有一台运行 Arch Linux 的轻型服务器,它将大部分数据存储在由两个 SATA 驱动器组成的 RAID-1 上。它工作了大约 4 个月没有任何问题。然后,突然间我开始在其中一个驱动器上出现读取错误。总是,这些消息看起来很像这样:

Apr 18 00:20:15 hope kernel: [307085.582035] ata5.01: exception Emask 0x0 SAct 0x0 SErr 0x0 action 0x0
Apr 18 00:20:15 hope kernel: [307085.582040] ata5.01: failed command: READ DMA EXT
Apr 18 00:20:15 hope kernel: [307085.582048] ata5.01: cmd 25/00:08:08:6a:34/00:00:27:00:00/f0 tag 0 dma 4096 in
Apr 18 00:20:15 hope kernel: [307085.582050]          res 51/40:00:0c:6a:34/40:00:27:00:00/f0 Emask 0x9 (media error)
Apr 18 00:20:15 hope kernel: [307085.582053] ata5.01: status: { DRDY ERR }
Apr 18 00:20:15 hope kernel: [307085.582056] ata5.01: error: { UNC }
Apr 18 00:20:15 hope kernel: [307085.621301] ata5.00: configured for UDMA/133
Apr 18 00:20:15 hope kernel: [307085.640972] ata5.01: configured for UDMA/133
Apr 18 00:20:15 hope kernel: [307085.640986] sd 4:0:1:0: [sdd] Unhandled sense code
Apr 18 00:20:15 hope kernel: [307085.640989] sd 4:0:1:0: [sdd]  Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE
Apr 18 00:20:15 hope kernel: [307085.640993] sd 4:0:1:0: [sdd]  Sense Key : Medium Error [current] [descriptor]
Apr 18 00:20:15 hope kernel: [307085.640998] Descriptor sense data with sense descriptors (in hex):
Apr 18 00:20:15 hope kernel: [307085.641001]         72 03 11 04 00 00 00 0c 00 0a 80 00 00 00 00 00 
Apr 18 00:20:15 hope kernel: [307085.641010]         27 34 6a 0c 
Apr 18 00:20:15 hope kernel: [307085.641020] sd 4:0:1:0: [sdd]  Add. Sense: Unrecovered read error - auto reallocate failed
Apr 18 00:20:15 hope kernel: [307085.641023] sd 4:0:1:0: [sdd] CDB: Read(10): 28 00 27 34 6a 08 00 00 08 00
Apr 18 00:20:15 hope kernel: [307085.641027] end_request: I/O error, dev sdd, sector 657746444
Apr 18 00:20:15 hope kernel: [307085.641035] ata5: EH complete
Apr 18 00:20:15 hope kernel: [307085.641672] md/raid1:md16: read error corrected (8 sectors at 657744392 on sdd1)
Apr 18 00:20:17 hope kernel: [307087.505082] md/raid1:md16: redirecting sector 657742336 to other mirror: sdd1
Run Code Online (Sandbox Code Playgroud)

每个错误都抱怨不同的扇区号,并且伴随着用户(我)访问磁盘的几秒钟延迟。

我检查了 smartctl 输出,看到了以下输出(不相关的部分被剪掉了):

ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  1 Raw_Read_Error_Rate     0x002f   193   193   051    Pre-fail  Always       -       1606
  5 Reallocated_Sector_Ct   0x0033   194   194   140    Pre-fail  Always       -       0
196 Reallocated_Event_Count 0x0032   162   162   000    Old_age   Always       -       0
197 Current_Pending_Sector  0x0032   200   200   000    Old_age   Always       -       51
Run Code Online (Sandbox Code Playgroud)

回顾日志,我发现这些错误实际上已经发生了几天,主要是在备份期间,但在非常轻的使用期间也经常发生(这意味着我大约每 5 次尝试保存文本文件一次)。我的结论是我的磁盘快要死了,RAID-1 正在适当地处理它,是时候订购更换磁盘了。我订购了一个新磁盘。

令我惊讶的是,一天后,错误......停止了。我没有做任何事情来修复它们。我没有重新启动,没有使驱动器离线,什么都没有。但错误刚刚停止。

那时,我很想知道坏扇区现在是否只是在磁盘的空闲部分,我将磁盘从 RAID 中取出,放回 RAID 中,并让它完成随后的完全重新同步。9 小时后重新同步完成,没有任何错误(2TB 磁盘需要一段时间)。

此外,smartctl 输出也发生了一些变化,如下所示:

ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  1 Raw_Read_Error_Rate     0x002f   193   193   051    Pre-fail  Always       -       1606
  5 Reallocated_Sector_Ct   0x0033   194   194   140    Pre-fail  Always       -       43
196 Reallocated_Event_Count 0x0032   162   162   000    Old_age   Always       -       38
197 Current_Pending_Sector  0x0032   200   200   000    Old_age   Always       -       0
Run Code Online (Sandbox Code Playgroud)

所以,让我感到奇怪的部分当然是“坏磁盘从什么时候开始自我修复?”

我想有可能驱动器的一个非常小的区域自发地坏了,并且驱动器在其扇区重新分配代码启动之前只花了 3 天(!),并将一些备用扇区映射到磁盘的坏区域......但我不能说我见过这种情况发生。

有没有其他人见过这种行为?如果是这样,您后来的驾驶体验如何?又发生了吗?磁盘最终是否完全失效?或者这只是一个无法解释的故障,仍然无法解释?

就我而言,我已经有了更换驱动器(在保修期内获得),所以我可能只会更换驱动器。但我很想知道我是否以某种方式误诊了这一点。如果有帮助,我有问题发生时的完整“smartctl -a”输出。只是有点长,所以我没有在这里发布。

Edd*_*die 9

如果驱动器表面的一个特定物理区域出现故障,那么在成功映射这些扇区之前,当您尝试读取写入该区域的任何数据时,您将遇到无法恢复的读取错误。驱动器知道扇区坏了(在访问扇区失败之后),但不能重新映射扇区,因为它们已经保存了数据。如果您格式化驱动器或覆盖“坏”扇区,则驱动器将有机会映射出坏扇区。

一旦坏扇区被映射出来,只要更多的驱动器表面没有出现故障,你就处于良好状态。

我对当前驱动器的驱动器故障模型知之甚少,无法了解介质表面的某一部分变坏与问题扩散或再次发生之间是否存在很大关联。如果没有相关性,那么一旦坏扇区被绘制出来,你就处于良好状态。如果相关性,那么这是最终的驱动的开始。


小智 5

大多数现代驱动器都会“引导出”已损坏的块。驱动器有一个备用块池,固件使用这些备用块来替换驱动器已知的损坏块。当驱动器无法读取块时,它无法执行此重新映射,因为它无法提供正确的数据。它只是返回“读取错误”。它确实将该块标记为坏块,因此如果该块确实读取正确,则该块将被矢量化,并将正确的数据写入替换块。如果操作系统曾经写入处于“向量输出挂起”状态的块,则该块将被向量输出,并将数据写入替换块。

Linux 软件 raid 将从设备中获取读取错误时,从阵列中的其他元素获取正确的数据,然后尝试再次写入坏块。因此,如果写入工作正常,则数据是安全的,如果不是,驱动器只需执行上述操作,引导块,然后执行写入。所以,在 raid 系统的帮助下,驱动器刚刚自我修复!

假设此类事件相当罕见,那么继续下去可能是安全的。如果使用了太多的替换块,则驱动器可能有问题。可以将多少个替换块引导到备用块是有限制的,这是驱动器的功能。