如何从命令行进行磁盘表面扫描并修复/重新分配 Linux 中的坏扇区?

如何从命令行进行磁盘表面扫描并修复/重新分配 Linux 中的坏扇区?

我购买了一块有一些坏扇区的磁盘,计划修复它们,然后将其用作 RAID 6 集群的一部分。我可以在Windows下进行坏扇区修复,有很好的坏块修复工具,但在Windows下,过程很慢,修复一个扇区需要15分钟。

根据我的经验,Linux 更擅长处理不及时响应的设备,这使得 Linux 下的处理速度更快。但是,我检查了fsck手册,但没有找到任何用于表面和坏块扫描或坏块重新分配的有用选项。

如何从命令行扫描硬盘表面并修复/重新分配 Linux 中的坏扇区?

答案1

这个答案是关于磁盘的。 SSD 则不同。此外,该磁盘上没有数据(或没有您想要保留的数据);看我对“我可以用一个命令修复硬盘上的坏块吗”的回答了解如果磁盘上有重要数据该怎么办。

至少从 90 年代末开始生产的磁盘可以自行管理坏块。简而言之,磁盘将通过透明地用备用扇区替换坏块来处理坏块。如果 (a) 在读取时,它发现该块是“弱”的,但 ECC 足以恢复数据; (b)写入时发现扇区头坏; (c) 写入时,如果先前读取时检测到该扇区已损坏,但数据不可恢复。

磁盘固件通常允许您通过 SMART 属性监控此过程(至少是计数)。通常,至少会有一个重新分配的扇区计数和两个待处理扇区计数(读取时发现错误、ECC 失败、尚未写入)。

有两种方法可以让磁盘发现坏扇区:

  1. 用于smartctl -t offline /dev/sdX告诉磁盘固件进行离线表面扫描。然后,您只需保留磁盘(完全空闲最快),直到完成(检查 中的“离线数据收集状态” smartctl -c /dev/sdX)。这通常会更新 SMART 中的“离线不可纠正”计数。 (注意:驱动器可以配置为自动定期运行离线检查。)

  2. 让 Linux 读取整个磁盘,例如badblocks -b 4096 -c 1024 -s /dev/sdX.这通常会更新 SMART 中的“当前挂起扇区”计数。

上述任何一种情况也可能会增加重新分配的扇区数——这是情况 (b),ECC 恢复了数据。

现在,要恢复这些扇区,您只需写入它们即可。通常,这将是一个简单的pv -pterba /dev/zero > /dev/sdX(或只是简单的cat, or dd您计划将它们作为 RAID 阵列的一部分。RAID init 无论如何都会写入整个磁盘,所以这是没有意义的。唯一的例外是磁盘的开头和结尾,可能会丢失几十兆字节(由于对齐、标头等原因)。所以:

disk=/dev/sdX
end=$(echo "$(/sbin/blockdev --getsize64 "$disk")/4096-32768" | bc)
dd if=/dev/zero bs=4096             count=32768 of="$disk"   # first 128 MiB
dd if=/dev/zero bs=4096 seek="$end" count=32768 of="$disk"   # last 128 MiB

我想我设法避免了上面最简单的栅栏错误1,因此应该清空磁盘的第一个和最后一个 128MiB。然后让 mdadm raid init 编写剩下的部分。不过,如果您愿意的话,将整个磁盘归零是无害的(除了轻微的磨损和浪费数小时的时间)。

另一件事要做,如果您的磁盘支持它:(smartctl -l scterc,40,100或任何数字)告诉磁盘您它会更快地放弃纠正读取错误——40 就是 4 秒。这两个数字分别是读错误和写错误; mdraid 将通过奇偶校验轻松纠正读取错误(并将失败的扇区写回磁盘以使其重新分配)。但是,写入错误会使磁盘从阵列中退出。

PS:请务必关注重新分配的扇区数。该属性失败是个坏消息。如果它持续增加,那也是个坏消息。

PPS:确保定期清理您的 RAID 阵列(读取每个扇区并验证所有奇偶校验)。许多发行版已经发布了每月执行此操作的脚本。这将检测并修复任何新的坏块,否则很少读取的坏块可能会徘徊并最终导致重建失败。


1栅栏错误 - 一种由于未能计算其中一端而导致的差一错误。命名自如果每 3 英尺有一个栅栏柱,那么 9 英尺的独立式栅栏中有多少个栅栏柱?正确答案是4;栅栏柱错误为 3,是由于未计算开头或结尾的柱子所致。

答案2

如果您发现了可见的坏块,则磁盘可能很快就会损坏。除非您有一个非常旧的磁盘,否则坏块替换是在内部处理的,您不会看到它们。如果您看到这些,则替换块缓存显然已耗尽。

我不会在这种状态下使用磁盘,可能会擦除它然后扔掉它。

相关内容