Я перезаписываю свой жесткий диск случайными данными, используя старый добрый способ dd
:
dd if=/dev/urandom of=/dev/disk/by-uuid/etc bs=512
Это массив на 2 ТБ, и мой MacBook (работающий под управлением Linux, окей?) может записывать данные только со скоростью около 3,7 МБ/с, что довольно жалко, поскольку я видел, как мой домашний настольный компьютер делал 20 МБ/с. Когда я приду домой сегодня вечером, я хотел бы остановить прогон dd
, взять его домой и посмотреть, какой прогресс можно будет сделать за ночь с более мощной машиной.
Я отслеживал прогресс с помощью простого цикла:
while true; do kill -USR1 $PID ; sleep 10 ; done
Вывод выглядит так:
464938971+7 records in
464938971+7 records out
238048755782 bytes (238 GB) copied, 64559.6 s, 3.7 MB/s
Если бы я возобновил dd
пропуск дома, как бы я его перезапустил? Я знаю о seek
параметре, но на что мне его указать, на номер записи или на количество байтов?
решение1
Как уже прокомментировал @don_crissti, просто используйте seek=
для возобновления.
dd if=/dev/urandom of=/dev/disk/by-uuid/etc bs=512 seek=464938971
GNU dd
также поддерживает поиск по байтам, поэтому вы можете продолжить точно, независимо от размера блока:
dd if=/dev/urandom of=/dev/disk/by-uuid/etc bs=1M \
seek=238048755782 oflag=seek_bytes
Больший размер блока должен повысить скорость даже для такого медленного устройства, как /dev/urandom
.
Если вы ищете более быстрые альтернативы, вы можете cryptsetup plainOpen
использовать случайный ключ и ноль, он должен быть быстрее /dev/urandom
на порядок (без AES-NI) или даже работать на полной скорости (с AES-NI).
Вы также можете использовать shred -n 1
псевдослучайные данные, если они достаточно хороши для вашего случая использования. shred
Должна быть возможность использовать полную скорость диска даже на очень медленной машине.
решение2
Просто напоминание для тех, кто хотел бы копировать, а не просто рандомизировать диски (что не такчтообщий): можно использовать skip=BLOCKS
для началачтениев правильном положении и seek=BLOCKS
начатьписьмов правильном положении. Оба варианта используют блоки, а не байты. При остановке/перезапуске желательно удалить кучу блоков на всякий случай. Обычно стоит поднять значение bs
выше 512, так как можно достичь лучшей производительности, если читать много данных подряд.
В вашем случае это действительно значение блока, которое вам нужно передать в seek
. Возможно, вам следует попробовать настроить, bs
чтобы увидеть, сможете ли вы повысить скорость, поскольку это /dev/random
должно быть быстро (псевдослучайно и неблокируемо, когда у него нет доступной энтропии)
решение3
Клонирование диска:
Расширяя наэтотответ из этой ветки, вот как можно клонировать целый диск и возобновить работу:
Этот пример оптимизирован для копирования с роторного диска со скоростью вращения 5400 об/мин на твердотельный накопитель в определенной системе. gdd
представляет собой GNU dd
:
> sudo gdd 'if=/dev/rdisk3' 'of=/dev/rdisk6' bs=4M status=progress
247426187264 bytes (247 GB, 230 GiB) copied, 2082 s, 119 MB/s
59012+0 records in
59011+0 records out
247510073344 bytes (248 GB, 231 GiB) copied, 2082.92 s, 119 MB/s
Я могу продолжить это двумя способами:
> sudo gdd 'if=/dev/rdisk3' 'of=/dev/rdisk6' \
bs=4M \
seek=59011 skip=59011 \
status=progress
Или:
> sudo gdd 'if=/dev/rdisk3' 'of=/dev/rdisk6' \
bs=4M \
seek=247510073344 skip=247510073344 \
oflag=seek_bytes iflag=skip_bytes \
status=progress
В первом примере мы используем , 59011
а не 59012
, потому что 59011
это количество записей размером с блок было полностью скопировано до того, как было прервано (записи закончились).
решение4
Если можете, используйте
#ddrescue from to logfile
ddrescue /dev/sda /dev/sdb logfile
Не включайте log-файл ни в from, ни в to... и если вам придется нажать ctrl-c или что-то еще, ddrescue прочитает свой log-файл и автоматически возобновит работу. Он также копирует все easy-файлы в первую очередь, и поскольку он может возобновить работу из log-файла, вы можете сказать ему "вернуться и постараться получше" для остальных.