「Linux」- 使用badblock命令检查磁盘坏块

badblock

实用程序 badblock 用于检测磁盘中的坏块。它支持以下几种扫描模式:

只读模式 – 默认模式,但是精准度是最低的;

写入模式 – 有害模式,这是最精准的模式,但是检测时间较久,并且会破坏所有数据;

读写模式 – 无害模式,精准度与写入模式差不多,但是最慢。

如果已知硬盘存在坏块,那只读模式应该是最安全的。

扫描磁盘

使用如下命令可以对磁盘进行扫描:

#!/bin/sh

################################################################################
#1 使用fdisk命令确定要检查的磁盘
################################################################################
fdisk -l # 或者lsblk命令

################################################################################
#2 然后扫描磁盘(这里是/dev/sdc分区)
################################################################################
badblocks -v /dev/sdc > badsectors.txt

#「-v」- 显示操作的细节
#「> badsectors.txt」- 将扫描结果保存到文件中。命令e2fsck、fsck等等可以使用该文件。

################################################################################
#3 扫描特定分区
################################################################################
badblocks -v /dev/sdc1 > badsectors.txt

全盘扫描

但是全盘扫描由一个缺点:每个文件系统”相对于它所在的分区“开始进行块计算。

假如你的第二个分区存在坏块,并且该分区从块1000开始。在进行全盘扫描得到坏块值,减去1000后,得到的值才是你想要的坏块值,后面的计算也要基于该值。

或者,在全盘扫描之后,再单独对坏块所在的分区进行扫描。这样就不需要进行数学计算。

块大小

另外需要注意的是块大小:命令badblock使用1024 BYTE块,因此你需要使用-b选项调整块大小,以匹配在文件系统中的块大小。否则,需要进行数学计算来转换为文件系统块值。

!!!因为在进行文件系统相关的处理时,需要知道文件系统的块大小。通过对应的块大小,得到文件系统中块位置。

分区起始与结束

可以使用fdisk(8)命令确定分区的开始与结束。(对于旧版本的输出,以cylinder为单位,你需要使用-u选项指定以sector为单位)

在使用fdisk命令确定块大小之后,以就可以对块数进行转换,以符合扫描结果。

最后总结

至此,你已经得到了坏块值,该值相对于他们所在的分区。

参考文献

archlinux/Identify damaged files/Finding bad sectors