Полная копия DD от HDD до HDD

Можно сделать это использование

rsync -av --delete --update --include-from=LISTFILE   -f 'hide,! */' src/ dst

где LISTFILE файл, который содержит все файлы, которые должны синхронизироваться с целевым каталогом. Если Ваши файлы не изменяются, можно использовать --ignore-existing вместо --update. Прочитайте rsync страницу руководства для деталей.

36
22.07.2017, 21:53
4 ответа

dd был полезен в старые времена, когда люди использовали ленты (когда имели значение размеры блоков) и когда более простые инструменты, такие как cat , могли быть небезопасными для двоичного кода.

В настоящее время dd if = / dev / sdb of = / dev / sdc - это просто сложный, подверженный ошибкам, медленный способ записи cat / dev / sdb> / dev / sdc . Хотя dd по-прежнему полезен для некоторых относительно редких задач , он намного менее полезен, чем количество учебных пособий, в которых он упоминается, позволяет вам поверить. В dd нет магии, вся магия находится в / dev / sdb .

Ваша новая команда sudo dd if = / dev / sdb bs = 128K | pv -s 3000G | sudo dd of = / dev / sdc bs = 128K снова излишне медленный и сложный. Данные читаются по 128 КБ за раз (что лучше, чем значение по умолчанию dd , равное 512 Б, но не так хорошо, как даже большие значения). Затем он проходит по двум каналам перед записью.

Используйте более простую и быструю команду cat . (В некоторых тестах , которые я сделал пару лет назад под Linux, cat был быстрее, чем cp для копирования между разными дисками, и cp был быстрее, чем dd с любым размером блока; dd с большим размером блока был немного быстрее при копировании на тот же диск.)

cat /dev/sdb >/dev/sdc

Если вы хотите запустить эту команду в sudo вам нужно сделать перенаправление как root:

sudo sh -c 'cat /dev/sdb >/dev/sdc'

Если вам нужен отчет о ходе работы, поскольку вы используете Linux, вы можете легко получить его, указав PID cat (скажем, 1234) и смотрит на позицию его входного (или выходного) файлового дескриптора.

# cat /proc/1234/fdinfo/0
pos:    64155648 
flags:  0100000

Если вам нужен отчет о проделанной работе, а ваш вариант unix не обеспечивает простой способ добраться до позиций файлового дескриптора, вы можете установить и использовать pv вместо cat .

58
27.01.2020, 19:36

Получение статистики о текущем dd-процессе

С помощью команды kill с соответствующим сигналом можно сделать вывод статистики dd со стандартной ошибкой.
Из GNU dd man page:

Sending a USR1 signal to a running 'dd' process makes it print I/O statistics to standard error and then resume copying.
      $ dd if=/dev/zero of=/dev/null& pid=$!
      $ kill -USR1 $pid
      18335302+0 records in 18335302+0 records out 9387674624 bytes (9.4 GB)  copied,  34.6279 seconds, 271 MB/s

Убедитесь, что вы сначала проверили свою man-страницу на правильность сигнала, так как он может отличаться в разных реализациях dd: (BSD dd использует SIGINFO).

Ускорение процесса

  1. Подключите каждый жесткий диск к своему SATA-порту, чтобы данные можно было считывать с одного устройства и записывать на другое одновременно.
  2. Используйте соответствующий размер блока с помощью аргумента bs=. Взгляните на этот поток на суперпользователе и попробуйте некоторые значения сами.
  3. Для чтения и записи используйте отдельные вызовы dd и соедините их трубой (dd if=/dev/sda bs=1M | dd из=/dev/sdb bs=1M).
    Если вы сделаете это и укажете размер блока, убедитесь, что вы используете один и тот же размер блока при каждом вызове.
  4. Можно попробовать и другие оптимизации, например, прямой аргумент .
  5. Убедитесь, что жесткие диски не смонтированы, иначе это может привести к повреждению копии.
5
27.01.2020, 19:36

DD использует очень маленькие блокировки по умолчанию (512 байт). Это приводит к большому количеству накладных расходов (один прочитанный () и () () SYSCALL для каждых 512 байтов).

Это идет намного быстрее, когда вы используете больший блок. Оптимальные скорости начинаются с bs = 64k или около того. Большинство людей используют еще больше bs = 1 м , поэтому он становится читаемым человеком (когда DD говорит о его копировании 1234 блоков , вы знаете, это 1234 MIB без каких-либо математики). Использование еще более крупных блок блоков вряд ли приведет к улучшению скорости, просто более высокое потребление памяти.

Итак, команда должна быть:

dd bs=1M if=/dev/sdb of=/dev/sdc

, если у вас уже есть медленный DD , вы можете прерывать его и возобновить с помощью экземпляра DD . Для этого важно знать, как далеко не продвинулась копия. DD Обычно печатает прогресс, когда вы отмените его, или вы можете отправить его SUSR1 сигнал, когда он работает, чтобы заставить его распечатать свой прогресс.

kill -USR1 $(pidof dd)

Например, если он скопировал более 1234MIB , вы можете возобновить в положении 1234MIB , используя:

dd bs=1M seek=1234 skip=1234 if=/dev/sdb of=/dev/sdc

, если он скопирован менее чем 1234MIB , ваша копия будет неполным. Если он скопировал более чем 1234MIB , он будет переоценить некоторые уже скопированные детали, которые обычно не наносят никакого вреда. Так что если под сомнением, вы должны выбрать значение, немного меньше, чем то, что вы считаете уже скопированы.

7
27.01.2020, 19:36

Вы пробовали «gparted»? Вы можете буквально скопировать и вставить раздел с одного диска на другой и изменить его размер по мере необходимости. Вы получаете скорость передачи и оставшееся время. Он использует «e2image» для разделов Linux.

4
27.01.2020, 19:36

Теги

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