У меня нет простого решения для ddrescue
.
РЕДАКТИРОВАТЬ: у меня не так просто решение сейчас.
Подготовка целевого файла
Вам нужно будет знать исходный размер жесткого диска в 512-байтовом блоке. Сохраните это в переменной.
SIZE=$(sudo blockdev --getsz /dev/sdX)
Целевой файл должен иметь соответствующий размер заранее.
fallocate -l $((512*$SIZE)) /mnt/samba/share/target.dd
Подготовка отложенного устройства
Сначала вам нужно устройство петли.
sudo losetup -f /mnt/samba/share/target.dd
sudo losetup -a
Вторая команда сообщает вам, какое устройство цикла связано с target.dd
. Здесь я предполагаю, что это /dev/loop0
.
Затем вы создаете устройство с устройством сопоставления.
echo "0 $SIZE delay /dev/loop0 0 0 /dev/loop0 0 500" | sudo dmsetup create delayed_target
Число 500
в этом примере указывает, что каждая операция записи в /dev/mapper/delayed_target
будет отложена на 500 мс. (Подробнее см. man dmsetup
и этот документ .)
Фактическое чтение
sudo ddrescue --force -D -c 2048 /dev/sdX /dev/mapper/delayed_target logfile.log
Ключ -c 2048
указывает ddrescue
обрабатывать 2048 * 512 байт за раз, это один мегабайт. Из-за того, что -D
программа не использует кэширование и т.д., В результате чего многие операции записи объединяются в одну. С -D
каждый мегабайт образует отдельную операцию записи, которая достигает 500 мс задержки.
доводка
Один твик - изменить -c 2048
в вызове ddrescue
. Другое - изменить задержку в dmsetup
(см. Раздел Очистка ).
Вы всегда можете остановить ddrescue
с помощью Ctrl+C, настроить задержку, если необходимо, повторно запустить ddrescue
с тем же лог- файлом и, возможно, с другим параметром -c
- и он продолжится. Эксперимент, чтобы найти значения, которые соответствуют вашим потребностям.
очищающий
sudo dmsetup remove delayed_target
(Чтобы настроить задержку, вернитесь к dmsetup create
now.)
sudo losetup -d /dev/loop0
Заметка
Вместо того чтобы откладывать запись в целевой файл, вы можете отложить чтение с исходного устройства. Похоже, что это лучший способ, поскольку нет необходимости в петлевом устройстве. Тем не менее, мои тесты показали, что есть немедленные чтения с недавно созданного устройства картографирования. Эти чтения многократно задерживают задержку и блокируют сам dmsetup
. Моя интерпретация может быть неверной, но после dmsetup create
существует значительная задержка. Это делает настройку (если не всю процедуру) практически невозможной.
Мой оригинальный ответ:
Из моего опыта ddrescue
значительно лучше, чем dd
только если есть ошибка чтения. Если ваши диски, как правило, находятся в хорошем состоянии и вы ожидаете, что ошибки чтения будут редкими, вы можете использовать dd
с pv
.
Пример:
dd if=/dev/sdb conv=sync,noerror bs=32M 2>dd.log | pv -L 4M > /mnt/samba/desktop/my-image.dd
Параметр noerror
для dd
заставляет его продолжить после возникновения ошибки чтения, если таковая имеется; sync
заставляет dd
выводить нули в этом случае, поэтому хорошие данные впоследствии помещаются с правильным смещением в файл изображения. Я предпочитаю большие bs
для производительности HDD. Обратите внимание, что при таком большом bs
одна ошибка чтения может вызвать до 32 МБ ошибочных нулей в изображении, поэтому вам может потребоваться:
- Играйте вручную с помощью карманного калькулятора и опций
dd
bs
, skip
, seek
и conv=notrunc
, чтобы делать то, что делает ddrescue
автоматически: читать и сохранять как можно больше, надеясь уменьшить количество ошибочных нулей до 512B или 4096B за ошибку чтения (эти числа являются общими размерами секторов для дисков).
- или вручную поиграйте с карманным калькулятором и создайте файл журнала для
ddrescue
, затем запустите ddrescue
чтобы перечитать только проблемные фрагменты источника; обратитесь к info ddrescue
о структуре файла журнала.
В обоих случаях сохраненный stderr из dd
будет полезен для обнаружения проблемных секторов, следовательно, перенаправление 2>dd.log
.
Хорошая вещь с pv
- это его способность изменять ограничение скорости на лету (замените PID фактическим pid исходного pv
используемого с dd
):
pv -L 6M -R PID
Таким образом, вы можете регулировать лимит, не начиная заново.