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

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

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

174 голоса | спросил falstro 5 Maypm09 2009, 22:21:52

27 ответов


150

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

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

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

ответил Adam Gibbins 5 Maypm09 2009, 22:31:57
103

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

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

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

gunzip -c /image.img.gz | dd = /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 + < kbd> T , чтобы сообщить о статусе).

ответил David Hicks 7 Mayam09 2009, 02:47:31
37

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

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

ответил jldugger 6 Mayam09 2009, 00:20:34
26

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

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

ответил TimB 7 Mayam09 2009, 06:42:47
16

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

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

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

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

ответил Kyle Cronin 5 Maypm09 2009, 22:26:44
11

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

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

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

ответил Ben Williams 31 Mayam09 2009, 06:12:25
7

Исходный диск не должен иметь смонтированных файловых систем. Как пользователь, способный читать блок-устройство (работает с корнем), запустите '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 .

ответил retracile 29 Maypm09 2009, 23:23:34
6

Чтобы клонировать диск, все, что вам действительно нужно сделать, это указать ввод и вывод в 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

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

Первый недостаток может быть разрешен путем gzipping данных по мере создания копии. Например:

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 = hdb.img bs = 1024
ответил James Sumners 30 Mayam09 2009, 02:03:58
5

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

remote_machine $ nc -l -p 12345

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

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

ответил user5692 29 Maypm09 2009, 22:09:14
3

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

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

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

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

ответил Brent 5 Maypm09 2009, 22:38:56
3

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

ответил Anders Hansson 7 Mayam09 2009, 01:06:16
3

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

Просто

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

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

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

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

ответил alamar 29 Maypm09 2009, 22:18:37
3
dd if = /dev /sda of = /dev /sdb bs = 4096 conv = sync, noerror

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

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

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

ответил Sam Watkins 13 42014vEurope/Moscow11bEurope/MoscowThu, 13 Nov 2014 05:47:35 +0300 2014, 05:47:35
2

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

На странице руководства написано: Отправка сигнала USR1 в выполняемый процесс «dd» позволяет распечатывать статистику ввода-вывода до стандартной ошибки и возобновлять копирование.

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

ответил Steven 29 Maypm09 2009, 20:28:05
2

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

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

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

ответил 29 Maypm09 2009, 20:53:32
2

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

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

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

Тахионный

ответил 15 J000000Wednesday09 2009, 00:13:02
2

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

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

(dd bs = 1M if = $ lv-snapshot & echo $!> & 3) 3> /tmp /pid 2>> (grep 'copy' 1 & 2) | gzip --fast | ssh $ DEST "gzip -d | dd bs = 1M of = $ lv" &
# Нужен этот сон, чтобы дать вышеприведенное время для запуска
спать 1
PID = $ (& л; /TMP /PID)

в то время как kill -0 $ PID; делать
  kill -USR1 $ PID
  спать 5
сделанный
ответил Edward Groenendaal 31 J000000Wednesday13 2013, 09:01:41
2

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

dd if = /dev /sda2 of = /dev /sdb2 bs = 4096 conv = sync, noerror

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

ответил 22 PM00000010000002231 2009, 13:23:22
1

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

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

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

mkdir /mnt /mymountpoint
mount /dev /sdaX /mnt /mymountpoint
cat /dev /zero> /mnt/mymountpoint/dummyfile.bin
(Подождите, пока он закончится ошибкой «полный диск»)
rm /mnt/mymountpoint/dummyfile.bin
umount /mnt /mymountpoint

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

bzcat imagefile.bz2> /dev /sdbY
или
zcat imagefile.gz> /dev /sdbY
ответил JCCyC 26 J0000006Europe/Moscow 2009, 18:37:42
0

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

ответил Matt 29 Maypm09 2009, 22:47:46
0

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

ответил 29 Maypm09 2009, 23:26:11
0

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

ответил Paul de Vrieze 30 Maypm09 2009, 19:15:49
0

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

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

ответил pbrooks100 1 J0000006Europe/Moscow 2009, 15:23:05
0

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

ответил Ophidian 2 J0000006Europe/Moscow 2009, 04:51:19
0

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

ответил Ed Brannin 2 J0000006Europe/Moscow 2009, 04:35:41
0

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

ответил rackandboneman 10 Mayam12 2012, 03:47:06
0

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

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

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

umount /mountpoint_or_device

или

remount -o, ro /mountpoint_or_device

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

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

, например:

# fdisk -l /dev /sda

Диск /dev /sda: 21,5 ГБ, 21474836480 байт
255 голов, 63 сектора /дорожка, 2610 цилиндров, всего 41943040 секторов
Единицы = секторы 1 * 512 = 512 байт
Размер сектора (логический /физический): 512 байт /512 байт
Размер ввода /вывода (минимальный /оптимальный): 512 байт /512 байт
Идентификатор диска: 0x000f1d1e

   Начальная команда загрузки устройства
/dev /sda1 * 2048 40136703 20067328 83 Linux
/dev /sda2 40138750 41940991 901121 5 Расширенные
/dev /sda5 40138752 41940991 901120 82 Linux swap /Solaris

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

41943040/256 = 163840, очень хорошо, мы можем сделать массовую копию из 256 секторов. можем ли мы больше? давай попробуем: 41943040/1024 = 40960, я думаю, этого достаточно, мы выберем этот. Давайте подсчитаем размер группы секторов: 512 (размер сектора) * 1024 = 524288 bytes 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 = /dev /destination bs = 512 conv = notrunc

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

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

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

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

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

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

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

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

ответил Znik 8 J0000006Europe/Moscow 2017, 15:23:31

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132