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

dka*_*dal 11 linux ubuntu hardware

根据 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 字节

Nei*_*hew 15

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

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

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

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

显然,(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避免复制未更改的数据,但鉴于需要重新读取所有扇区,也许最好复制所有内容,或者使用单独的脚本每周读取整个原始磁盘。

  • 如果您进行备份(rsyncing 到内部磁盘不算;)),那么您的所有数据都会在特定时间间隔内(重新)读取(取决于您的完整/增量备份计划)。RAID 或 rsync 不是备份替代品。顺便说一句,我“相信”您对硬件 RAID 供应商过于信任。;) (2认同)