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

<p>был ряд вопросов, касающихся инструментов клонирования дисков, и <code>dd</code> было предложено хотя бы один раз. я уже подумал об использовании <code>dd</code> самостоятельно, в основном из-за простоты использования и того, что он легко доступен практически во всех загрузочных дистрибутивах linux.</p><p>как лучше всего использовать <code>dd</code> для клонирования диска? я сделал быстрый поиск в google, и первый результат был очевидным <a href="http://linux.derkeiler.com/newsgroups/alt.os.linux.redhat/2006-05/msg00071.html">неудачная попытка</a> . есть ли что-то, что мне нужно сделать после использования <code>dd</code>, то есть что-нибудь, что не может быть прочитано с использованием <code>dd</code>?</p>

<p>dd, безусловно, лучший инструмент для клонирования, он создаст 100% реплику просто с помощью следующей команды. у меня никогда не было проблем с этим.</p><pre><code>dd if=/dev/sda of=/dev/sdb bs=32m </code></pre><p>помните, что при клонировании каждого байта вы не должны использовать это на диске или разделе, который используется. особенно приложения, такие как базы данных, не могут справиться с этим очень хорошо, и вы можете получить поврежденные данные.</p>

<p>чтобы сэкономить место, вы можете сжать данные, созданные dd, с помощью gzip, например:</p><pre><code>dd if=/dev/hdb | gzip -c > /image.img </code></pre><p>вы можете восстановить ваш диск с помощью:</p><pre><code>gunzip -c /image.img.gz | dd of=/dev/hdb </code></pre><p>чтобы сэкономить еще больше места, предварительно дефрагментируйте диск/раздел, который вы хотите клонировать (при необходимости), затем обнулите все оставшееся неиспользуемое пространство, упрощая сжатие gzip:</p><pre><code>mkdir /mnt/hdb mount /dev/hdb /mnt/hdb dd if=/dev/zero of=/mnt/hdb/zero </code></pre><p>подождите немного, dd в конечном итоге потерпит неудачу с сообщением "диск заполнен", затем:</p><pre><code>rm /mnt/hdb/zero umount /mnt/hdb dd if=/dev/hdb | gzip -c > /image.img </code></pre><p>кроме того, вы можете запустить процесс dd в фоновом режиме, чтобы сообщить о состоянии, отправив ему сигнал с помощью команды kill, например:</p><pre><code>dd if=/dev/hdb of=/image.img & kill -sigusr1 1234 </code></pre><p>проверьте вашу систему - приведенная выше команда для linux, osx и bsd команды dd отличаются по сигналам, которые они принимают (osx использует <code>siginfo</code> - вы можете нажать <kbd>ctrl</kbd>+<kbd>t</kbd> сообщить о статусе).</p>

<p><strong> [~ # ~] осторожно [~ # ~] </strong>: файловая система может повредить файлы. причина проста: он не понимает, что может происходить в файловой системе, и не пытается ее смягчить. если запись ведется частично, вы получите частичную запись. обычно это плохо для вещей и, как правило, фатально для баз данных. более того, если вы испортите склонные к опечаткам <strong> if </strong> и <strong> из </strong> параметров горе тебе. в большинстве случаев <strong> rsync </strong> является столь же эффективным инструментом, написанным после появления <a href="http://en.wikipedia.org/wiki/multitasking">многозадачность</a> , и будет обеспечивать согласованные представления отдельных файлов. ,.</p><p>однако dd должен точно фиксировать состояние бита не подключенного диска. загрузчики, тома llvm, идентификаторы uuid и метки разделов и т.д. просто убедитесь, что у вас есть диск, способный зеркально отражать бит целевого диска.</p>

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

<p>для клонирования диска все, что вам действительно нужно сделать, это указать вход и выход для dd:</p><pre><code>dd if=/dev/hdb of=/image.img </code></pre><p>конечно, убедитесь, что у вас есть соответствующие разрешения для чтения непосредственно из/dev/hdb (я бы рекомендовал запускать от имени пользователя root), и что/dev/hdb <strong> не смонтирован </strong> (копировать не нужно во время замены диска - монтирование только для чтения также допустимо). после завершения image.img станет побайтовым клоном всего диска.</p><p>есть несколько недостатков использования dd для клонирования дисков. во-первых, dd скопирует весь ваш диск, даже пустое место, и если это сделать на большом диске, это может привести к очень большому файлу образа. во-вторых, dd не дает никаких индикаторов прогресса, что может расстраивать, потому что копирование занимает много времени. в-третьих, если вы копируете этот образ на другие диски (опять же, используя dd), они должны быть такими же большими или большими, как исходный диск, но вы не сможете использовать дополнительное пространство на целевом диске до тех пор, пока вы не изменить размер ваших разделов.</p><p>вы также можете сделать прямую копию с диска на диск:</p><pre><code>dd if=/dev/hdb of=/dev/hdc </code></pre><p>но вы все еще подвержены вышеуказанным ограничениям относительно свободного места.</p><p>что касается вопросов или ошибок, дд, по большей части, делает отличную работу. однако некоторое время назад у меня был жесткий диск, который вот-вот должен был умереть, поэтому я использовал dd, чтобы попытаться скопировать любую информацию, которую я мог удалить, прежде чем она полностью исчезла. затем выяснилось, что dd не очень хорошо обрабатывает ошибки чтения - на диске было несколько секторов, которые dd не мог прочитать, в результате чего dd сдался и остановил копирование. в то время я не мог найти способ, чтобы dd продолжал, несмотря на ошибку чтения (хотя <a href="https://serverfault.com/questions/4906/using-dd-for-disk-cloning/5584#5584">кажется</a> как будто у него есть такая настройка), поэтому я потратил довольно много времени на ручную настройку пропустить и попытаться перепрыгнуть через нечитаемые разделы.</p><p>я потратил некоторое время на изучение решений этой проблемы (после того как выполнил задание) и нашел программу под названием <a href="http://www.gnu.org/software/ddrescue/ddrescue.html">ddrescue</a> , которая, согласно сайту, работает как dd, но продолжает чтение, даже если встречает ошибка. на самом деле я никогда не использовал программу, но это стоит учитывать, особенно если диск, с которого вы копируете, старый, в котором могут быть поврежденные сектора, даже если система выглядит нормально.</p>

<p>если исходный диск вообще поврежден, вам повезет больше с помощью <a href="http://freecode.com/projects/dd\_rhelp"><code>dd\_rhelp</code></a> с <code>dd\_rescue</code> (мои личные предпочтения) или gnu <a href="http://www.gnu.org/software/ddrescue/ddrescue.html"><code>ddrescue</code></a> .</p><p>причиной этого является то, что при ошибках чтения <code>dd</code> продолжает пытаться, пытаться и пытаться - потенциально ожидая в течение длительного времени истечения времени ожидания. <code>dd\_rescue</code> делает умные вещи, такие как чтение до ошибки, затем выбор места на диске и чтение назад до последней ошибки, и <code>dd\_rhelp</code> в основном <code>dd\_rescue</code> менеджер сессий - умный запуск и возобновление <code>dd\_rescue</code> работает, чтобы сделать это снова быстрее.</p><p>конечный результат <code>dd\_rhelp</code> - максимальное количество данных, восстановленных за минимальное время. если ты уйдешь <code>dd\_rhelp</code> выполняется, в конце концов, он выполняет ту же работу, что и <code>dd</code> в то же время. однако, если <code>dd</code> столкнулся с ошибками чтения на байте 100 вашего 100-гигабайтного диска, вам придется долго ждать, чтобы восстановить остальные 9 999 900 байт *, тогда как <code>dd\_rhelp</code> + <code>dd\_rescue</code> восстановит большую часть данных гораздо быстрее.</p>

<p>на исходном диске не должно быть никаких смонтированных файловых систем. как пользователь, который может прочитать блочное устройство (root работает), запустите 'dd if =/dev/sda ....'</p><p>одна из полезных вещей здесь - это то, что вы создаете поток байтов ... и вы можете с этим многое сделать: сжимать его, отправлять по сети, разбивать на более мелкие капли и т.д.</p><p>например:</p><pre><code>dd if=/dev/sda | ssh user@backupserver "cat > backup.img" </code></pre><p>но более сильно:</p><pre><code>dd if=/dev/sda | pv -c | gzip | ssh user@backupserver "split -b 2048m -d - backup-`hostname -s`.img.gz" </code></pre><p>приведенное выше копирует сжатый образ исходного жесткого диска в удаленную систему, где он хранит его в пронумерованных блоках 2g, используя имя исходного хоста, при этом вы будете в курсе прогресса.</p><p>обратите внимание, что в зависимости от размера диска, скорости процессора в источнике, скорости процессора в пункте назначения, скорости сети и т.д. вы можете пропустить сжатие, выполнить сжатие на удаленной стороне или включить сжатие ssh.</p>

<p>для клонирования диска все, что вам действительно нужно, это указать входные и выходные данные для <code>dd</code>:</p><pre><code>dd if=/dev/hdb of=hdb.img </code></pre><p>конечно, убедитесь, что у вас есть соответствующие права на чтение прямо из <code>/dev/hdb</code> (я бы порекомендовал запускать от имени root), и это <code>/dev/hdb</code> не смонтирован (вы не хотите копировать во время замены диска). после завершения <code>hdb.img</code> будет побайтовым клоном всего диска.</p><p>есть несколько недостатков использования <code>dd</code> для клонирования дисков. во-первых, <code>dd</code> скопирует весь ваш диск, даже пустое место, и если это сделать на большом диске, это может привести к очень большому файлу изображения. во-вторых, <code>dd</code> не дает абсолютно никаких индикаторов прогресса, что может расстраивать, потому что копирование занимает много времени. в-третьих, если вы копируете этот образ на другие диски (опять же, используя dd), они должны быть такими же большими или большими, как исходный диск, но вы не сможете использовать дополнительное пространство на целевом диске до тех пор, пока вы не изменить размер ваших разделов.</p><p>вы также можете сделать прямую копию с диска на диск:</p><pre><code>dd if=/dev/hdb of=/dev/hdc </code></pre><p>но вы все еще подвержены вышеуказанным ограничениям относительно свободного места.</p><p>первый недостаток можно устранить, распаковав данные при копировании. например:</p><pre><code>dd if=/dev/hdb | gzip -9 > hdb.img.gz </code></pre><p>второй недостаток можно устранить с помощью инструмента pipeview (<code>pv</code>). например:</p><pre><code>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 и rescue - это копирование данных по сети:remote_machine$ nc -l -p 12345 local\_machine$ dd if=/dev/sda | nc remote_machine 12345 вы можете вставить gzip в оба этих конвейера, если сеть не является локальной. для прогресса используйте pv. чтобы заставить netcat локальной_машины выйти после завершения копирования, вы можете добавить -w 5 или что-то.

имейте в виду, что dd создает <strong>точную копию</strong>, включая все пустое пространство.это значит: 2-й диск должен быть не меньше первого если второй диск больше, дополнительное пространство будет потрачено впустую (файловая система  может  быть расширена за вас) если исходный диск не заполнен, dd будет тратить много времени на копирование пустого пространства. таким образом, вы можете скопировать весь диск или один раздел. если это загрузочный диск, я уверен, что вам нужно установить загрузчик после использования dd надеюсь, что это полезно

dd if=/dev/sda of=/dev/sdb bs=4096 conv=sync,noerror это скопирует диск и пропустит блоки с ошибками, что очень важно.это основные и необходимые опции для использования dd для клонирования или восстановления диска.я не хотел публиковать другой ответ, но не было хороших ответов с необходимыми опциями "conv = sync, noerror" среди 25 уже опубликованных.

вы могли бы попробовать что-то вроде этого dd if =/dev/sda2 of =/dev/sdb2 bs = 4096 conv = синхронизация, noerror чтобы пропустить все ошибки и иметь точный клон раздела или жесткого диска

другая важная функция - копирование mbr, таблиц разделов и загрузочных записей.простоdd if=/dev/sda of=parttable bs=512 count=1 и другое направление, когда вы пишете это. польский с fdisk после.вы чувствуете себя намного безопаснее, если у вас есть резервная копия таблицы разделов.кроме того, это делает переход на другой жесткий диск (при изменении структуры разделов) радостью.

для дальнейшего использования может быть интересно проверить <a href="http://www.gnu.org/software/ddrescue/ddrescue.html">ddrescue . это спасло мой день пару раз.

это своего рода дешевый хак, но это быстрый и грязный способ контролировать ваш процесс dd.запустите команду дд. откройте новую оболочку и выполните ps awx, чтобы найти pid вашего процесса dd. теперь в новом типе оболочки смотрите -n 10 kill -usr1 {pid вашего процесса dd}это ничего не изменит в окне вывода часов, но в исходной оболочке dd dd начнет выводить отчеты о состоянии каждые 10 секунд. конечно, вы можете изменить -n 10 в команде watch на любой другой период времени.тахионный

большая часть информации была описана в предыдущих вставленных получателях, но не все были описаны.в linux вы можете клонировать жесткий диск или раздел с помощью команды dd. внимание, когда вы допустите ошибку, вы потеряете все свои данные.во-первых, назначение не должно использоваться, во-вторых, источник не должен использоваться или переустанавливаться в режиме только для чтения. в противном случае копия будет повреждена. если перемонтирование невозможно, сделайте загрузочный диск (hdd/ssd/pendrive) любым дистрибутивом linux live. я превернул knoppix, но это ваш выбор. если это возможно, вы можете загрузить или изменить системный уровень на 1, для однопользовательского режима, или вы можете напрямую перезагрузить систему в однопользовательском режиме, это зависит от дистрибутива. если вы будете клонировать только один раздел, этот раздел должен быть размонтирован или перемонтирован в ro:umount /mountpoint_or_device илиremount -o,ro /mountpoint_or_device если вы хотите клонировать весь жесткий диск, вы должны размонтировать или перемонтировать все разделы.вы должны определить источник и устройство назначения. пожалуйста, посмотрите на dmesg, здесь хранится вся необходимая информация об устройстве, с поставщиком и т. д. в качестве альтернативы можно определить размер устройства, если он другой. далее, пункт назначения должен быть таким же или большим, чем источник. вы должны вычислить источник, например: fdisk -l/dev/sda, за исключением геометрии раздела (может быть gpt), вы получите: 1. общий размер диска, гигабайт и байт 2. историческая геометрия и общее число секторов, очень важная информация 3. размер блока в байтах, обычно это 512.например:# fdisk -l /dev/sda disk /dev/sda: 21.5 gb, 21474836480 bytes 255 heads, 63 sectors/track, 2610 cylinders, total 41943040 sectors units = sectors of 1  512 = 512 bytes sector size (logical/physical): 512 bytes / 512 bytes i/o size (minimum/optimal): 512 bytes / 512 bytes disk identifier: 0x000f1d1e device boot start end blocks id system /dev/sda1  2048 40136703 20067328 83 linux /dev/sda2 40138750 41940991 901121 5 extended /dev/sda5 40138752 41940991 901120 82 linux swap / solaris дальше давайте попробуем делитель больше 512, у нас есть 41943040 физических секторов:41943040/256 = 163840, очень хорошо, мы можем сделать массовое копирование 256 секторов. мы можем больше? давайте попробуем: 41943040/1024 = 40960, я думаю, этого достаточно, мы выберем этот. давайте посчитаем размер группы секторов: 512 (размер сектора)  1024 = 524288 байт, eq 512k. тогда мы можем использовать параметр bs = 512k или меньше, но разделить это на 2 ^ x. для современных жестких дисков с большим внутренним кешем это достаточно практично. для более старых дисков с гораздо меньшим объемом кеша достаточно значения 32k или меньше.затем после подготовки мы можем сделать копию: dd if =/dev/source_devide of =/dev/destination_device bs = 32k, и копирование будет выполнено. обратите внимание, любая ошибка перезапишет ваши важные данные. по назначению все будет перезаписано.если вы попытаетесь восстановить данные на поврежденном исходном диске, лучше использовать собственный размер сектора, обычно это 512 байт, и добавить опцию conv = notrunc. в противном случае дыры в источнике, отброшенные плохими секторами, будут соединены смещением секторов по месту назначения. это повредит копию с небольшим шансом на ремонт. тогда команда будет:dd if=/dev/source of=/dev/destination bs=512 conv=notrunc и долгое время ждите, когда диск и система сдадутся и пройдут сектор за сектором до конца.dd - полезный инструмент для перемещения раздела на новое место. просто создайте раздел, сделайте dd для нового раздела (это может быть больше, намного больше) и, если это возможно, разверните скопированную файловую систему для заполнения всего нового раздела, ext3/ext4/xfs/zfs/btrfs имеют эту возможность. наконец, вы должны изменить/etc/fstab, затем размонтировать/смонтировать, если это возможно, или перезагрузить систему.конечно, вы можете клонировать любой тип раздела. команда dd не смотрит на тип файловой системы, она ничего не делает со своей структурой. тогда эта команда может быть использована для клонирования ntfs или других типов разделов.есть какая-то хитрость. если вы не установили параметр, тогда dd поместит вывод в его стандартный вывод. тогда вы можете сделать сжатую сырую копию диска или раздела, например:dd if=/dev/sda bs=512 | gzip >/any/place/computerone_sda.gz конечно, это должно быть сделано в автономном режиме. вы можете восстановить это:zcat /any/place/computerone_sda.gz| dd of=/dev/sda bs=512 , тогда все жесткие диски sda будут перезаписаны этой резервной копией, и все текущие данные будут потеряны. вы можете сделать это также с разделом windows ntfs и жестким диском, используемым этим. конечно, вы можете использовать другую команду сжатия, в зависимости от вашего выбора.

как копировать с использованием 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 </code></pre>

<p>дд предоставляет информацию о прогрессе - ну, большинство версий в linux. я видел некоторые, которые не помнят, но не помнят unix-аромат.</p><p>страница man гласит: отправка сигнала usr1 в работающий процесс "dd" заставляет печатать статистику ввода/вывода со стандартной ошибкой, а затем возобновляет копирование.</p><p>я использую эту функцию регулярно.</p>

<p>кто-то должен был сказать это: попробуйте clonezilla (http: // clonezilla.org/)</p><p>что вы получаете? для копирования используются только части файловой системы. clonezilla использует dd, grub, sfdisk, parted, partimage, ntfsclone и/или partclone. в зависимости от выбранных вами вариантов.</p><p>достойную документацию можно найти по адресу: http: // clonezilla.org/clonezilla-live/doc/.</p>

<p>вы можете создать сжатый файл образа раздела (или диска) на лету, используя <code>bzip2</code> или <code>gzip</code> вместо <code>dd</code>. это хорошо для хранения изображений на съемных носителях:</p><pre><code>bzip2 -c /dev/sdax >imagefile.bz2 or gzip -c /dev/sdax >imagefile.gz </code></pre><p>если диск ранее интенсивно использовался, вы можете улучшить сжатие, заполнив все неиспользуемое пространство нулями до создания образа:</p><pre><code>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 </code></pre><p>чтобы восстановить образ на другой диск, все, что вам нужно сделать, это:</p><pre><code>bzcat imagefile.bz2 >/dev/sdby or zcat imagefile.gz >/dev/sdby </code></pre>

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

<p>я был вне роли администратора уже много лет, но я знаю, что "dd" - это дело. я регулярно использовал эту технику в конце 80-х на компьютерах sun sparc и 386i. у меня был один заказ клиента на 30 систем 386i, на которых работало программное обеспечение cad), которое распространялось на нескольких лентах qic.</p><p>мы установили на первом компьютере, настроили приложение, запустили sys-unsfig от sunos, поместили диск в обувную коробку с другим адресом scsi и затем перешли к "dd" на остальные 30 дисков.</p>

<p>просто предупреждение для начинающих, о котором нужно сказать: по крайней мере, с некоторыми версиями bs = x означает, что память размером x будет буквально выделена. bs = 2 гб в системе с 1 гб ram и недостаточным объемом подкачки будет вызвать плохие вещи.</p>

<p>по какой-то причине, dd не работает при создании образа компакт-дисков со звуковыми дорожками. вам нужно использовать cdrdao или что-то подобное, чтобы получить файл изображения + toc.</p>

<p>для томов ntfs я предпочитаю использовать <a href="http://man.linux-ntfs.org/ntfsclone.8.html">ntfsclone</a> . это часть пакета <a href="http://www.linux-ntfs.org/">ntfsprogs</a> .</p>

<p>как уже упоминалось выше, одним из недостатков клонирования смонтированной файловой системы является потенциальное повреждение данных. это, очевидно, не относится к полным клонам дисков, но если вы используете lvm, вы можете сделать снимок logicalvolume и dd из снимка, чтобы получить согласованное изображение.</p>