如何使我的磁盘取消映射挂起的不可读扇区

如何使我的磁盘取消映射挂起的不可读扇区

根据 smartd 的说法,我的磁盘上有一些待处理的不可读扇区。让磁盘重新映射它们并阻止 smartd 抱怨的最简单方法是什么?

今天,我每小时都会收到两个这样的信息:

9 月 10 日 23:15:35 hylton smartd[3353]:设备:/dev/sdc,1 当前不可读(待处理)扇区

该系统是运行Ubuntu Linux 9.10(jaunty)的x86系统。该磁盘是 LVM 组的一部分。这是 smartctl 识别磁盘的方式:

型号系列:Western Digital Caviar 第二代串行 ATA 系列
设备型号:WDC WD5000AAKS-00TMA0
序列号:WD-WCAPW4207483
固件版本:12.01C01
用户容量:500,107,862,016字节

答案1

挂起的不可读扇区是返回读取错误的扇区,并且驱动器已将其标记为在第一个可能的机会重新映射。但是,除非发生以下两种情况之一,否则它无法进行重新映射:

  1. 该扇区重读成功
  2. 该扇区被重写

在此之前,该行业仍悬而未决。所以你有两种相应的方法来处理这个问题:

  1. 继续尝试重新阅读该行业,直到成功
  2. 用新数据覆盖该扇区

显然,(1) 是非破坏性的,因此您可能应该首先尝试它,但请记住,如果驱动器开始出现严重故障,那么从坏区域连续读取可能会使其更快地出现故障。如果您有很多待处理的扇区和其他错误,并且您关心驱动器上的数据,我建议将其停止使用并使用出色的工具解救恢复尽可能多的数据。然后丢弃驱动器。

如果相关扇区包含您不关心的数据,或者可以从备份中恢复,那么覆盖它可能是最快、最简单的解决方案。然后,您可以查看驱动器的重新分配和待处理计数,以确保该扇区得到处理。

如何找出该扇区在文件系统中对应的内容?我发现了一篇关于智能监控工具网站,这里,尽管它相当技术性并且特定于 ext2/3/4 和 reiser 文件系统。

我在自己的一个(Mac)驱动器上使用的一种更简单的方法是find / -xdev -type f -print0 | xargs -0 ...读取系统上的每个文件。在运行之前记下待处理的计数。如果该扇区位于文件内,您将从用于读取文件的工具(例如 md5sum)中收到一条错误消息,显示该扇区的路径。然后,您可以集中精力重新读取该文件,直到成功读取为止。如果它是一个不常用的文件,只需要重新读取几次,通常这可以解决问题。如果错误消失,或者您在读取所有文件时没有遇到任何错误,请检查待处理计数以查看其是否减少。如果有,则问题已通过阅读解决。

如果多次尝试(例如 20 次)后仍无法成功读取文件,则需要覆盖该文件或文件内的块,以允许驱动器重新分配该扇区。您可以在文件(而不是分区)上使用 ddrescue 来仅覆盖一个扇区,方法是复制到临时文件,然后再次复制回来。请注意,此时仅删除文件是一个坏主意,因为坏扇区将进入空闲列表,在那里很难找到。完全覆盖它也很糟糕,因为这些扇区将再次进入空闲列表。您需要重写现有的块。选项是执行此操作的一种方法notruncdd

如果没有遇到错误,并且待处理计数没有减少,则该扇区必须位于空闲列表中或属于文件系统基础结构的一部分(例如索引节点表)。您可以尝试用 填充所有可用空间cat /dev/zero >tempfile,然后检查待处理计数。如果出现故障,则问题出在空闲列表中,并且现在已经消失。

如果该扇区位于基础设施中,则会遇到更严重的问题,并且在遍历目录树时可能会遇到错误。在这种情况下,我认为唯一明智的解决方案是重新格式化驱动器,如有必要,可以选择使用 ddrescue 来恢复数据。

密切关注驱动器。行业重新配置是非常好的煤矿里的金丝雀,可能会提前警告您驱动器出现故障。通过尽早采取行动,您可以防止以后发生灾难性的、非常痛苦的山体滑坡。我并不是建议一些扇区重新分配就表明您应该丢弃该驱动器。所有现代驱动器都需要进行一些重新分配。但是,如果驱动器不是很旧(< 1 年)或者您经常进行新的重新分配(> 1/月),那么我建议您尽快更换它。

我没有经验证据来证明这一点,但我的经验表明,可以通过偶尔读取整个磁盘来减少磁盘问题,无论是通过dd原始磁盘还是通过使用find.过去几年我遇到的几乎所有磁盘问题都首先出现在很少使用的文件中,或者在不经常使用的机器上。这也具有启发性,因为如果经常重新读取某个扇区,则驱动器在第一次检测到该扇区的小问题时有机会重新分配它,而不是等到该扇区完全无法读取。驱动器无法对扇区执行任何操作,除非主机以某种方式访问​​该扇区(通过读取或写入该扇区或通过执行其中一项 SMART 测试)。

我想尝试每晚或每周读取整个磁盘的 cron 作业的想法。目前我正在使用“穷人的RAID”,其中我的机器中有第二个硬盘驱动器,并且我每晚都会将主磁盘备份到它。在某些方面,这实际上比 RAID 镜像更好,因为如果我误删了一个文件,我可以立即从备份磁盘获取昨天的版本。另一方面,我相信硬件 RAID 控制器在后台做了很多出色的工作来监视、报告和修复出现的磁盘问题。我当前的备份脚本用于rsync避免复制未更改的数据,但鉴于需要重新读取所有扇区,可能最好复制所有内容,或者有一个单独的脚本每周读取整个原始磁盘。

答案2

  1. 备份您的数据
  2. 从 LVM 组中删除该设备
  3. dd if=/dev/zero of=/dev/sdc bs=4k- 这会删除所有数据/dev/sdc
  4. 再次将其纳入LVM组
  5. 恢复您的备份

答案3

使用 Data Lifeguard Diagnostic for DOS(可启动 CD)软件,可从西部数据网站

相关内容