系统冻结后,我如何避免重新开始dd命令?

几天前,我决定擦除我的750GB硬盘以便出售。所以我用一个Live DVD启动Ubuntu,并使用"sudo dd if=/dev/zero of=/dev/sda"命令开始了擦除过程。我让dd在整个晚上一直运行。当我早上回来时,我发现在某个阶段Ubuntu冻结了。由于每次冻结都发生在屏幕保护程序开启时,所以我无法确定冻结发生在哪个阶段,因为我无法看到bash的输出。
问题:我如何避免重新开始dd?

你可以将其切碎。运行man shred - Mudit Kapil
@Mudit 我需要从冻结发生的地方开始,而不是再次擦除整个驱动器。 - kos
1个回答

我自己找到了一个解决方案:

快速答案

假设你的驱动器是 /dev/sdX

  • 运行 dd if=/dev/zero | cmp - /dev/sdX 来查找设备上第一个非零字节的位置:在我的情况下,它是字节 742300476649
  • 计算第一个非零字节属于哪个块:<device_first_non_zero_block>=floor(<device_first_non_zero_byte>/<device_block_size>)+1:你可以通过在终端中运行 fdisk -l /dev/sdX 来检查你的 <device_block_size>,在我的情况下,它是块 1449805619
  • 从那里重新开始运行 dddd if=/dev/zero bs=<device_block_size> skip=<device_first_non_zero_block>-1:在我的情况下,命令是 dd if=/dev/zero of=/dev/sda bs=512 skip=1449805618

详细答案

给定`cmp` `-`作为`FILE1`将强制它从`stdin`读取`FILE1`,因此一连串的零将使`cmp`将`FILE2`的每个字节与零进行比较,直到`EOF`,报告(如果有)第一个非零字节:假设驱动器是`/dev/sdX`:
`dd if=/dev/zero | cmp - /dev/sdX`
设备的第一个非零块是包含第一个非零字节的块,即:
<device_first_non_zero_block>=floor(<device_first_non_zero_byte>/<device_block_size>)+1

所以,要重新开始从那里的dd,只需跳过前<device_first_non_zero_block>-1个块即可。
dd if=/dev/zero of=/dev/sdX bs=<device_block_size> skip=<device_first_non_zero_block>-1

测试

创建一个包含零的512KB文件,以模拟已擦除的硬盘:

$ dd if=/dev/zero of=hdd1 bs=512 count=1000

创建一个包含随机字节的512KB文件,以模拟包含数据的硬盘:

$ dd if=/dev/urandom of=hdd2 bs=512 count=1000

合并这两个文件,以模拟部分擦除的硬盘:

$ cat hdd1 hdd2 > hdd3

测试驱动器上命令的输出:

$ dd if=/dev/zero | cmp - hdd1
cmp: EOF on hdd1
# cmp reached EOF on hdd1, hdd1 contains only zeros
$ dd if=/dev/zero | cmp - hdd2
- hdd2 differ: byte 1, line 1
# cmp reported byte 1 to be not zero, hdd2 doesn't contain any leading zero
$ dd if=/dev/zero | cmp - hdd3
- hdd3 differ: byte 512001, line 1
# cmp reported byte 512001 to be not zero, hdd3 contains leading zeros up to byte 512000

在这种情况下:
<device_first_non_zero_block>=floor(512001/512)+1=floor(1000,001953125)+1=1000+1=1001

所以,从那里开始重新启动dd
请注意,在这种情况下,由于测试驱动器是一个文件,需要使用count并将其设置为<device_total_number_of_blocks>-(<device_first_non_zero_block>-1),以避免超过测试驱动器的大小,但这不适用于常规驱动器。
dd if=/dev/zero of=hdd3 bs=512 seek=1000 count=1000

hdd3 命令的输出结果:

$ dd if=/dev/zero of=test2 bs=512 seek=1000 count=1000
1000+0 records in
1000+0 records out
512000 bytes (512 kB) copied, 0,00190399 s, 269 MB/s

检查过程是否成功:

$ dd if=/dev/zero | cmp - hdd3
cmp: EOF on hdd3

太棒了!

1好的!点赞了!;-) - Fabby