Как я стараюсь не запускать dd снова после системного замораживания?

Несколько дней назад я решил вытереть свой жесткий диск на 750 ГБ для продажи его, таким образом, я загрузился Ubuntu от живого DVD и запустил процесс с sudo dd if=/dev/zero of=/dev/sda. Я уехал dd выполнение в течение ночи. Когда я возвратился утром, я обнаружил что в какой-то момент процесса Ubuntu замороженный. Я не могу определить, в которой точке процесса произошло замораживание, потому что каждый раз, когда это произошло, это произошло, в то время как экранная заставка шла, таким образом, я не смог, посмотрите bashвывод.

Вопрос: Как я стараюсь не запускать dd снова?

4
задан 16 March 2015 в 12:18

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: можно проверить Ваш <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

Бинго!

2
ответ дан 1 December 2019 в 10:19

Другие вопросы по тегам:

Похожие вопросы: