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

182

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

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

falstro
источник
Я знаю, как работает dd, мой вопрос был больше направлен на любые известные проблемы, связанные с dd при клонировании дисков (как описано по ссылке), возможно, это было не очень понятно. Его ответ содержит, а ваш нет: «У меня никогда не было с этим проблем». Я также высказался за ваш ответ, так как вы определенно представили некоторые интересные моменты (мне нравится тот, что нет индикации прогресса).
Фальстро
1
Похоже, вы получили удар
Кайл Кронин
Я не видел этого здесь, когда я задал (и ответил) аналогичный вопрос о суперпользователе - superuser.com/questions/11453/…
Уоррен
3
Ирония в том, что Джоэл связал вопрос с хорошим примером сбоя сервера, хотя ни один из ответов не был хорошим. Среди 25 (исключая комментарии) не было ни одного ответа с правильными ddвариантами пропуска поврежденных блоков - что важно при клонировании дисков для восстановления. Я добавил лучший ответ, который может клонировать диски с плохими блоками:dd if=/dev/sda of=/dev/sdb bs=4096 conv=sync,noerror
Сэм Уоткинс
Я думаю, что dd restore может "потерпеть неудачу", если говорить о файловых системах, зависящих от геометрии диска, и восстановление выполняется на не идентичных жестких дисках? У меня возникли некоторые ошибки при восстановлении dd, и я думаю, что это была проблема в моем случае.
Марко

Ответы:

160

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

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

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

Адам Гиббинс
источник
12
Конечно, до тех пор, пока / dev / sdb не меньше, чем / dev / sda ...
Эдди
22
добавьте "bs = 100M conv = notrunc", и это намного быстрее, по моему опыту.
Тим Уиллискрофт
127
просто будьте очень осторожны с буквами «я» и «о» ...
банди
17
Никто, кажется, не знает этого трюка ... dd - асимметричная программа копирования, то есть сначала она читает, потом пишет, а потом обратно. Вы можете трубы дд к себе и заставить его выполнить копию симметрично, как это: dd if=/dev/sda | dd of=/dev/sdb. В моих тестах выполнение команды без канала дало мне пропускную способность ~ 112 Кбит / с. С трубы я получил ~ 235кб / с. У меня никогда не было проблем с этим методом. Удачи!
Мистери
13
@ Mistiry, это не значение слова симметричный.
Псуси
113

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

Дэвид Хикс
источник
2
Работает ли это и с «современными» фс, такими как BTRFS, NILFS, [о чем вы только мечтаете]?
Стив Шнепп
DD работает на блочных устройствах, уровень абстракции ниже, чем в файловой системе, поэтому должен, да. Я на самом деле не пробовал, хотя. Хм, NILFS выглядит интересно, мне придется взглянуть на это.
Дэвид Хикс
4
+1 за kill -SIGUSR1 %1, и команда OSX dd с радостью принимает SIGUSR1 ... супер полезно, спасибо!
Stuartc
1
+1, потому что Kill -SIGUSR1 1234я искал это.
hot2use 12.12.12
2
Должна ли она быть: dd if=/dev/hdb | gzip -c > /image.img.gz?
Майк Козер
37

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

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

jldugger
источник
7
Я подозреваю, что syncэто не ответ на проблемы с повреждением файлов. Что произойдет, если Деймон или что-то напишет больше файлов после sync, во время ddоперации?
удалено
5
Рекомендуется сначала отключить накопитель (или перемонтировать его только для чтения), но это не всегда возможно
Алекс Болотов
1
В этом случае вы используете rsync и позволяете ему обрабатывать файлы, чтобы получить согласованный файл, а семантика Copy On Write обрабатывает входящие записи.
Jldugger
4
Я хотел бы добавить, что запуск dd на смонтированной файловой системе НЕ ПОПРОШИТ файлы на смонтированной файловой системе, но здесь подразумевается, что копия файловой системы обязательно будет в известном хорошем состоянии.
3моло
1
Использование rsyncобеспечит согласованность внутренних данных в целевой файловой системе. Это не обеспечит согласованность данных в файлах - для этого вам нужно будет заблокировать файлы, и любые программы, которые записывают в файлы, должны будут соблюдать эти блокировки.
Мартин Гейслер
26

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

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

Timb
источник
13
Если у вас есть диск с поврежденными секторами, вам действительно следует использовать ddrescue вместо dd. Это намного более эффективно и имеет гораздо больше шансов восстановить больше данных. (Не путайте это с dd_rescue, что не так хорошо)
2010 г.,
3
не следует использовать блоки большого размера при попытке пропустить поврежденные блоки, иначе будет пропущено слишком много. 4096 достаточно большой.
Сэм Уоткинс,
17

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

Кайл Кронин
источник
7
... dd не дает абсолютно никаких индикаторов прогресса ... - ну, это не так - есть довольно хитрый способ показать прогресс - вы должны узнать pid процесса dd ('ps -a | grep dd'), а затем отправьте сигнал USR1 этому процессу - 'kill -USR1 <dd_pid_here>' (без <>), который заставляет dd показывать информацию о прогрессе.
Михал Бернхард
4
«несколько секторов на диске, которые dd не мог прочитать»: думаю, conv=sync,noerrorэто помогло бы.
Готье
2
Эти conv=sync,noerrorпараметры необходимы, они позволяют dd пропускать плохие блоки и обнулять их на изображении, чтобы все выровнялось правильно. Реквизит для тех немногих, кто что-то прокомментировал.
Сэм Уоткинс,
1
GNU ddrescueпредоставляет индикатор прогресса без каких-либо специальных параметров, и вы можете остановить копирование и продолжить с того места, где остановились.
эндолит
2
Менее сложный способ добиться прогресса с помощью dd - добавить опциюstatus=progress
Джеймс
11

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

Бен Уильямс
источник
1
Некоторая помощь при выборе между dd_rescue и ddrescue: askubuntu.com/a/211579/50450
Иоганн
7

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

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

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

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

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

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

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
Джеймс Самнерс
источник
1
Вы уже сказали, как преодолеть третий недостаток ... изменить размер разделов. Увеличение раздела, как правило, является безопасной и быстрой операцией (в отличие от сжатия или перемещения, которое является медленным и более опасным, поскольку перемещает данные).
Давр
gzipping не будет работать с диском, который использовался в течение некоторого времени, так как он будет заполнен текущими или удаленными данными. gzip будет работать только в том случае, если пустое пространство обнуляется, что имеет место только на новом диске.
Tozz
3
@ Tozz: Вы можете улучшить сжимаемость образа файловой системы, заполнив файловую систему файлом, заполненным нулями, синхронизировав его с диском, а затем удалив его. dd if=/dev/zero bs=1M of=/balloon; sync; rm /balloon (Модуль дополнительного интеллекта на уровне файловой системы.)
пересмотр
5

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

user5692
источник
9
Это не совсем правильно. Команда 'remote_machine' пропускает что-то, например, > disk_backup.imgили, |dd of=/dev/sdbили что-то еще, в зависимости от того, что вы хотите сделать. Я предполагаю, что вы не хотите записывать образ диска в стандартный вывод.
Давр
1
И добавьте gzip на обоих концах, чтобы минимизировать отправленные данные.
3моло
4

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

Это значит:

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

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

казарка
источник
8
Если вы клонируете весь жесткий диск, вы также клонируете загрузчик.
Кристиан Чиупиту
ну, просто подумай, но нельзя ли просто использовать gparted, чтобы перенести скопированный раздел / диск на то, что используется, - тогда брось dd? Предполагая, что это одноразовое изображение, оно должно смягчить эту проблему.
bbqchickenrobot
3

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

Андерс Ханссон
источник
3

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

Только что

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

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

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

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

Аламар
источник
3

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

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

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

Тахионный


источник
OS X не имеет в watchналичии и -USR1убивает дд. Следующая команда работает, хотя: while [ true ]; do killall -INFO dd; sleep 30; done
Адам Франко
Я не думаю, что это очень практично для новичков, они могут лучше обслуживаться pvкомандой.
Робби Маккенни
Я обнаружил, что вы также можете отправить SIGINFO, используя CTRL-T в dd. Это проще, чем цикл while и OSX 10.6 cd у меня нет killall. Об этом узнали из en.wikipedia.org/wiki/Unix_signal#Sending_signals
Гражданин Кеплер,
3
dd if=/dev/sda of=/dev/sdb bs=4096 conv=sync,noerror

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

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

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

Сэм Уоткинс
источник
1
На самом деле это было упомянуто ранее, в одном ответе и как минимум в двух комментариях.
Майкл Хэмптон
1
@ Михаил ответ, который вы связали, не содержит полный пример команды и имеет другие недостатки - не рекомендуется использовать большой размер блока, conv=sync,noerrorпоскольку он пропустит слишком много данных для каждого плохого блока. Эти параметры необходимы для «клонирования восстановления», и нет смысла искать их в комментариях. Самый популярный ответ является адекватным, если на дисках нет поврежденных блоков, например, для клонирования исходного диска, но не для восстановления.
Сэм Уоткинс
@ Майкл, который я привел, - это команда, которую я использовал несколько раз для профессионального восстановления диска. Хотя есть и другие инструменты, которые могут выполнять работу несколько лучше, приведенный мною пример лучше клонирует восстановление диска, чем любой другой ddпример, но также подходит для клонирования безошибочного диска. Поэтому я считаю, что мой ответ здесь лучший, как «использовать DD для клонирования дисков». Я не добавил информацию о мониторинге прогресса, компрессии и т. Д., Потому что хотел сделать его простым и сосредоточиться на предоставлении краткого ответа, который правильно понимает основы.
Сэм Уоткинс
3

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

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

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

Сэм Уоткинс
источник
Это должен быть conv = sync, noerror. Опция sync необходима, иначе блоки с ошибками будут удалены, а не скопированы как нули.
Сэм Уоткинс,
2

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

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

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

Стивен
источник
Хотя это полезно, я сомневаюсь в его практичности для новичка.
Робби Маккенни
2

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

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

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


источник
Я нашел документацию немного грубой, и клонирование диска Linux PATA на диск SATA не оставило меня с чем-то, что я мог загрузить (пока). Но намного быстрее, чтобы получить тот же результат, что и dd, и он отлично работал при обновлении моего ноутбука.
jbdavid
2

Как копировать с использованием 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
Эдвард Грунендал
источник
На самом деле не имеет отношения к вопросу, но это аккуратный трюк с использованием дескрипторов sub-shell и high (выше, чем stderr) для передачи данных из него, +1
falstro
Я сам ссылался на эту страницу для разных вариантов dd при клонировании дисков, так что в то время это казалось подходящим местом для того, чтобы поставить конечный результат того, что я использовал для клонирования, тем более, что я думал, что это было довольно аккуратно :)
Эдвард Грунендал
2

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

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

Znik
источник
1

Вы можете создать сжатый файл образа раздела (или диска) на лету, используя 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
JCCyC
источник
Проголосовал за трюк, чтобы заполнить оставшееся пространство нулями. Умная!
Беспорядок
Это мне нужно это! SD-карта ранее использовалась для захвата видео и была полна дерьма, сжатие не помогало вообще.
Коди Смит
0

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

Matt
источник
0

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


источник
4
Дисковые кластеры обычно имеют размер около 4 тыс., поэтому 4096, вероятно, является хорошим вариантом, и даже 8192, если вы хотите читать 2 кластера одновременно. Не становитесь слишком большими, поскольку вы сталкиваетесь с проблемами фрагментированной памяти
user4767
0

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

Поль де Вриз
источник
0

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

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

pbrooks100
источник
0

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

змееподобный
источник
0

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

rackandboneman
источник