Несколько дней назад я решил вытереть свой жесткий диск на 750 ГБ для продажи его, таким образом, я загрузился Ubuntu
от живого 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/sdX
в терминале: в моем случае это был блок 1449805619
dd
снова оттуда: 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
-
как FILE1
вынудит это читать FILE1
от stdin
, таким образом, постоянный поток нулей сделает 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
Тестирование
Создание файла 512 КБ, содержащего только нули для моделирования вытертый жесткий диск:
$ dd if=/dev/zero of=hdd1 bs=512 count=1000
Создание файла 512 КБ, содержащего только случайные байты для моделирования жесткий диск, содержащий данные:
$ 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
Бинго!