it-swarm-ru.tech

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

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

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

187
falstro

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

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

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

165
Adam Gibbins

Чтобы сэкономить место, вы можете сжать данные, созданные 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 Команды dd отличаются по сигналам, которые они принимают (OSX использует SIGINFO - вы можете нажать Ctrl+T сообщить о статусе).

119
David Hicks

[~ # ~] осторожно [~ # ~] : файловая система может повредить файлы. Причина проста: он не понимает, что может происходить в файловой системе, и не пытается ее смягчить. Если запись ведется частично, вы получите частичную запись. Обычно это плохо для вещей и, как правило, фатально для баз данных. Более того, если вы испортите склонные к опечаткам if и из параметров Горе тебе. В большинстве случаев rsync является столь же эффективным инструментом, написанным после появления многозадачность , и будет обеспечивать согласованные представления отдельных файлов. ,.

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

39
jldugger

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

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

26
TimB

Для клонирования диска все, что вам действительно нужно сделать, это указать вход и выход для 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, но продолжает чтение, даже если встречает ошибка. На самом деле я никогда не использовал программу, но это стоит учитывать, особенно если диск, с которого вы копируете, старый, в котором могут быть поврежденные сектора, даже если система выглядит нормально.

17
Kyle Cronin

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

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

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

11
Ben Williams

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

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

Например:

dd if=/dev/sda | ssh [email protected] "cat > backup.img"

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

dd if=/dev/sda | pv -c | gzip | ssh [email protected] "split -b 2048m -d - backup-`hostname -s`.img.gz"

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

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

7
retracile

Для клонирования диска все, что вам действительно нужно, это указать входные и выходные данные для 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
6
James Sumners

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

remote_machine$ nc -l -p 12345

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

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

5
user5692

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

Это значит:

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

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

4
Brent
dd if=/dev/sda of=/dev/sdb bs=4096 conv=sync,noerror

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

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

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

4
Sam Watkins

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

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

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

3
hirol

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

Просто

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

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

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

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

3
alamar

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

3
Anders Hansson

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

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

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

Тахионный

3
Tachyon

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

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

Во-первых, назначение не должно использоваться, во-вторых, источник не должен использоваться или переустанавливаться в режиме только для чтения. В противном случае копия будет повреждена. Если перемонтирование невозможно, сделайте загрузочный диск (hdd/ssd/pendrive) любым дистрибутивом linux live. Я превернул knoppix, но это ваш выбор. Если это возможно, вы можете загрузить или изменить системный уровень на 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. Для современных жестких дисков с большим внутренним кешем это достаточно практично. для более старых дисков с гораздо меньшим объемом кеша достаточно значения 32K или меньше.

Затем после подготовки мы можем сделать копию: 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 и жестким диском, используемым этим. Конечно, вы можете использовать другую команду сжатия, в зависимости от вашего выбора.

2
Znik

Как копировать с использованием 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
2
Edward Groenendaal

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

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

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

2
Steven

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

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

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

2
Roflo

Вы можете создать сжатый файл образа раздела (или диска) на лету, используя 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
1
JCCyC

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

0
Paul de Vrieze

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

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

0
pbrooks100

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

0
rackandboneman

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

0
Matt

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

0
Ed Brannin

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

0
Ophidian