我有一个 1TB 的硬盘,我想在上面运行坏块,但据我所知,这大约需要 3 天时间,我想分块运行它(比如说每晚运行一整夜),这样它所在的计算机就可以在白天使用。这样可能吗?
答案1
有一种方法badblocks
可以指定从哪个块开始以及最后一个块,(参见man badblocks
):
badblocks [ -svwnfBX ] [ -b block-size ] [ -c blocks_at_once ] [ -e
max_bad_blocks ] [ -d read_delay_factor ] [ -i input_file ] [ -o
output_file ] [ -p num_passes ] [ -t test_pattern ] device [
last-block ] [ first-block ]
答案2
经过深思熟虑并阅读了大约 10 遍手册页后,我终于弄明白了这一点。我想分享一下,以防其他人需要这些信息。谷歌搜索并没有多大帮助,因为那些列表通常只是引用手册页。当手册页说 last-block first-block 时,它不希望您输入这些单词,而是希望您输入一个数字。它提到两者都是可选的,但如果我想指定 first block,我不知道如何省略 last-block。
假设您最初在块 33000001 处停止了测试。我会在一个少一个块的地方重新开始测试,也就是 33000000。
首先,你必须确定分区上的最后一个块号。我发现了两种方法可以做到这一点。
您可以
badblocks
在没有块号的情况下开始。它会告诉您它正在处理的块范围。前任:
sudo badblocks -sv /dev/sda3
上面写着类似这样的话:
Searching for badblocks in read only nondestructive mode from block to 66828373
记下这个结束块号。使用 Ctrl-C然后输入带有所需块编号的命令。
您可以使用
fdisk
(或者我认为也可以使用sfdisk
)命令列出分区信息。信息列之一是块数。找到您感兴趣的分区中的块数,然后减去 1,因为块的编号从 0 开始。
sudo fdisk -l /dev/sda
(该选项是小写的 L。在这种情况下,您无需指定分区号,只需指定硬盘驱动器名称。)上面写着类似这样的话:
/dev/sda2 ... /dev/sda3 ... 66828374 /dev/sda4 ...
找到您感兴趣的分区并读取块数并减 1 以找到最后一个块号。
现在,您可以输入
badblocks
以下命令。假设您想在分区中间的 33000000 块处开始测试。此示例用于非破坏性读写模式,并将badblocks
列表写入文本文件。如果从实时 CD 启动,则重新启动时将丢失此文本文件。
sudo badblocks -nsv -o ~/Desktop/badblocks.txt /dev/sda3 66828373 33000000
这将测试从块 33000000 到分区末尾。如果您指定 66828374 作为最后一个块(如 中所述)
fdisk
,它将报告该块号为坏块,但实际上,该块号并不存在。我希望其他人会发现这很有用,因为它确实让我困惑了一段时间。
真挚地,
罗恩
答案3
为了明确起见,假设您已经中断badblocks
,并且得到如下输出:
root@black:/media/bigdisk# badblocks -sv /dev/sdb1
Checking blocks 0 to 1953512447
Checking for bad blocks (read-only test): ^X^C56% done, 39:44 elapsed. (0/0/0 errors)
Interrupted at block 284489984
您可以像这样继续:
badblocks -sv /dev/sdb1 1953512447 284489983
请注意,我中断命令的块是最后一个,我已将其减一(因为我不确定在该块中断是否意味着它已被检查过)。据我所知,没有办法只指定最后一个块;必须说明最后一个块,我从初始输出中复制了它。