Был задан ряд вопросов относительно инструментов клонирования дисков и dd
было предложено хотя бы один раз. Я уже рассматривал возможность использования dd
я, главным образом из-за простоты использования и того, что он доступен практически во всех загрузочных дистрибутивах Linux.
Как лучше всего использовать dd
для клонирования диска? Я быстро поискал в Google, и первый результат был очевиден неудачная попытка. Что мне нужно сделать после использования dd
, т.е. есть ли что-нибудь, что НЕ МОЖЕТ быть прочитано с помощью dd
?
dd, безусловно, лучший инструмент для клонирования, он создаст 100% реплику, просто используя следующую команду. У меня ни разу не было с этим проблем.
dd if=/dev/sda of=/dev/sdb bs=32M
Имейте в виду, что при клонировании каждого байта вы не должны использовать это на диске или разделе, который используется. Особенно приложения, такие как базы данных, не могут справиться с этим очень хорошо, и вы можете получить поврежденные данные.
Чтобы сэкономить место, вы можете сжать данные, созданные dd, с помощью gzip, например:
dd if=/dev/hdb | gzip -c > /image.img
Вы можете восстановить свой диск с помощью:
gunzip -c /image.img.gz | dd of=/dev/hdb
Чтобы сэкономить еще больше места, предварительно дефрагментируйте диск / раздел, который вы хотите клонировать (если необходимо), а затем обнулите все оставшееся неиспользуемое пространство, что упростит сжатие gzip:
mkdir /mnt/hdb
mount /dev/hdb /mnt/hdb
dd if=/dev/zero of=/mnt/hdb/zero
Подождите немного, dd в конечном итоге завершится с ошибкой с сообщением «диск заполнен», а затем:
rm /mnt/hdb/zero
umount /mnt/hdb
dd if=/dev/hdb | gzip -c > /image.img
Кроме того, вы можете запустить процесс dd в фоновом режиме, чтобы сообщить о состоянии, отправив ему сигнал с помощью команды kill, например:
dd if=/dev/hdb of=/image.img &
kill -SIGUSR1 1234
Проверьте свою систему - приведенная выше команда предназначена для команд dd Linux, OSX и BSD, которые различаются сигналами, которые они принимают (OSX использует SIGINFO
- можно нажать Ctrl+Т сообщить о статусе).
ВНИМАНИЕ: dd'ing работающей файловой системы может повредить файлы. Причина проста: он не понимает активности файловой системы, которая может происходить, и не пытается ее смягчить. Если запись выполняется частично, вы получите частичную запись. Обычно это плохо для вещей и, как правило, фатально для баз данных. Более того, если вы облажаетесь с опечаткой если и из параметры, горе вам. В большинстве случаев, rsync не менее эффективный инструмент, написанный после появления многозадачность, и обеспечит единообразное представление отдельных файлов.
Однако DD должен точно фиксировать битовое состояние отключенного диска. Загрузчики, тома llvm, UUID и метки разделов и т. Д. Просто убедитесь, что у вас есть диск, способный зеркально отображать целевой диск бит за битом.
При использовании dd для клонирования диска, который может содержать поврежденные секторы, используйте "conv = noerror, sync", чтобы гарантировать, что он не остановится при обнаружении ошибки, и заполнит недостающие сектора (-ы) нулевыми байтами. Обычно это первый шаг, который я делаю при попытке восстановления после сбоя или сбоя диска - получите копию перед выполнением любых попыток восстановления, а затем выполните восстановление на хорошем (клонированном) диске. Я оставляю инструмент восстановления, чтобы он справился с любыми пустыми секторами, которые нельзя было скопировать.
Кроме того, вы можете обнаружить, что на скорость dd влияет параметр bs (размер блока). Обычно я пробую bs = 32768, но вы можете протестировать его на своих системах, чтобы увидеть, что работает для вас быстрее всего. (Это предполагает, что вам не нужно использовать конкретный размер блока по другой причине, например, если вы пишете на ленту.)
Чтобы клонировать диск, все, что вам действительно нужно сделать, это указать вход и выход для dd:
dd if=/dev/hdb of=/image.img
Конечно, убедитесь, что у вас есть соответствующие разрешения для чтения непосредственно из / dev / hdb (я бы рекомендовал запускать как root), и что / dev / hdb не установлен (вы не хотите копировать во время замены диска - также возможно подключение только для чтения). После завершения image.img будет побайтовым клоном всего диска.
Использование dd для клонирования дисков имеет несколько недостатков. Во-первых, dd скопирует весь ваш диск, даже пустое пространство, и если это сделать на большом диске, это может привести к очень большому файлу изображения. Во-вторых, dd не дает абсолютно никаких индикаторов выполнения, что может расстраивать, поскольку копирование занимает много времени. В-третьих, если вы скопируете этот образ на другие диски (опять же, используя dd), они должны быть такого же размера или больше, чем исходный диск, но вы не сможете использовать дополнительное пространство на целевом диске, пока вы не измените размер разделов.
Вы также можете выполнить прямое копирование с диска на диск:
dd if=/dev/hdb of=/dev/hdc
но на вас по-прежнему распространяются указанные выше ограничения относительно свободного места.
Что касается проблем или ошибок, dd по большей части отлично справляется. Однако некоторое время назад у меня был жесткий диск, который вот-вот должен был умереть, поэтому я использовал dd, чтобы попытаться скопировать с него всю информацию, которую мог, прежде чем он полностью умер. Затем стало известно, что dd не очень хорошо обрабатывает ошибки чтения - на диске было несколько секторов, которые dd не мог прочитать, в результате чего dd отказался и остановил копирование. В то время я не мог найти способ сказать dd продолжить, несмотря на то, что обнаружил ошибку чтения (хотя кажется как будто у него есть этот параметр), поэтому я потратил довольно много времени, вручную задавая пропуск и поиск для перехода по нечитаемым разделам.
Я потратил некоторое время на поиск решений этой проблемы (после того, как я выполнил задачу), и я нашел программу под названием ddrescue, который, согласно сайту, работает как dd, но продолжает чтение, даже если обнаруживает ошибку. Я никогда не использовал эту программу, но ее стоит учесть, особенно если диск, с которого вы копируете, старый, на котором могут быть битые сектора, даже если система работает нормально.
Если исходный диск вообще поврежден, вам повезет, если вы воспользуетесь dd_rhelp
с участием dd_rescue
(мои личные предпочтения) или GNU ddrescue
.
Причина в том, что при ошибках чтения dd
продолжает пытаться, пытаться и пытаться - потенциально долгое время ожидая истечения времени ожидания. dd_rescue
делает умные вещи, такие как чтение до ошибки, затем выбор места дальше на диске и чтение назад до последней ошибки, и dd_rhelp
в основном dd_rescue
менеджер сессий - умный запуск и возобновление dd_rescue
бежит, чтобы снова сделать это быстрее.
Конечный результат dd_rhelp
это максимум данных, восстановленных за минимальное время. Если ты уйдешь dd_rhelp
работает, в конце концов он выполняет ту же работу, что и dd
в то же время. Однако если dd
столкнулись с ошибками чтения в байте 100 вашего диска 100 ГБ, вам придется долго ждать, чтобы восстановить остальные 9 999 900 байт *, тогда как dd_rhelp
+dd_rescue
восстановит большую часть данных намного быстрее.
На исходном диске не должно быть смонтированных файловых систем. Поскольку пользователь может читать блочное устройство (root работает), запустите dd if = / dev / sda ....
Теперь одна из замечательных вещей заключается в том, что вы создаете поток байтов ... и вы можете многое с этим сделать: сжимать его, отправлять по сети, разбивать на более мелкие капли и т. Д.
Например:
dd if=/dev/sda | ssh user@backupserver "cat > backup.img"
Но мощнее:
dd if=/dev/sda | pv -c | gzip | ssh user@backupserver "split -b 2048m -d - backup-`hostname -s`.img.gz"
Вышеупомянутое копирует сжатый образ исходного жесткого диска в удаленную систему, где он хранит его в пронумерованных блоках 2G, используя имя исходного хоста, сохраняя при этом информацию о ходе выполнения.
Обратите внимание, что в зависимости от размера диска, скорости процессора в источнике, скорости процессора в месте назначения, скорости сети и т. Д. Вы можете пропустить сжатие или выполнить сжатие на удаленной стороне, или включить сжатие ssh.
Чтобы клонировать диск, все, что вам действительно нужно сделать, это указать ввод и вывод для dd
:
dd if=/dev/hdb of=hdb.img
Конечно, убедитесь, что у вас есть соответствующие разрешения на чтение непосредственно из /dev/hdb
(Я бы порекомендовал запустить как root), и что /dev/hdb
не смонтирован (вы не хотите копировать, пока диск меняется). После завершения hdb.img
будет побайтовым клоном всего диска.
Есть несколько недостатков в использовании dd
клонировать диски. Первый, dd
скопирует весь ваш диск, даже пустое пространство, и, если это будет сделано на большом диске, может привести к очень большому файлу изображения. Во-вторых, dd
не дает абсолютно никаких индикаторов прогресса, что может расстраивать, поскольку копирование занимает много времени. В-третьих, если вы скопируете этот образ на другие диски (опять же, используя dd), они должны быть такого же размера или больше, чем исходный диск, но вы не сможете использовать дополнительное пространство на целевом диске, пока вы не измените размер разделов.
Вы также можете выполнить прямое копирование с диска на диск:
dd if=/dev/hdb of=/dev/hdc
но на вас по-прежнему распространяются указанные выше ограничения относительно свободного места.
Первый недостаток можно устранить путем сжатия данных при копировании. Например:
dd if=/dev/hdb | gzip -9 > hdb.img.gz
Второй недостаток можно решить, используя pipeview (pv
) инструмент. Например:
dd if=/dev/hdb | (pv -s `fdisk -l /dev/hdb | grep -o '[0-9]*\{1\} MB' | awk '{print $1}'`m) | cat > hdb.img
Я не знаю, как побороть третий недостаток.
Кроме того, вы можете сократить время копирования, указав dd
для работы с большими порциями данных. Например:
dd if=/dev/hdb of=hdb.img bs=1024
Еще одна приятная вещь, которую вы можете сделать с dd и аварийными дисками, - это копировать данные по сети:
remote_machine$ nc -l -p 12345
local_machine$ dd if=/dev/sda | nc remote_machine 12345
Вы можете вставить gzip в оба этих конвейера, если сеть не является локальной. Для прогресса используйте pv
. Чтобы заставить netcat local_machine выйти после завершения копирования, вы можете добавить -w 5
или что-то.
dd if=/dev/sda of=/dev/sdb bs=4096 conv=sync,noerror
Это скопирует диск и пропустит блоки с ошибками, что очень важно.
Это основные и важные варианты использования dd для клонирования или восстановления диска.
Я не хотел публиковать еще один ответ, но среди 25 уже опубликованных хороших ответов с основными параметрами "conv = sync, noerror" не было.
Это своего рода дешевый прием, но это быстрый и грязный способ контролировать процесс DD.
Запустите вашу команду dd. Откройте новую оболочку и выполните команду ps awx, чтобы найти PID вашего процесса dd. Теперь в новой оболочке типа watch -n 10 kill -USR1 {pid вашего процесса DD}
Это ничего не сделает в окне вывода часов, но в исходной оболочке DD DD начнет выводить отчеты о состоянии каждые 10 секунд. Конечно, вы можете изменить -n 10 в команде часов на любой другой временной интервал.
Тахион
Имейте в виду, что dd делает точная копия, включая все пустое пространство.
Это значит:
Надеюсь, что это поможет
Вы могли бы попробовать что-то вроде этого
dd if=/dev/sda2 of=/dev/sdb2 bs=4096 conv=sync,noerror
чтобы пропустить все ошибки и получить точный клон раздела или жесткого диска
Как копировать с помощью 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
Еще одна важная функция - это копирование MBR, таблиц разделов и загрузочных записей.
Просто
dd if=/dev/sda of=parttable bs=512 count=1
и в другом направлении, когда вы это пишете. Польский с fdisk
после.
Вы чувствуете себя в большей безопасности, если у вас есть резервная копия таблицы разделов.
Кроме того, это делает миграцию на другой жесткий диск (при изменении структуры разделов) радостью.
Для справки в будущем может быть интересно проверить ddrescue. Пару раз это спасло мне день.
Большая часть информации была описана в предыдущих вставленных получателях, но не вся описана.
В Linux вы можете клонировать жесткий диск или раздел с помощью команды dd. Внимание, если вы сделаете ошибку, вы потеряете все свои данные.
Во-первых, назначение не должно использоваться, во-вторых, источник не должен использоваться или перемонтирован в режим только для чтения. В противном случае копия будет повреждена. Если перемонтировать невозможно, сделайте загрузочный диск (hdd / ssd / pendrive) любым live-дистрибутивом linux. Я превью knoppix, но это ваш выбор. Если это возможно, вы можете загрузить или изменить уровень системы на 1, для однопользовательского режима, или вы можете напрямую перезагрузить систему в однопользовательский режим, это зависит от дистрибутива. Если вы клонируете только один раздел, этот раздел следует размонтировать или перемонтировать в RO:
umount /mountpoint_or_device
или
remount -o,ro /mountpoint_or_device
Если вы хотите клонировать весь жесткий диск, вы должны отмонтировать или перемонтировать все разделы.
Вы должны определить исходное и целевое устройство. пожалуйста, посмотрите dmesg, здесь хранится вся необходимая информация об устройстве, с поставщиком и т. д., в качестве альтернативы идентификация может быть основана на размере устройства, если он отличается. Далее, пункт назначения должен быть таким же или больше, чем источник. вы должны вычислить источник, например: fdisk -l / dev / sda, кроме геометрии раздела (может быть GPT), вы получите: 1. общий размер диска wigh ГБ и байты 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 байт или 512 КБ. Затем мы можем использовать параметр 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 и используемым жестким диском. Конечно, вы можете использовать другую команду сжатия в зависимости от вашего выбора.
Кто-то должен был сказать следующее: попробуйте Clonezilla (http: // clonezilla.org/)
Что вы получаете? Копировать только используемые части файловой системы. Clonezilla использует dd, grub, sfdisk, parted, partimage, ntfsclone и / или partclone. В зависимости от выбранных вами вариантов.
Достойную документацию можно найти по адресу: http: // clonezilla.org/clonezilla-live/doc/
dd предоставляет информацию о ходе выполнения - ну, большинство версий в Linux. Я видел некоторые, которые не помнят, но не помнят аромата unix.
На странице руководства сказано: Отправка сигнала USR1 запущенному процессу «dd» заставляет его распечатать статистику ввода-вывода до стандартной ошибки и затем возобновить копирование.
Я регулярно пользуюсь этой функцией.
Вы можете на лету создать сжатый файл образа раздела (или диска), используя 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
Как уже упоминалось выше, одна из проблем с клонированием смонтированной файловой системы - это возможное повреждение данных. Очевидно, это не относится к клонам с полным диском, но если вы используете LVM, вы можете сделать снимок LogicalVolume и dd из снимка, чтобы получить согласованный образ.
Я уже много лет не занимаю должность администратора, но я знаю, что dd мне подходит. Я регулярно использовал эту технику в конце 80-х на компьютерах Sun Sparc и 386i. У меня был один заказ клиента на более 30 систем 386i с программным обеспечением CAD, которое распространялось на нескольких лентах QIC.
Мы установили на первый компьютер, настроили приложение, запустили sys-reconfig SunOS, поместили диск в коробку с другим адресом SCSI, а затем перешли к «dd» на остальные 30 дисков.
Одна вещь, о которой вы должны знать, когда заполняете полный диск, - это то, что это приведет к перезаписи основной загрузочной записи принимающего диска. Он содержит таблицу разделов и другую важную информацию. Если новый диск не совпадает со старым, это может создавать всевозможные таблицы. Копирование разделов обычно более безопасно (и разделы подкачки не нужно копировать)
Замечание о скорости: по моему опыту, dd будет вдвое быстрее, если вы укажете bs = 1024 вместо значения по умолчанию bs = 512. Использование даже большего размера блока не дает заметного ускорения по сравнению с bs = 1024.
По какой-то причине dd не работает при создании образа компакт-дисков со звуковыми дорожками. Вам нужно использовать cdrdao или что-то подобное, чтобы получить файл изображения + TOC.
Просто предупреждение для новичков, которое необходимо сказать: по крайней мере, в некоторых версиях bs = X означает, что память размером X будет буквально выделена. bs = 2 ГБ в системе с 1 ГБ ОЗУ и недостаточным объемом подкачки БУДЕТ вызывать плохие вещи.