如何使磁盘取消映射待处理的不可读扇区


10

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

2
这个问题解决了。磁盘开始大声抱怨,所以我将其更换。
dkagedal

Answers:


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


2
如果您执行备份(不同步到内部磁盘;),那么所有数据将在特定时间间隔内(重新)读取(取决于完整/增量备份计划)。RAID或rsync不能替代备份。顺便说一句,我“相信”您对硬件RAID供应商非常有信心。;)
maxschlepzig

@maxschlepzig:你是对的。我也有一个单独的备份机制。但是,根据我的经验,由于驱动器故障而导致数据丢失的可能性远远超过所有其他风险(盗窃,火灾等)。现代硬盘的可靠性很差,以至于我如今对它们完全感到偏执。因此,我的第二个内部动力是我策略的重要部分。
尼尔·梅休

我已经读取并重新读取了磁盘中使用的内容,dd if=/dev/sda ...并且扇区仍然处于挂起状态,为什么?
dmansfield 2014年

@dmansfield,如果您没有遇到任何错误,那么我不确定为什么。我注意到,智能输出中只有原始值才是准确的,因此,如果您仅查看“煮熟的”值,则可能是您没有任何待处理的扇区。
尼尔·梅休


1
  1. 备份资料
  2. 从LVM组中删除此设备
  3. dd if=/dev/zero of=/dev/sdc bs=4k-这将清除所有数据/dev/sdc
  4. 再次将其包含在LVM组中
  5. 恢复您的备份

3
0.备份。:-)
Steven D

但这是一个未决的读取错误,所以仅读取所有扇区是否足够?
dkagedal

1
@dkagedal:不,HD的固件已经检测到无法读取该扇区。它没有办法恢复它(单独,也许还有重试和重试,并且在某些时候运气...希望它没有损坏的数据然后返回),因此设置了此SMART错误。但是,如果固件在该特定扇区上检测到写操作,则它将该扇区映射掉(并且不再使用它),而是将一个备用(工作)扇区映射到该地址。
maxschlepzig

@dkagedal:有时仅读取一两次,就会使该领域恢复正常。其他时候,没有任何东西会把它带回来。此外,驱动器会根据原始错误的严重性以及在写入后是否可以成功地回读,在内部决定是重新映射该扇区还是重新使用该扇区。您唯一可以知道的方法是查看驱动器的重新分配计数。我相信驱动器会使用相当广泛的校验和,以确保读取数据时不会损坏它,因此您可以对未分配的扇区有一定的信心。
尼尔·梅休
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.