如何轻松修复 Linux 磁盘上单个无法读取的块?

如何轻松修复 Linux 磁盘上单个无法读取的块?

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

搜索网络后发现坏块指南,描述了在未安装的磁盘上手动执行的过程。这看起来很复杂,而且容易出错。有没有在 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

这里有完整的 smartctl 转储在 pastebin 上

答案1

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

我不知道还有其他方法可以做到这一点 - 您需要手动将 LBA 转换为文件系统块(正如您已经发现的那样)

答案2

我曾经为WD编写过磁盘固件,并且曾经编写过重新分配坏块的固件。

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

现在谈谈坏块重新分配(也称为重新分配)。是的,通常情况下,如果错误足够严重(即 ECC 故障足够严重),驱动器将尝试重新分配扇区,但驱动器在 ECC 校正后仍可以恢复数据。通常这是自动完成的。唯一的例外是主机可以事先告诉驱动器不要进行自动重新分配,但这种情况很少发生。

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

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

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

答案3

我认为你所要做的就是:

e2fsck -c /dev/hda1

假设 /dev/hda1 是(未挂载的)分区。或者:

e2fsck -c -c /dev/hda1

进行(较慢的)非破坏性读写测试。它仍然必须卸载。不过,我认为这不会为您提供有关任何丢失数据的详细信息。

答案4

如果您有备份并且知道这是一个逻辑错误而不是物理错误,那么解决这个问题的最佳方法就是将磁盘清零。

我会使用 MHDD,它相当容易使用,只要您记得在 Bios 中将您的 HDD 设置为 IDE 仿真,然后在您的工作完成后返回 AHCI,您就不必担心任何事情。

一旦您启动到 MHDD,请在 ERASE 命令中选择您的驱动器类型并确认您的选择。

给自己一杯咖啡,这可能需要一段时间。

驱动器清零后,运行扫描 (f4),并将重映射设置为开启 (默认关闭)。如果驱动器仍有问题 (这意味着盘片上有物理损坏,驱动器处于稳定的下坡状态),此选项将通过将损坏区域映射到驱动器的正常部分来“修复”它们。

如果没有 UNC 错误,那么恭喜你,并且你的驱动器在未来几年内仍然可以是朋友。

相关内容