挂起的不可读扇区是返回读取错误并且驱动器已将其标记为在第一次可能的机会重新映射的扇区。但是,直到发生以下两种情况之一,它才能进行重新映射:
- 该部门已成功重读
- 该部门被改写
在此之前,该行业仍处于待定状态。因此,您有两种对应的方法来处理此问题:
- 继续尝试重读该扇区,直到成功
- 用新数据覆盖该扇区
显然,(1)是非破坏性的,因此您应该首先尝试一下,尽管请记住,如果驱动器开始严重故障,那么从坏区继续读取可能会使它更快地发生故障。 。如果您有很多待处理的扇区和其他错误,并且您关心驱动器上的数据,建议将其停用,并使用出色的工具ddrescue来恢复尽可能多的数据。然后丢弃驱动器。
如果所涉及的扇区包含您不关心的数据,或者可以从备份中还原数据,则覆盖它可能是最快,最简单的解决方案。然后,您可以查看驱动器的重新分配和挂起的计数,以确保已处理了该扇区。
您如何找出文件系统中对应的扇区?我发现了一个很好的文章了smartmontools网站,在这里,虽然这是相当的技术和特定于EXT2 / 3/4和Reiser文件系统。
我在自己的一个(Mac)驱动器上使用的一种更简单的方法是find / -xdev -type f -print0 | xargs -0 ...
用来读取系统上的每个文件。运行此记录之前,请记下待处理的计数。如果该扇区位于文件内部,则会从用于读取文件的工具(例如md5sum)中收到一条错误消息,其中显示了该文件的路径。然后,您可以将注意力集中在仅重新读取此文件上,直到成功读取为止。如果这是一个不经常使用的文件,只需重新读取几次,通常可以解决该问题。如果错误消失了,或者在读取所有文件时没有遇到任何错误,请检查挂起的计数以查看是否减少了。如果有,则通过阅读解决了该问题。
如果多次尝试(例如20次)后无法成功读取文件,则需要覆盖文件或文件中的块,以允许驱动器重新分配扇区。您可以在文件(而不是分区)上使用ddrescue来覆盖一个扇区,方法是将其复制到一个临时文件中,然后再复制回来。请注意,此时仅删除文件是一个坏主意,因为坏扇区将进入空闲列表,在该列表中很难找到。完全覆盖它也是不好的,因为这些扇区将再次进入空闲列表。您需要重写现有的块。该notrunc
的选项dd
是要做到这一点的方法之一。
如果您没有遇到任何错误,并且未决计数没有减少,则该扇区必须位于空闲列表中或文件系统基础结构的一部分中(例如,inode表)。您可以尝试使用填充所有可用空间cat /dev/zero >tempfile
,然后检查待处理的计数。如果问题解决了,那么问题就在空闲列表中,现在已经消失了。
如果该扇区位于基础架构中,那么您将遇到一个更严重的问题,并且仅在目录树中移动时可能会遇到错误。在这种情况下,我认为唯一明智的解决方案是重新格式化驱动器,必要时可以选择使用ddrescue恢复数据。
密切注意驱动器。扇区重新分配是煤矿中非常好的金丝雀,有可能给您预警驱动器发生故障。通过尽早采取措施,可以防止以后发生灾难性的非常痛苦的滑坡。我并不是在建议进行一些扇区重新分配,以表明您应该丢弃驱动器。所有现代驱动器都需要进行一些重新分配。但是,如果驱动器不是很旧(<1年),或者您经常进行新的重新分配(> 1个/月),那么我建议您尽快更换它。
我没有经验证据来证明这一点,但是我的经验表明,可以通过不时读取dd
原始磁盘或通过使用读取每个文件来一次读取整个磁盘来减少磁盘问题find
。在过去几年中,我遇到的几乎所有磁盘问题都首先出现在很少使用的文件中,或者出现在使用率不高的计算机上。这也具有启发意义,因为如果频繁地重新读取一个扇区,则驱动器有机会在它第一次检测到该扇区的小问题时重新分配它,而不必等到该扇区完全不可读为止。除非主机通过读取或写入它或通过执行一项SMART测试以某种方式访问它,否则该驱动器无法对扇区执行任何操作。
我想尝试每晚或每周一次的cron作业读取整个磁盘的想法。目前,我使用的是“穷人RAID”,其中的机器中有第二个硬盘驱动器,每晚我都会将主磁盘备份到其中。在某些方面,这实际上比RAID镜像要好,因为如果我错误地删除并删除了文件,则可以立即从备份磁盘上获取昨天的版本。另一方面,我认为硬件RAID控制器在后台可以很好地监视,报告和修复出现的磁盘问题。我当前的备份脚本用于rsync
避免复制未更改的数据,但是鉴于需要重新读取所有扇区,也许最好复制所有内容,或者有一个单独的脚本每周读取整个原始磁盘。