如何轻松修复 Linux 磁盘上的单个不可读块?

Nel*_*son 22 linux hard-drive lvm smart smartctl

我的 Linux 系统开始在系统日志中抛出 SMART 错误。我追踪了它并相信问题出在磁盘上的单个块上。我如何轻松地让磁盘重新分配那个块?我想知道在这个过程中哪个文件被破坏了。(我知道,如果磁盘上的一个块出现故障,其他块可能会出现故障;我有一个很好的持续备份,只想尝试保持该磁盘正常工作。)

在网上搜索会找到坏块 HOWTO,它描述了卸载磁盘上的手动过程。这看起来很复杂而且容易出错。是否有工具可以在 Linux 中自动执行此过程?我唯一的其他选择是制造商的诊断工具,但我认为这会破坏坏块而没有任何关于被破坏的东西的报告。最坏的情况,可能是文件系统元数据。

有问题的磁盘是主系统分区。使用 ext3fs 和 LVM。这是来自 syslog 的错误日志和来自 smartctl 的相关位。

smartd[5226]: Device: /dev/hda, 1 Currently unreadable (pending) sectors

Error 1 occurred at disk power-on lifetime: 17449 hours (727 days + 1 hours)
... Error: UNC at LBA = 0x00d39eee = 13868782
Run Code Online (Sandbox Code Playgroud)

pastebin有一个完整的 smartctl 转储。

ten*_*ner 35

我以前写过WD的磁盘固件,我曾经写过重新分配坏块的固件。

首先,大多数坏块是在读取而不是写入时检测到的。写入是盲目完成的,这意味着数据是在未经检查的情况下写入的。因此,如果介质坏了,在写入时,您不会知道它,直到主机对该扇区进行读取。有一小部分扇区(扇区头)在写入时读取以定位正确的扇区,因此如果读取扇区头时出现错误,驱动器将重新分配扇区并使用接收到的数据写入从写命令。但是绝大多数坏块是在读取时检测到的,仅仅因为写入成功到一个扇区并不意味着介质是好的或扇区已被重新分配。

现在关于坏块重新分配(也称为重新分配)。是的,如果错误足够严重(即 ECC 故障足够严重),驱动器通常会尝试重新分配扇区,但驱动器在 ECC 纠正后仍然可以恢复数据。通常这是自动完成的。唯一的例外是主机之前可以告诉驱动器不要进行自动重新分配,但很少这样做。

那么,如果驱动器进行了读取并且无法恢复数据,会发生什么情况呢?没有。将错误报告给主机,但不进行重新分配。问题是驱动器可以重新分配扇区,但它丝毫不知道要在新重新分配的扇区中写入什么数据。例如,如果它只是写了一堆零,然后再次读取该扇区,它将返回所有零,而没有任何迹象表明数据无效。这与数据损坏本质上是一样的。由于各种原因,驱动器不能指望主机跟踪错误(例如,如果将驱动器移到新主机上怎么办?)不能恢复。

但是,现代驱动器在无法重新分配时会保存坏扇区的位置。等待重新分配的坏扇区数可以在 SMART 数据中找到。会发生的情况是,如果对等待重新分配的坏扇区之一进行了写入,则重新分配已完成,因为在重新分配后驱动器现在具有要写入的有效数据。因此,当人们说写入坏扇区会重新分配它时,这实际上只是故事的一半。必须首先读取驱动器,以便驱动器可以发现所有无法自动重新分配的坏扇区。因此,您可以写入整个驱动器,并且 SMART 数据会显示没有等待重新分配的坏扇区,但您不一定清除驱动器中的所有坏扇区。所以如果你真的想清除所有坏扇区的驱动器,

还有其他处理无法重新分配的坏块的方法。如果驱动器是冗余 RAID 配置的一部分(即,除 RAID 0 之外的任何东西),RAID 软件应自动从其他驱动器恢复坏扇区的数据并将其写入重新分配的扇区。SCSI 磁盘具有明确的重新分配块命令,即使在没有有效数据写入块时,主机也可以使用该命令强制重新分配,但它的使用非常低级。

  • 可能还值得一提的是,至少一些希捷硬盘支持写入-读取-验证,可以使用“hdparm -R”打开它(假设是最近的 hdparm)。这会带来显着的写入性能损失(写入吞吐量和写入 IOPS 大约减半,因为现在每次写入都会引发后续读取),但如果您的硬件支持它并且您的工作负载读取繁重,那么这可能是一个非常可行的*预防性*措施。 (2认同)

Jam*_*mes 12

你可以试试hdparm --write-sector <LBA> /dev/ice

我不知道这样做的任何其他方式 - 您需要手动将 LBA 转换为文件系统块(正如您已经发现的那样)

  • 使用这种方法修复磁盘后,我可以说这是正确的方法。强制写入有问题的扇区将迫使驱动器面向该扇区,并且要么 (a) 获得成功写入,要么 (b) 以永久坏秒和重新映射结束。 (3认同)