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

我的Linux系统已经开始在系统日志中抛出SMART错误。 我追查下来,并相信问题是磁盘上的一个单一的块。 如何轻松获得磁盘重新分配一个块? 我想知道在这个过程中被破坏了什么文件。 (我知道,如果一个磁盘在磁盘上出现故障,其他人可能会遵循;我有一个很好的持续备份,只是想保持这个磁盘的工作。)

search网页会导致Bad block HOWTO ,它描述了一个卸载磁盘上的手动过程。 看起来很复杂,容易出错。 有没有一种工具在Linux中自动执行这个过程? 我唯一的select是制造商的诊断工具 ,但我认为这会打破坏块没有任何报告被毁坏。 最糟糕的情况是,它可能是文件系统元数据。

有问题的磁盘是主要的系统分区。 使用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 

在pastebin 上有一个完整的smartctl转储。

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

    我不知道这样做的其他方式 – 您需要手动将LBA转换为文件系统块(就像您已经find的那样)

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

    首先,大部分坏块在读取时被检测到,而不是写入。 写入是盲目完成的,这意味着数据被写入而不被检查。 因此,如果媒体不好,你就不会知道,直到主机读取到该扇区。 有一小部分扇区(扇区头部)在写入时被读取以定位正确的扇区,所以如果在读取扇区头部时出现错误,则驱动器将重新分配扇区并将其与接收到的数据一起写入从写命令。 但绝大多数坏块是在读取时检测到的,只是因为写入成功到一个扇区并不意味着媒体是好的,或者该扇区已被重新分配。

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

    那么如果硬盘读取数据并且不能恢复数据呢? 没有。 错误被报告给主机,但是没有重新分配。 问题是驱动器可以重新分配这个扇区,但是没有丝毫的想法在新分配的扇区中写入什么数据。 如果它只写了一堆零,然后再重新读取这个扇区,它将返回所有的零而没有任何数据无效的指示。 这与数据损坏本质上是一样的。 由于各种原因(例如,如果将驱动器移动到新主机上?),驱动器不能指望主机跟踪错误,所以最好的方法是在数据“不能恢复。

    然而,现代驱动器在不能重新分配时会节省坏扇区的位置。 可以在SMART数据中find等待重新分配的坏扇区的数量。 会发生什么情况是,如果对等待重新分配的其中一个坏扇区执行写操作,则重新分配完成,因为驱动器现在具有有效数据以在重新分配后写入它。 因此,当人们说写坏的部分将重新分配,这只是故事的一半。 驱动器必须先读取,以便驱动器可以发现所有不能自动重新分配的坏扇区。 因此,您可以编写整个驱动器,而SMART数据会说没有坏扇区在等待重新分配,但是您不一定清除了所有坏扇区的驱动器。 所以,如果你真的想清除所有坏扇区的驱动器,最好是先读取整个驱动器,然后写整个驱动器(当然这会破坏驱动器上的所有数据)。

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

    我认为你所要做的就是:

     e2fsck -c /dev/hda1 

    假设/ dev / hda1是(卸载的)分区。 要么:

     e2fsck -c -c /dev/hda1 

    做一个(慢)非破坏性的读写testing。 它仍然必须被卸载。 但是,我不认为这会给你任何丢失数据的细节。

    迈克尔是正确的,在大多数情况下,我会说只是取代他们便宜的驱动器。 但是,如果您没有备份,并且无法从驱动器获取重要数据,或者只想尝试修复驱动器,则可能需要尝试在最高级别使用sprite 。

    几年前,我有一台笔记本电脑,开始发出一些噪音。 Badblocks显示驱动器有118个左右坏块可见的最终用户。 由于我已经有了一个SpinRite的副本,所以我决定在购买一个新的驱动器之前尝试一下。 在驱动器上运行sprite后,badblocks显示0个坏块,噪声停止。 从那以后,这个驱动器已经工作了两年多了。

    如果你有备份,而且你知道这是一个逻辑错误而不是物理上的错误,那么最好的办法是将磁盘清零。

    我会使用MHDD,它使用起来相当简单,只要你记得把你的硬盘设置到IDE模拟,然后回到AHCI,当你的工作完成,你没有什么可担心的。

    一旦启动到MHDD,请在ERASE命令中select您的驱动器types并确认您的select。

    得到你自己的coffie这可能需要一段时间。

    驱动器清零后,运行扫描(f4),并将Remap设置为ON(默认为closures)。 如果驱动器仍然存在问题(这意味着盘片上有物理损坏,驱动器在斜坡上),此选项将通过将损坏区域映射到驱动器的健康部分来“修复”它们。

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

    如果磁盘坏了,请更换它。 它不值得冒更多的风险。