Linux检测磁盘坏块工具-badblocks
2015-06-06 17:22:13 阿炯

badblocks是一个检查磁盘是否有坏道的工具,可以以读的方式检查,也可以以写的方式检查。当你觉得硬盘上可能有坏道,或者是SMART数据显示有坏道的时候,都可以用badblocks来检查一下。

badblocks -v /dev/sdb > /tmp/bad-blocks.txt

只需将“/dev/sdb”替换为自己机器的硬盘/分区。执行完成上述命令后,一个名为“bad-blocks”文本文档将会在/tmp下创建,它将包含所有的损坏区块。

badblocks [-svw][-b <区块大小>][-o <输出文件>][磁盘装置][磁盘区块数][启始区块]

执行指令时须指定所要检查的磁盘装置,及此装置的磁盘区块数。

假设我们要检查的硬盘是/dev/sdb
badblocks -s -v -o sdbbadblocks.log /dev/sdb

这样就可以对硬盘进行只读扫描,自动获取硬盘块数目并扫描全部块,将扫描日志输出到屏幕同时记录在sdbbadblocks.log文件中。由于扫描速度比较低,一次不一定能扫完,可以分多次进行。

badblocks -s -v -o sdbbadblocks.log /dev/sdb END START
将END和START换成结束和开始的块的编号就可以了。如果找到了坏道,可以进行写入扫描进行修复,写入扫描遇到坏道的时候会自动重映射。写入扫描会覆盖原有数据,所以请先备份。写入扫描速度很低,所以应该只扫描只读扫描时候发现错误的部分。下面是示例:

badblocks -w -s /dev/sdb END START

badblocks的参数选项

-b blocksize
指定磁盘的区块大小,单位为字节,默认值为“block 4K ”(4K/block)

-c blocksize
每个区块检查的次数,默认是16次

-f
强制在一个已经挂载的设备上执行读写或非破坏性的写测试操作。(我们建议先umount设备,然后再进行坏道检测。仅当/etc/mtab出现误报设备挂载错误的时候可以使用该选项)。通常情况下,badblocks会拒绝在可读/可写或者是没有被毁坏的挂载磁盘上进行检测,即使可能导致系统潜在冲突并且/或者破坏文件系统,以只读模式挂载时,也不进行检测。你可以使用 -f 参数来忽略以上的默认设置,但是一般来说还是不应该被使用——除非你认为你比badblocks巧妙,不过通常不是这样的。仅仅当 /etc/mtab 文件损坏,并且磁盘真的没有被挂载,使用这个参数才是比较安全的。

-i file
跳过已经显示在file文件中的坏道,而不进行检测(可以避免重复检测)。从文件中读取读取已知的坏道,Badblocks会跳过已知的坏道。如果input_file被特殊指定了“-”,那么列表就会被按照标准输入模式读取。在这个列表中列出的区块会被标准输出或者输入文件忽略。在适当的情况下,可以使用dumpe2fs中的-b 参数可以恢复现有的文件系统中当前列表中标识为损坏的区块。

-o file
把检测结果输出到file文件。没有指定这个参数的时,badblocks会以标准输出显示坏道列表。这中文件格式同样可以被e2fsck或mke2fs的 -l 参数使用。

-p number
重复搜寻设备,直到在指定通过次数内都没有找到新的坏块位置,默认次数为0。表示badblocks会在第一次检测通过后退出。

-s
在检查时显示进度

-t pattern
通过按指定的模式读写来检测区块。你可以指定一个0到ULONG_MAX-1的十进制正值,或使用random(随机)。如果你指定多个模式,badblocks将使用第一个模式检测所有的区块,然后再使用下一个模式检测所有的区块。Read-only方式仅接受一个模式,它不能接受random模式的。

-n
使用无损坏读/写模式。默认情况下无损坏读/写模式会被完成,这个参数不可以和-w参数一起使用,因为他们是相互抵制的。

-s
显示进程已经检测的区块。

-v
执行时显示详细的信息

-w
对每个区块都先写入,然后再从它读取信息,使用可写模式检测。使用这个参数后,badblocks会在设备的每个区块中写入一些模式(0xaa, 0x55, 0xff, 0x00)来进行坏道检测,读取每个区块并且比较目录。这个参数不可以和-n参数一起使用,因为他们是相互抵制的。

[device]
指定要检查的磁盘装置

[last-block]
指定磁盘装置的区块总数

[start-block]
指定要从哪个区块开始检查

特别注意:如果badblocks的输出是由e2fsck或者是mke2fs程序产生的,那么特别指定区块大小是非常重要的,因为被生成的区块数是十分依靠文件系统的区块大小的。因此,特别推荐的是用户不要直接运行badblocks,而是使用e2fsck或者是mke2fs的参数 -c 。

永远不要在已经存在文件系统的设备上使用-w参数。这个参数会删除数据!如果你希望在已经存在文件系统的设备上使用可写测试,那么使用-n参数来代替它。这样会比较慢,但是这样可以保护你的数据。