Резервное копирование диска с помощью dd

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

Вначале для существенного улучшения процесса архивации следует очистить свободное место на архивируемых разделах. Можно задаться вопросом: а как это, разве можно очищать место, которое не занято? – Можно и нужно. Дело в том, что при удалении файлов, по сути, удаляются лишь ссылки на них в файловой системе, а сами данные остаются нетронутыми (до тех пор, пока поверх них не будут записаны какие-либо новые данные). Если мы попытаемся сделать сжатую копию раздела с удаленными файлами, мы невольно сделаем и копию удаленных файлов – и все это будет плохо архивироваться, полученный образ будет очень объемным. Поэтому все свободное пространство всех разделов следует заполнить нулями, качество сжатия которых стремится к бесконечности. :)

Используем следующие команды для каждого раздела:

# dd if=/dev/zero of=/path/to/zerofile bd=8M
# sync
# rm /path/to/zerofile

Файл, заполненный нулями, следует создавать на каждом логическом разделе; соответственно, вместо /path/to/zerofile нужно указывать /var/zerofile, /usr/zeros, /home/nulls и т.д.

Теперь, когда поверх всех старых удаленных файлов оказались записаны нули, можно приступать к получению копии диска. Крайне рекомендуется проводить эту операцию, загрузившись с LiveCD. Если это не представляется возможным, то, по крайней мере, необходимо попытаться остановить все запущенные в системе сервисы – такие как MySQL, вебсерверы и т.д. Хочется верить, что не заслуживает упоминания тот факт, что сохранять образ диска следует не на тот же диск, с которого мы пишем данный образ. Для передачи образа на лету на другой сервер по SSH можно использовать следующую команду:

# dd if=/dev/sda | gzip -9 - | ssh 172.16.10.10 dd of=/mnt/sda.image.gz bs=8M

Примечания:
1. Вместо /dev/sda следует указать тот диск, образ которого создается;
2. Параметр -9 команды gzip задает максимальный уровень сжатия (для gzip – он и так невысокий при быстрой скорости архивации, большего сжатия при больших затратах ресурсов можно добиться при использовании bzip2);
3. Вместо 172.16.10.10 следует указать IP-адрес целевого сервера;
4. Вместо /mnt/sda.image.gz следует указать путь к сохраняемому образу на удаленном сервере;
5. Параметр bs=8M команды dd определяет размер блоков, которыми будет производиться запись. Так, например, 8М соответствует 8 мегабайтам, что позволяет несколько эффективнее записывать файлы на Flash-память. Настраивается по своему вкусу.

За счет “зануления” свободного пространства и архивации образа, при помощи данного рецепта был создан бэкап 80 ГБ винчестера с системой Archlinux x86 и небольшим набором установленного софта для мини-сервера (nginx+php+sql+samba+etc), размер полученного образа составил 1,4 ГБ.

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

# ssh 172.16.10.10 dd if=/mnt/sda.image.gz | gunzip - | dd of=/dev/sda bs=2M

Как водится, некоторые параметры можно варьировать.

This entry was posted in Разное, Сеть и интернет and tagged . Bookmark the permalink.

2 Responses to Резервное копирование диска с помощью dd

  1. привет says:

    # ssh 172.16.10.10 dd if=/mnt/sda.image.gz | gunzip – | dd of=/dev/sda bs=2M

    гдета косяк
    dd: открытие «/dev/sda»: Отказано в доступе
    dd: opening ‘/mnt/sda.image.gz': No such file or directory

  2. root says:

    Очевидно, что для записи в /dev/sda нужны права root, а вместо /mnt/sda.image.gz необходимо указать путь к сохраненному ранее образу диска.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>