Полная DD копия с жесткого диска на жесткий диск


34

ОРИГИНАЛЬНЫЙ ВОПРОС:

Если у меня есть 2 одинаковых жестких диска со следующими характеристиками:

  • SATA 6,0 Гбит / с
  • 5400 об / мин
  • 3TB

Сколько времени должна занять полная дд копия?

Пока он работает 5 часов и все еще идет ...

Я использую Linux Ubuntu 12.04 64bit, и я использую команду:

dd if=/dev/sdb of=/dev/sdc

ОБНОВЛЕНИЕ: 1

Теперь я вижу прогресс, и прошло более 6 часов для копирования 430 ГБ. Жесткий диск 3 ТБ ...

Нет ли более быстрого способа сделать это?


ОБНОВЛЕНИЕ: 2

Это выглядит намного лучше, чем раньше (спасибо Groxxda за предложения):

sudo dd if=/dev/sdb bs=128K | pv -s 3000G | sudo dd of=/dev/sdc bs=128K

ETA составляет около 9 часов для 3 ТБ, тогда как до того, как он достиг 430 ГБ через 6 часов, поэтому я предполагаю, что с помощью предыдущей команды потребовалось бы около 36 часов.


Попробуйте получить статистику процесса: отправка сигнала USR1 запущенному процессу 'dd' заставляет его печатать статистику ввода-вывода со стандартной ошибкой, а затем возобновляет копирование. $ dd if = / dev / zero of = / dev / null & pid = $! $ kill -USR1 $ pid Проверьте вашу справочную страницу на наличие фактического сигнала, поскольку он отличается для разных реализаций dd.
Groxxda

@ Groxxda, я понятия не имею, как это сделать.
oshirowanen

1
GNU dd использует SIGUSR1, а BSD dd используетSIGINFO
groxxda

Кроме того, что вы имеете в виду с "подключен к тому же кабелю SATA"? Вы используете какой-то множитель порта? (Если вы достигаете скорости передачи 150 МБ / с, это займет у вас 5-6 часов, но я думаю, что половина из них более реалистична.)
groxxda

1
Вы можете ускорить процесс, указав другой (больший) размер блока ( bs=аргумент dd). Также рассмотрите возможность подключения каждого жесткого диска к собственному порту sata.
Groxxda

Ответы:


58

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.


Что странного в больших блоках, так это то, что узким местом является диск, так что же делает catбыстрее dd? Может ли быть так, что catиспользует кеш?
Эммануэль

1
@ Жиль, спасибо за ответ. У меня есть еще пять дисков объемом 3 ТБ для клонирования, и в следующий раз я попробую вариант cat. Насколько я могу судить, этой новой команде dd потребуется еще 3 часа, в общей сложности около 11 часов. Если для второго жесткого диска емкостью 3 ТБ скорость кошачьего хода превышает 11 часов, я буду использовать этот метод для остальных накопителей.
oshirowanen

2
@ Жиль, так что, чтобы получить отчет о проделанной работе, я должен использовать sudo sh -c 'pv /dev/sdb >/dev/sdc'вместо sudo sh -c 'cat /dev/sdb >/dev/sdc'?
oshirowanen

1
@oshirowanen Да, используйте pvтам , где вы будете использовать cat.
Жиль "ТАК - перестань быть злым"

1
@unhammer Нет! Вы скопировали бы каждый из устройства по одному, например cat /dev/sdc1 >/dev/sdb1 && cat /dev/sdd1 >/dev/sde1. Объединение двух частей не имеет смысла. Если вы хотите изменить структуру тома btrfs, изменить его с двух подобъемов на один, вам нужно использовать инструменты btrfs, чтобы изменить структуру, или, как вы делали, создать новую файловую систему с желаемой структурой и скопировать файлы. ,
Жиль "ТАК - прекрати быть злым"

7

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

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

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

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

Если у вас уже есть медленный ddзапуск, вы можете прервать его и продолжить с более быстрым ddэкземпляром. Для этого важно знать, насколько далеко продвинулась копия. ddобычно печатает прогресс, когда вы отменяете его, или вы можете отправить ему USR1сигнал во время его работы, чтобы заставить его печатать свой прогресс.

kill -USR1 $(pidof dd)

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

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

Если оно скопировано меньше чем 1234MiB, ваша копия будет неполной. Если он скопировал больше, чем 1234MiBон, он будет повторно скопировать некоторые уже скопированные части, что обычно не приносит никакого вреда. Поэтому, если вы сомневаетесь, вам следует выбрать значение, немного меньшее, чем, по вашему мнению, уже было скопировано.


5

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

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

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

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

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

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

0

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


0

Существует коммерческое программное обеспечение под названием HDClone . Он лицензируется как бесплатное и коммерческое. Любая версия может создавать загрузочный Pendrive или DVD, а также копировать диски. Подключите исходный и целевой HD и следуйте инструкциям на основе графического интерфейса.

Бесплатный будет передавать со скоростью около 80 МБ / с, в то время как платные версии могут идти намного быстрее. Для файловых систем NTFS и FAT платные версии могут быть сконфигурированы для клонирования только занятых битов HD, что резко увеличивает скорость каждого клона.


(1) Вы связаны с этим продуктом? (2) Где мы можем получить это?
Скотт

1
Или вы можете просто использовать "cat / dev / sdx> / dev / sdy" бесплатно ...
HörmannHH
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.