几天前,我决定擦除我的 750 GB 硬盘以出售它,所以我启动Ubuntu了一个 Live DVD 并使用sudo dd if=/dev/zero of=/dev/sda. 我dd在夜间跑步。当我早上回来时,我发现过程的某个时刻Ubuntu冻结了。我无法确定冻结发生在过程的哪个点,因为无论何时发生,它都会在屏幕保护程序打开时发生,所以我无法看到bash的输出。
问题:如何避免重新启动 dd?
我自己制定了一个解决方案:
快速回答
假设您的驱动器是/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您可以检查您在终端中的<device_block_size>运行情况:在我的情况下,它是块fdisk -l /dev/sdX1449805619dd从那里重新开始::dd 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 -as将强制它从FILE1读取,因此恒定的零流会将的每个字节与零进行比较,直到 ,报告(如果有)第一个非零字节:假设驱动器是:FILE1stdincmpFILE2EOF/dev/sdX
dd if=/dev/zero | cmp - /dev/sdX
设备的第一个非零块是包含第一个非零字节的块,即:
<device_first_non_zero_block>=floor(<device_first_non_zero_byte>/<device_block_size>)+1
Run Code Online (Sandbox Code Playgroud)
因此,要从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
Run Code Online (Sandbox Code Playgroud)
测试
创建一个仅包含零的 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
Run Code Online (Sandbox Code Playgroud)
在这种情况下:
<device_first_non_zero_block>=floor(512001/512)+1=floor(1000,001953125)+1=1000+1=1001
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
命令的输出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
Run Code Online (Sandbox Code Playgroud)
检查过程是否成功:
$ dd if=/dev/zero | cmp - hdd3
cmp: EOF on hdd3
Run Code Online (Sandbox Code Playgroud)
答对了!
| 归档时间: |
|
| 查看次数: |
949 次 |
| 最近记录: |