Использование DD для клонирования дисков

Там было много вопросов, касающихся инструментов клонирования дисков и dd было предложено хотя бы один раз. Я уже рассмотрел использование dd Я в основном из-за простоты использования и того, что он легко доступен практически во всех загрузочных дистрибутивах Linux.

Каков наилучший способ использования dd для клонирования диска? Я сделал быстрый поиск в Google, и первый результат был очевидной неудачной попыткой. Есть ли что-нибудь, что мне нужно сделать после использования ddесть что-нибудь, что НЕ МОЖЕТ быть прочитано с помощью dd?

29 ответов

Решение

dd, безусловно, лучший инструмент для клонирования, он создаст 100% реплику просто с помощью следующей команды. У меня никогда не было проблем с этим.

dd if=/dev/sda of=/dev/sdb bs=32M

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

Для экономии места вы можете сжать данные, созданные dd, с помощью gzip, например:

dd if=/dev/hdb | gzip -c  > /image.img

Вы можете восстановить ваш диск с помощью:

gunzip -c /image.img.gz | dd of=/dev/hdb

Чтобы сэкономить еще больше места, предварительно дефрагментируйте диск / раздел, который вы хотите клонировать (при необходимости), затем обнулите все оставшееся неиспользуемое пространство, упрощая сжатие gzip:

mkdir /mnt/hdb
mount /dev/hdb /mnt/hdb
dd if=/dev/zero of=/mnt/hdb/zero

Подождите немного, dd в конечном итоге потерпит неудачу с сообщением "диск заполнен", затем:

rm /mnt/hdb/zero
umount /mnt/hdb
dd if=/dev/hdb | gzip -c  > /image.img

Кроме того, вы можете запустить процесс dd в фоновом режиме, чтобы сообщить о состоянии, отправив ему сигнал с помощью команды kill, например:

dd if=/dev/hdb of=/image.img &
kill -SIGUSR1 1234

Проверьте вашу систему - приведенная выше команда для Linux, OSX и BSD Команды дд отличаются в сигналах, которые они принимают (использует OSX SIGINFO - вы можете нажать Ctrl+T, чтобы сообщить о состоянии).

ВНИМАНИЕ: при работе с файловой системой может произойти повреждение файлов. Причина проста: он не понимает, что может происходить в файловой системе, и не пытается ее смягчить. Если запись ведется частично, вы получите частичную запись. Обычно это плохо для вещей и, как правило, фатально для баз данных. Более того, если вы облажаетесь с опечаткой, если и параметров, горе вам. В большинстве случаев rsync является столь же эффективным инструментом, написанным после появления многозадачности, и будет обеспечивать согласованные представления отдельных файлов.

Однако DD должен точно фиксировать состояние бита не подключенного диска. Загрузчики, тома llvm, идентификаторы UUID и метки разделов и т. Д. Просто убедитесь, что у вас есть диск, способный зеркально отражать бит целевого диска.

При использовании dd для клонирования диска, который может содержать поврежденные сектора, используйте "conv=noerror,sync", чтобы убедиться, что он не останавливается при обнаружении ошибки, и заполняет отсутствующий сектор (ы) нулевыми байтами. Обычно это первый шаг, который я предпринимаю при попытке восстановления с неисправного или неисправного диска - получите копию перед выполнением любых попыток восстановления, а затем выполните восстановление на хорошем (клонированном) диске. Я оставляю это инструменту восстановления, чтобы справиться с пустыми секторами, которые не удалось скопировать.

Кроме того, вы можете обнаружить, что на скорость dd может влиять настройка bs (размер блока). Я обычно пробую bs=32768, но вы можете протестировать его на своих системах, чтобы увидеть, что работает быстрее всего. (Это предполагает, что вам не нужно использовать определенный размер блока по другой причине, например, если вы пишете на ленту.)

Для клонирования диска все, что вам действительно нужно сделать, это указать вход и выход для dd:

dd if=/dev/hdb of=/image.img

Конечно, убедитесь, что у вас есть соответствующие разрешения для чтения непосредственно из /dev/hdb (я бы рекомендовал запускать от имени root), и что / dev / hdb не смонтирован (вы не хотите копировать, пока диск меняется - монтируется только для чтения). После завершения image.img станет побайтовым клоном всего диска.

Есть несколько недостатков использования dd для клонирования дисков. Во-первых, dd скопирует весь ваш диск, даже пустое место, и если это сделать на большом диске, это может привести к очень большому файлу образа. Во-вторых, dd не дает никаких индикаторов прогресса, что может расстраивать, потому что копирование занимает много времени. В-третьих, если вы копируете этот образ на другие диски (опять же, используя dd), они должны быть такими же большими или большими, как исходный диск, но вы не сможете использовать дополнительное пространство на целевом диске до тех пор, пока вы не изменить размер ваших разделов.

Вы также можете сделать прямую копию с диска на диск:

dd if=/dev/hdb of=/dev/hdc

но вы все еще подвержены вышеуказанным ограничениям относительно свободного места.

Что касается вопросов или ошибок, дд, по большей части, делает отличную работу. Однако некоторое время назад у меня был жесткий диск, который вот-вот должен был умереть, поэтому я использовал dd, чтобы попытаться скопировать любую информацию, которую я мог удалить, до того, как она полностью исчезла. Затем выяснилось, что dd не очень хорошо обрабатывает ошибки чтения - на диске было несколько секторов, которые dd не мог прочитать, в результате чего dd сдался и остановил копирование. В то время я не мог найти способ, чтобы dd продолжал, несмотря на то, что обнаружил ошибку чтения (хотя кажется, что он имеет эту настройку), поэтому я потратил довольно много времени, вручную задавая пропуск и пытаясь перепрыгнуть через нечитаемые разделы.

Я потратил некоторое время на изучение решений этой проблемы (после того, как я выполнил задачу) и обнаружил программу под названием ddrescue, которая, согласно сайту, работает как dd, но продолжает читать, даже если обнаруживает ошибку. Я никогда не использовал программу, но это стоит учитывать, особенно если диск, с которого вы копируете, старый, в котором могут быть поврежденные сектора, даже если система выглядит нормально.

Если исходный диск вообще поврежден, вам повезет больше dd_rhelp с dd_rescue (мои личные предпочтения) или GNU ddrescue,

Причина этого заключается в том, что при ошибках чтения dd продолжает пытаться и пытаться и пытаться - потенциально ждет долгое время, чтобы произошли тайм-ауты. dd_rescue делает умные вещи, такие как чтение до ошибки, затем выбирает место на диске и читает назад до последней ошибки, и dd_rhelp в основном dd_rescue менеджер сессий - умный запуск и возобновление dd_rescue работает, чтобы сделать это снова быстрее.

Конечный результат dd_rhelp максимальное количество данных, восстановленных за минимальное время Если ты уйдешь dd_rhelp работает, в конце концов, он делает ту же работу, что и dd в то же время. Однако если dd обнаружены ошибки чтения на байте 100 вашего 100-гигабайтного диска, вам придется долго ждать, чтобы восстановить остальные 9999 900 байт *, тогда как dd_rhelp + dd_rescue восстановит большую часть данных намного быстрее.

На исходном диске не должно быть никаких смонтированных файловых систем. Как пользователь, который может прочитать блочное устройство (root работает), запустите 'dd if=/dev/sda ....'

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

Например:

dd if=/dev/sda | ssh user@backupserver "cat > backup.img"

Но более сильно:

dd if=/dev/sda | pv -c | gzip | ssh user@backupserver "split -b 2048m -d - backup-`hostname -s`.img.gz"

Приведенное выше копирует сжатый образ исходного жесткого диска в удаленную систему, где он хранит его в пронумерованных блоках 2G, используя имя исходного хоста, и в то же время информирует вас о ходе выполнения.

Обратите внимание, что в зависимости от размера диска, скорости процессора в источнике, скорости процессора в пункте назначения, скорости сети и т. Д. Вы можете пропустить сжатие, выполнить сжатие на удаленной стороне или включить сжатие ssh.

Для клонирования диска все, что вам действительно нужно, это указать вход и выход для dd:

dd if=/dev/hdb of=hdb.img

Конечно, убедитесь, что у вас есть соответствующие права на чтение прямо из /dev/hdb (Я бы порекомендовал запускать как root), и что /dev/hdb не смонтирован (вы не хотите копировать во время замены диска). После завершения, hdb.img будет побайтовым клоном всего диска.

Есть несколько недостатков в использовании dd клонировать диски. Первый, dd скопирует весь ваш диск, даже пустое место, и если это сделать на большом диске, это может привести к очень большому файлу изображения. Во-вторых, dd не дает абсолютно никаких индикаторов прогресса, что может расстраивать, потому что копирование занимает много времени. В-третьих, если вы копируете этот образ на другие диски (опять же, используя dd), они должны быть такими же большими или большими, как исходный диск, но вы не сможете использовать дополнительное пространство на целевом диске до тех пор, пока вы не изменить размер ваших разделов.

Вы также можете сделать прямую копию с диска на диск:

dd if=/dev/hdb of=/dev/hdc

но вы все еще подвержены вышеуказанным ограничениям относительно свободного места.

Первый недостаток можно устранить, распаковав данные при копировании. Например:

dd if=/dev/hdb | gzip -9 > hdb.img.gz

Второй недостаток можно устранить с помощью pipeview (pv) инструмент. Например:

dd if=/dev/hdb | (pv -s `fdisk -l /dev/hdb | grep -o '[0-9]*\{1\} MB' | awk '{print $1}'`m) | cat > hdb.img

Я не знаю способа преодолеть третий недостаток.

Кроме того, вы можете ускорить время копирования, сообщив dd работать с большими кусками данных. Например:

dd if=/dev/hdb of=hdb.img bs=1024
dd if=/dev/sda of=/dev/sdb bs=4096 conv=sync,noerror

Это скопирует диск и пропустит блоки с ошибками, что очень важно.

Это основные и необходимые опции для использования dd для клонирования или спасения диска.

Я не хотел публиковать другой ответ, но не было хороших ответов с необходимыми опциями "conv=sync,noerror" среди 25 уже опубликованных.

Другая полезная вещь, которую вы можете сделать с дисками dd и rescue, - это копирование данных по сети:

remote_machine$ nc -l -p 12345

local_machine$ dd if=/dev/sda | nc remote_machine 12345

Вы можете вставить gzip в оба этих конвейера, если сеть не является локальной. Для прогресса используйте pv, Чтобы заставить netcat local_machine выйти после завершения копирования, вы можете добавить -w 5 или что-то.

Имейте в виду, что dd делает точную копию, включая все пустое пространство.

Это означает:

  1. 2-й диск должен быть не меньше первого
  2. Если второй диск больше, дополнительное пространство будет потрачено впустую (файловая система может быть расширена за вас)
  3. Если исходный диск не заполнен, dd будет тратить много времени на копирование пустого пространства.
  4. Таким образом вы можете скопировать либо весь диск, либо отдельный раздел.
  5. Если это загрузочный диск, я уверен, что вам нужно установить загрузчик после использования dd

Надеюсь, что это полезно

Это своего рода дешевый хак, но это быстрый и грязный способ контролировать ваш процесс DD.

Запустите команду дд. Откройте новую оболочку и выполните ps awx, чтобы найти PID вашего процесса dd. Теперь в новой оболочке наберите -n 10 kill -USR1 {pid вашего процесса DD}

Это ничего не даст в окне вывода часов, но в исходной оболочке DD DD начнет выводить отчеты о состоянии каждые 10 секунд. Конечно, вы можете изменить -n 10 в команде watch на любой другой период времени.

Тахионный

Как копировать с использованием dd (в данном случае на удаленную машину, но тот же принцип применяется к локальной копии), который показывает прогресс.

Он работает путем сохранения pid через файловый дескриптор 3 в / tmp / pid, который затем используется для последующих убийств с сигналом USR1. Проблема была в том, чтобы отфильтровать вывод прогресса на stderr только в одну строку через фильтрацию stderr через подоболочку.

(dd bs=1M if=$lv-snapshot & echo $! >&3 ) 3>/tmp/pid  2> >(grep 'copied' 1>&2) | gzip --fast | ssh $DEST "gzip -d | dd bs=1M of=$lv" &
# Need this sleep to give the above time to run
sleep 1
PID=$(</tmp/pid)

while kill -0 $PID; do
  kill -USR1 $PID
  sleep 5
done

Вы могли бы попробовать что-то вроде этого

dd if=/dev/sda2 of=/dev/sdb2 bs=4096 conv= синхронизация,noerror

чтобы пропустить все ошибки и иметь точный клон раздела или жесткого диска

Другая важная функция - копирование MBR, таблиц разделов и загрузочных записей.

Просто

dd if=/dev/sda of=parttable bs=512 count=1

и другое направление, когда вы пишете это. Польский с fdisk после.

Вы чувствуете себя намного безопаснее, если у вас есть резервная копия таблицы разделов.

Кроме того, это делает переход на другой жесткий диск (при изменении структуры разделов) приятным.

Большая часть информации была описана в предыдущих вставленных получателях, но не все были описаны.

В Linux вы можете клонировать жесткий диск или раздел с помощью команды dd. Внимание, когда вы допустите ошибку, вы потеряете все свои данные.

Во-первых, назначение не должно использоваться, во-вторых, источник не должен использоваться или переустанавливаться в режиме только для чтения. В противном случае копия будет повреждена. Если перемонтирование невозможно, сделайте загрузочный диск (hdd/ssd/pendrive) любым дистрибутивом linux live. Я всегда преуспел, но это твой выбор. Если это возможно, вы можете загрузить или изменить системный уровень на 1, для однопользовательского режима, или вы можете напрямую перезагрузить систему в однопользовательском режиме, это зависит от дистрибутива. Если вы будете клонировать только один раздел, этот раздел должен быть размонтирован или перемонтирован в RO:

umount /mountpoint_or_device

или же

remount -o,ro /mountpoint_or_device

Если вы хотите клонировать весь жесткий диск, вы должны размонтировать или перемонтировать все разделы.

Вы должны определить источник и устройство назначения. пожалуйста, посмотрите на dmesg, здесь хранится вся необходимая информация об устройстве, с поставщиком и т. д. В качестве альтернативы можно определить размер устройства, если он другой. Далее, пункт назначения должен быть таким же или большим, чем источник. Вы должны вычислить источник, например: fdisk -l /dev/sda, за исключением геометрии раздела (может быть GPT), вы получите: 1. общий размер диска, гигабайт и байт 2. историческая геометрия и общее число секторов, очень важная информация 3. размер блока в байтах, обычно это 512.

например:

# fdisk -l /dev/sda

Disk /dev/sda: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders, total 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000f1d1e

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048    40136703    20067328   83  Linux
/dev/sda2        40138750    41940991      901121    5  Extended
/dev/sda5        40138752    41940991      901120   82  Linux swap /     Solaris

дальше давайте попробуем делитель больше 512, у нас есть 41943040 физических секторов:

41943040/256 = 163840, очень хорошо, мы можем сделать массовое копирование 256 секторов. мы можем больше? давайте попробуем: 41943040 / 1024 = 40960, я думаю, этого достаточно, мы выберем этот. Давайте посчитаем размер группы секторов: 512(размер сектора) * 1024 = 524288 байт, eq 512K . Тогда мы можем использовать параметр bs=512K или меньше, но разделить это на 2^x. Для современных жестких дисков с большим внутренним кешем это достаточно практично. для более старых дисков с гораздо меньшим объемом кэша достаточно значения 32 КБ или менее.

Затем после подготовки мы можем сделать копию: dd if=/dev/source_devide of=/dev/destination_device bs=32K, и копирование будет выполнено. Обратите внимание, любая ошибка перезапишет ваши важные данные. По назначению все будет перезаписано.

Если вы попытаетесь восстановить данные на поврежденном исходном диске, лучше использовать собственный размер сектора, обычно это 512 байт, и добавить опцию conv=notrunc . в противном случае дыры в источнике, отброшенные плохими секторами, будут соединены смещением секторов по месту назначения. Это повредит копию с небольшим шансом на ремонт. тогда команда будет:

dd if=/dev/source of=/dev/destination bs=512 conv=notrunc  

и долгое время ждите, когда диск и система сдадутся и пройдут сектор за сектором до конца.

dd - полезный инструмент для перемещения раздела на новое место. Просто создайте раздел, сделайте dd для нового раздела (это может быть больше, намного больше) и, если это возможно, разверните скопированную файловую систему для заполнения всего нового раздела, ext3/ext4/xfs/zfs/btrfs имеют эту возможность. Наконец, вы должны изменить /etc/fstab, затем размонтировать / смонтировать, если это возможно, или перезагрузить систему.

Конечно, вы можете клонировать любой тип раздела. Команда dd не смотрит на тип файловой системы, она ничего не делает со своей структурой. тогда эта команда может быть использована для клонирования NTFS или других типов разделов.

Есть какая-то хитрость. Если вы не установили параметр, тогда dd поместит вывод в его стандартный вывод. тогда вы можете сделать сжатую сырую копию диска или раздела, например:

dd if=/dev/sda bs=512 | gzip >/any/place/computerOne_sda.gz

Конечно, это должно быть сделано в автономном режиме. Вы можете восстановить это:

zcat /any/place/computerOne_sda.gz| dd of=/dev/sda bs=512   

, тогда все жесткие диски sda будут перезаписаны этой резервной копией, и все текущие данные будут потеряны. Вы можете сделать это также с разделом Windows NTFS и жестким диском, используемым этим. Конечно, вы можете использовать другую команду сжатия, в зависимости от вашего выбора.

Для дальнейшего использования может быть интересно проверить ddrescue. Это спасло мой день пару раз.

Дд предоставляет информацию о прогрессе - ну, большинство версий в Linux. Я видел некоторые, которые не помнят, но не помнят Unix-аромат.

Страница man говорит: отправка сигнала USR1 в работающий процесс 'dd' заставляет его печатать статистику ввода / вывода со стандартной ошибкой и затем возобновлять копирование.

Я использую эту функцию регулярно.

Кто-то должен был сказать это: попробуйте Clonezilla (http: // clonezilla.org/)

Что вы получаете? Для копирования используются только части файловой системы. Clonezilla использует dd, grub, sfdisk, parted, partimage, ntfsclone и / или partclone. В зависимости от выбранных вами вариантов.

Достойную документацию можно найти по адресу: http: // clonezilla.org/clonezilla-live/doc/.

Вы можете создать сжатый файл образа раздела (или диска) на лету, используя bzip2 или же gzip вместо dd, Это удобно для хранения изображений на съемных носителях:

bzip2 -c /dev/sdaX >imagefile.bz2
or
gzip -c /dev/sdaX >imagefile.gz

Если диск ранее интенсивно использовался, вы можете улучшить сжатие, заполнив все неиспользуемое пространство нулями до создания образа:

mkdir /mnt/mymountpoint
mount /dev/sdaX /mnt/mymountpoint
cat /dev/zero >/mnt/mymountpoint/dummyfile.bin
(Wait for it to end with a "disk full" error)
rm /mnt/mymountpoint/dummyfile.bin
umount /mnt/mymountpoint

Чтобы восстановить образ на другой диск, все, что вам нужно сделать, это:

bzcat imagefile.bz2 >/dev/sdbY
or
zcat imagefile.gz >/dev/sdbY

Для томов NTFS я предпочитаю использовать ntfsclone. Это часть пакета ntfsprogs.

По какой-то причине, dd не работает при создании образа компакт-дисков со звуковыми дорожками. Вам нужно использовать cdrdao или что-то подобное, чтобы получить файл изображения + TOC.

Я был вне роли администратора уже много лет, но я знаю, что "dd" - это дело. Я регулярно использовал эту технику в конце 80-х на компьютерах Sun Sparc и 386i. У меня был один клиент, заказавший более 30 систем 386i с программным обеспечением CAD, которое было распространено на нескольких лентах QIC.

Мы установили на первом компьютере, настроили приложение, запустили sys-unsfig от SunOS, поместили диск в обувную коробку с другим адресом SCSI и затем перешли к "dd" на остальные 30 дисков.

Просто предупреждение для начинающих, о котором нужно сказать: по крайней мере, с некоторыми версиями bs=X означает, что память размером X будет буквально выделена. bs=2 ГБ в системе с 1 ГБ ОЗУ и недостаточной подкачкой БУДЕТ привести к плохим последствиям.

Как уже упоминалось выше, одним из недостатков клонирования смонтированной файловой системы является потенциальное повреждение данных. Это, очевидно, не относится к полным клонам дисков, но если вы используете LVM, вы можете сделать снимок LogicalVolume и dd из снимка, чтобы получить согласованное изображение.

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

Я хотел бы опубликовать эквивалент, используя XZ.

Преимущество в том, что я могу затем использовать 7-Zip для проверки содержимого изображения, не распаковывая весь архив. Это стало возможным благодаря тому, что xz поддерживает произвольный поиск и что 7-Zip может интерпретировать многие типы файловых систем.

Чтобы захватить изображение:

      dd if=/dev/sda status=progress | xz > image.img.xz

Чтобы восстановить изображение:

      xzcat image.img.xz | dd of=/dev/sda status=progress

Если вы используете старую версию dd, сделайте следующее, чтобы увидеть прогресс:

      Alt + F2 (to open another terminal)

watch -n 1 "kill -USR1 `pidof dd`"

Alt + F1 (to change back to the original terminal)

It should now display progress.

Одна вещь, о которой вы должны знать, когда пишете полный диск, это перезаписывает основную загрузочную запись принимающего диска. Он содержит таблицу разделов и другую важную информацию. Если новый диск не совпадает со старым диском, это может создать все виды таблиц. Копирование разделов, как правило, более безопасно (и разделы подкачки копировать не нужно)

Примечание по скорости: по моему опыту, dd в два раза быстрее, если вы указываете bs=1024 вместо значения по умолчанию bs=512. Использование еще большего размера блока не дает заметного ускорения при bs=1024.

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

Я хотел бы опубликовать эквивалент, используя Zstandard, который работает очень быстро.

К сожалению, выходной файл невозможно проверить с помощью 7-Zip.

Чтобы захватить изображение:

      dd if=/dev/sda status=progress | zstd > image.img.zst

Чтобы восстановить изображение:

      zstdcat image.img.zst | dd of=/dev/sda status=progress
Другие вопросы по тегам