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


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

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


174
2018-05-05 18:21


Источник


Я знаю, как работает dd, мой вопрос был больше в направлении любых известных проблем, связанных с dd при клонировании дисков (как описано в ссылке), может быть, это было не очень ясно. То, что содержит его ответ, а ваше - нет: «У меня никогда не было никаких проблем с этим». Я тоже поддержал ваш ответ, так как вы определенно представили некоторые интересные моменты (мне нравится тот, у которого нет индикатора прогресса). - falstro
Похоже, у вас есть Spolsky Bump: joelonsoftware.com/items/2009/05/29.html - Kyle Cronin
не видел этого здесь, когда я спросил (и ответил) аналогичный вопрос о суперпользователе - superuser.com/questions/11453/... - warren
Как это ни парадоксально, Джоэл связался с вопросом как хороший пример ошибки сервера, хотя ни один из ответов не был хорошим. Не было ответа одного из 25 (исключая комментарии) с правом dd опции для пропуска плохих блоков - что необходимо при клонировании дисков для восстановления. Я добавил лучший ответ, который может клонировать диски с плохими блоками: dd if=/dev/sda of=/dev/sdb bs=4096 conv=sync,noerror - Sam Watkins
Я думаю, что восстановление dd может «потерпеть неудачу», если говорить о зависящих от геометрии файлах файловых системах и восстановить их на не идентичных жестких дисках? Я испытал некоторые неудачи при восстановлении dd, и я думаю, что это была проблема в моем случае. - Marco


Ответы:


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

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

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


150
2018-05-05 18:31



Конечно, до тех пор, пока / dev / sdb не меньше, чем / dev / sda ... - Eddie
добавьте «bs = 100M conv = notrunc», и это намного быстрее в моем опыте. - Tim Williscroft
просто будьте очень осторожны с буквами «i» и «o» ... - bandi
Никто, кажется, не знает этого трюка ... dd - это ассиметричная программа копирования, то есть она будет читать сначала, а затем писать, а затем вернуться. Вы можете подключить dd к себе и заставить его выполнять копию симметрично, например: dd if=/dev/sda | dd of=/dev/sdb, В моих тестах запуск команды без канала дал мне пропускную способность ~ 112 кбит / с. С трубой я получил ~ 235kb / s. Я никогда не испытывал никаких проблем с этим методом. Удачи! - Mistiry
@Mistiry, это не значит, что слово симметрично. - psusi


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


103
2018-05-06 22:47



Это также работает с «современными» fs такими BTRFS, NILFS, [что бы вы ни мечтали]? - Steve Schnepp
DD работает на блочных устройствах, уровень абстракции ниже файловой системы, поэтому он должен, да. Я на самом деле не пробовал. Хмм, NILFS выглядит интересно, мне нужно взглянуть на это. - David Hicks
+1 для kill -SIGUSR1 %1, а команда OSX dd с радостью принимает SIGUSR1 ... супер полезно, спасибо! - stuartc
+1 для Kill -SIGUSR1 1234 Я искал это. - hot2use
Должно ли это быть: dd if=/dev/hdb | gzip -c > /image.img.gz ? - Mike Causer


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

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


37
2018-05-05 20:20



Я подозреваю, что syncне является ответом на проблемы с коррупцией в файлах. Что происходит, если деамон или что-то пишет больше файлов после sync, в течение dd операция? - Deleted
Рекомендуется сначала запустить диск (или перезагрузить его только для чтения), но это не всегда возможно - Alex Bolotov
В этом случае вы используете rsync и позволяете ему обрабатывать магию файлов, чтобы получить согласованный файл, и пусть семантика Copy On Write обрабатывает входящие записи. - jldugger
Я хотел бы добавить, что запуск dd на смонтированной файловой системе НЕ КОРРУПЕТ файлы на смонтированной файловой системе, но здесь имеется в виду, что копия файловой системы обязательно будет в известном хорошем состоянии. - 3molo
С помощью rsync будет обеспечивать, чтобы внутренние данные в целевой файловой системе согласован. Это не будет убедитесь, что данные в файлах согласованы - для этого вам нужно будет заблокировать файлы, и любые программы, которые пишут в файлы, должны будут соблюдать эти блокировки. - Martin Geisler


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

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


26
2018-05-07 02:42



Если у вас есть диск с плохими секторами, вы действительно должны использовать «ddrescue» вместо dd. Он намного эффективнее и имеет гораздо больше шансов восстановить больше данных. (Не путайте его с dd_rescue, что не так хорошо) - davr
не следует использовать большой размер блока, если вы пытаетесь пропустить плохие блоки или пропустить слишком много. 4096 достаточно большой. - Sam Watkins


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


16
2018-05-05 18:26



... dd не дает абсолютно никаких указаний на прогресс ... - ну это неправда - есть какой-то сложный способ показать прогресс - вам нужно узнать pid процесса dd («ps -a | grep dd»), а затем отправить сигнал USR1 в этот процесс - «kill -USR1 < dd_pid_here> '(без <>), которые заставляют dd показывать информацию о ходе. - Michal Bernhard
«несколько секторов на диске, которые dd не могли прочитать»: я думаю, что conv=sync,noerror помог бы. - Gauthier
conv=sync,noerror параметры необходимы, они позволяют dd пропускать плохие блоки и обнулять их в изображении, чтобы все было правильно выровнено. Подкрепляет очень немногих людей, которые что-то прокомментировали. - Sam Watkins
GNU ddrescue показывает индикатор прогресса без каких-либо специальных опций, и вы можете остановить копирование и возобновить работу, где вы остановились. - endolith
Менее сложным способом добиться успеха в dd является добавление опции status=progress - James


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


11
2018-05-31 02:12



Некоторая помощь в выборе между dd_rescue и ddrescue: askubuntu.com/a/211579/50450 - Johann


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


7
2018-05-29 19:23



+1 Трубопровод через gzip может сэкономить много времени и пропускной способности! - M. Dudley
Следует также отметить, что добавление «bs = 1M» в команду dd обычно значительно улучшает скорость. - 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

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

Первый недостаток может быть разрешен путем 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 of=hdb.img bs=1024

6
2018-05-29 22:03



Вы уже сказали, как преодолеть третий недостаток ... изменить размеры разделов. Расширение раздела - это, как правило, безопасная и быстрая работа (по сравнению с сокращением или перемещением, что является медленным и опасным, поскольку оно перемещает данные). - davr
gzipping не будет работать с диском, который использовался в течение некоторого времени, поскольку он будет заполнен либо текущими, либо удаленными данными. gzip будет работать только в том случае, если пустое пространство нулевое, что имеет место только с новым диском. - Tozz
@Tozz: вы можете улучшить сжимаемость образа файловой системы, заполнив файловую систему файлом, заполненным 0, синхронизируя его на диск, а затем удалив его. dd if=/dev/zero bs=1M of=/balloon; sync; rm /balloon(Дополнительный интеллект в уровне файловой системы). - retracile


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

remote_machine$ nc -l -p 12345

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

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


5
2018-05-29 18:09



Это не совсем правильно. В команде «remote_machine» отсутствует что-то, например > disk_backup.img или |dd of=/dev/sdb или что-то еще, в зависимости от того, что вы хотите сделать. Я предполагаю, что вы не хотите выгружать образ диска в stdout. - davr
И бросьте gzip на обоих концах, чтобы еще больше свести к минимуму отправленные данные. - 3molo


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

Это значит:

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

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


3
2018-05-05 18:38



Если вы клонируете весь жесткий диск, вы также клонируете загрузчик. - Cristian Ciupitu
welll, всего лишь тысяча, но не могли бы вы просто использовать gparted для обновления раздела / диска, скопированного до того, что было использовано, а затем drop dd? Предполагая, что это разовое изображение, он должен смягчить эту проблему. - bbqchickenrobot


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


3
2018-05-06 21:06