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


22

我的Linux系统已开始在系统日志中引发SMART错误。我对其进行了追踪,并认为问题出在磁盘上的一个块上。我如何轻松地使磁盘重新分配该块?我想知道在此过程中销毁了什么文件。(我知道,如果磁盘上的一个块发生故障,其他磁盘块可能会接follow而至;我有一个良好的正在进行中的备份,只想尝试使该磁盘正常工作。)

在网上搜索会出现Bad block 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

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


我以为磁盘固件会在读取时自动重新映射坏块,因此从理论上讲已经完成了。如下所述,运行fsck(或适用于您的FS的等效设备)以确保覆盖的FS仍然稳定。
BuildTheRobots,2010年

2
我的理解是磁盘固件只会在写入时重新映射该块,而不会在读取时重新映射。因此,实际上我需要强制对相关块进行写操作。
尼尔森2010年

1
我终于淘汰了该磁盘。它运行了好几个月,但是在出现5次读取错误后,我放弃了。
尼尔森

Answers:


12

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

我不知道这样做的其他方式-您需要手动将LBA转换为文件系统块(如您所知)


哦,那是新国旗!这肯定会解决重新分配坏块的问题。现在,我所需要的只是一种简单的方法来查找会造成什么破坏的东西。
尼尔森2010年

3
使用此方法修复磁盘后,可以说这是正确的方法。强制对相关扇区进行写操作将迫使驱动器面向该扇区,并且(a)获得成功的写操作,或者(b)最终出现永久错误,并重新映射。
艾利·佩恩


奇怪的是,这个迭代过程(通过SMART查找下一个坏扇区并强制对其进行重新分配)没有使用简单的实用程序来自动化!..
imz-Ivan Zakharyaschev 2013年

32

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

首先,大多数坏块是在读取而非写入时检测到的。写入是盲目的完成的,这意味着无需检查即可写入数据。因此,在写操作中,如果介质损坏,您将不会知道它,直到主机对该扇区进行读取为止。写入时会读取一小部分扇区(扇区头),以找到正确的扇区,因此,如果在读取扇区头时出错,驱动器将重新分配该扇区并将其与接收到的数据一起写入从写命令。但是,绝大多数坏块是在读取时检测到的,仅因为对某个扇区的写操作成功并不意味着介质良好或该扇区已被重新分配。

现在讨论坏块的重新分配(也称为重新分配)。是的,如果错误足够严重(例如,ECC故障足够严重),则驱动器通常将尝试重新分配扇区,但是驱动器在ECC校正后仍可以恢复数据。通常,这是自动完成的。唯一的例外是,主机以前可能已经告诉驱动器不要进行自动重新分配,但这很少完成。

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

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

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


1
也许值得一提的是,至少某些Seagate HDD支持Write-Read-Verify,可以使用hdparm -R(假设是相当新的hdparm)将其打开。这会带来严重的写入性能损失(大约将写入吞吐量和写入IOPS减半,因为现在每次写入都会导致后续的读取),但是如果您的硬件支持它并且您的工作负载很重,那么这可能是一个非常可行的预防措施。
CVn

2

我认为您要做的就是:

e2fsck -c /dev/hda1

假设/ dev / hda1是(未安装的)分区。要么:

e2fsck -c -c /dev/hda1

进行(较慢的)无损读写测试。仍然必须将其卸载。不过,我认为这不会为您提供任何丢失数据的详细信息。


遗憾的是,它似乎没有使用SMART中有关坏块的信息。我想知道为什么没有fsck工具会使用来自SMART的坏块信息并尝试避免它们或按照smartmontools.sourceforge.net/badblockhowto.htmlserverfault.com/a/106130/68972中所述修复受影响的文件。 ..
imz – Ivan Zakharyaschev 2014年

2

迈克尔说得对,在大多数情况下,我会说只需更换便宜的驱动器即可。但是,如果您没有备份并且无法从驱动器中获取重要数据,或者只想尝试修复驱动器,那么您可能希望尝试在最高级别上使用spinrite

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


纳尔逊(Nelson)您只是要否决所有您不想听到的答案吗?健康的驱动器会自动重新映射坏块。如果您必须竭尽全力执行此操作,则驱动器将不再健康,应将其更换。
3dinfluence 2010年

不,我只投票给一个答复,因为它没有回答我的问题。您建议使用尖晶石,谢谢!我的理解是,健康的驱动器在写入之前不会重新映射坏扇区。我试图找到最简单的强制写入的方法。查看Matthew的建议,看看fsck是否足够聪明。
尼尔森2010年

抱歉,看到2个答案被快速否决后,我跳到了那里的结论,您回答了我认为是您的另一个答案。
3dinfluence 2010年

2
正确的是,对块的写入失败时会发生坏扇区重映射。如果就文件系统而言,您只是有一个损坏的块,那么如果所讨论的块是元数据块,则fsck可能会解决您的问题。fsck实际上只是扫描并纠正元数据中的错误。因此,它不能保证数据本身。诸如BTRFS和ZFS的下一代文件系统可以检测到是否存在冗余,并且可以纠正数据错误。Spinrite还会在读取时强制执行此操作,然后写入反转的数据,重新读取,然后将数据反转到每个块上,作为其扫描的一部分。
3dinfluence 2010年

1

如果您有备份,并且知道这是逻辑错误而不是物理错误,那么最好的解决方法是将光盘清零。

我会使用MHDD,它非常容易使用,只要您记得将Bios中的HDD设置为IDE仿真,然后在完成工作后再回到AHCI,就无需担心。

引导到MHDD后,在ERASE命令中选择驱动器类型并确认选择。

让自己的咖啡,这可能需要一段时间。

将驱动器归零后,将重新映射设置为ON(默认为关闭),运行scan(f4)。如果驱动器仍然存在问题(这意味着盘片上存在物理损坏,并且驱动器处于向下倾斜的平稳状态),则此选项将通过将损坏的区域映射到驱动器的正常位置来“修复”它们。

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


-1

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


我明确地知道磁盘已损坏,并进行了备份以避免风险。
尼尔森2010年

2
那只是意味着您愿意赌博。我不认为这意味着不应替换它,只是您愿意忽略该建议。我怀疑任何备份都可以在磁盘崩溃时从系统中拯救自己,而随着事情的恶化,事情只会变得非常不稳定。
Michael Graff 2010年

3
这个答案应该是一个评论...这个问题很具体,很有意义。因此,这不是答案。
皮托2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.