Как сделать бекап при помощи dd: используем dd для backup

Для того, чтобы сделать backup (бэкап, резервная копия) винчестера для последующего восстановления вовсе не нужны коммерческие, проприетарные утилиты - есть старый, как мир, dd. С помощью dd очень удобно и просто делать бекапы, и всё, что нужно сделать - просто правильно его использовать.

Эпиграф
Только зануды делают резервные копии:
настоящие мужчины просто
закачивают все важное на ftp,
позволяя остальным отзеркалировать это.
Линус Торвальдс



Утилита dd есть в любом дистрибутиве, и даже в Knoppix, который можно использовать для восстановления данных, и вам не потребуются разные платные примочки типа Paragon backup или Symantec backup. То есть с помощью dd можно делать backup системы, в том числе backup сервера. Для этого так же потребуется любой архиватор, в данном примере это gzip. Приведён вариант с архивированием на другую машину по сети с использованием SSH или netcat.


1. Приготовления

Загружаемся с любого LiveCD диска с Linux / BSD, залогиниваемся под root-аккаунтом.
Убеждаемся, написав в консоли df, что ни один из тех разделов, что мы собираемся копировать, не примонтирован на запись. Решаем, куда будем архивировать данные: это может быть другой раздел на винчестере, внешний жёсткий диск или по сети.


2. Создаём резервную копию

В данном примере /dev/hda это винчестер, который архивируем, а /dev/sda1 - это раздел внешнего винчестера или другая партиция, на которую архивируем, hda.img.gz - получившийся сжатый файл-образ.

2.1 Внешний винчестер или другой раздел диска

Монтируем устройство, куда мы будем архивировать данные
# mount -t vfat /dev/sda1 /mnt/sda1
Перегоняем данные с одного винчестера на другой. Так как данных много, полезно их сжать - и никс-системы позволяют это делать "на лету". В примере использван GZip, но подойдёт и любой другой (например, bzip2 или p7zip).
Для этого:
# dd if=/dev/hda conv=sync,noerror bs=64K | gzip -c > /mnt/sda1/hda.img.gz
Здесь происходит архивирование с одновременным сжатием, результат чего записывается в файл hda.img.gz
Параметр "conv=sync,noerror" указывает dd не читать блок, если при этом происходит ошибка, но записать в архивируемый файл-образ данные, чтобы размер блока не менялся.
Параметр "bs=64K" это размер блока в килобайтах - использование такого большого размера блока ускоряет процесс копирования. Параметр bs можно сделать ещё больше, а именно равным размеру кеша копируемого диска (например bs=8m), это сильно ускорит весь процесс.
Выходной поток передаётся по конвейеру для сжатия gzip, результат выводится в файл на другом диске.

2.2 Удалённо по сети
Всё то же самое, что в п.2.1, но с добавлением в конвейер SSH:
# dd if=/dev/hda conv=sync,noerror bs=64K | gzip -c | ssh -c blowfish user@hostname "dd of=hda.img.gz bs=64k"
Архивный файл появится в домашней директории пользователя user на машине hostname. Если сеть маленькая, лучше вместо hostname использовать просто ip-адрес. Опция -c blowfish заставляет SSH выбрать алгоритм шифрования Blowfish, который быстрее остальных шифрует данные.

Вариант с netcat, если данные копируются по локальной сети и шифрование не нужно:
# dd if=/dev/hda conv=sync,noerror bs=64K | gzip -c | nc 192.168.1.1 3333
На удалённой машине должен быть запущен netcat:
# nc -l -p 3333 > hda.img.gz
Вариант с SAMBA, если копирование производится на оффтопичную машину: примонтировать удалённо сетевой ресурс
smbmount //192.168.1.100/shared /mnt/remoteshare -o username=имяпользователя,password=пароль
и далее всё то же, что и в п.2.1.



3. Восстанавливаем данные из бекапа
Пример тот же: /dev/hda это винчестер, который архивируем, hda.img.gz - архивный сжатый файл-образ, а /dev/sda1 - это раздел внешнего винчестера или другая партиция, с которого восстанавливаем данные.

3.1 Внешний винчестер или другой раздел диска

Копируем и распаковываем файл-образ одновременно:
# gunzip -c /mnt/sda1/hda.img.gz | dd of=/dev/hda conv=sync,noerror bs=64K
Все параметры в п.2 уже объяснены.


3.2 Удалённо по сети
Сетевой вариант с восстановлением из файл-образа:

dd if=hda.img.gz | ssh -c blowfish user@deadhost "gunzip -c | dd of=/dev/hda1 bs=64k"

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


Ссылки
Этот пост является переводом этой замечательной статьи, дополненной и расширенной этой и этой статьями. Так же это применимо к утилитам восстановления данных, описанных здесь.

28 комментариев: |высказаться!| RSS-лента дискуссии.|
Portnov комментирует...

А еще иногда (на ФС, отличных от ext3/reiser/xfs) возникают проблемы с файлами больше 2х или 4х Гб. Чтобы предотвратить такие проблемы, файл образа можно сразу порезать split-ом:
dd if=/dev/hdb1 | gzip | split -d -b 2G hdb1_img_
Получатся файлы hdb1_img_0, _1, ...

Unknown комментирует...

Убеждаемся, написав в консоли df, что ни один из тех разделов, что мы собираемся копировать, не примонтирована на запись.

Или df в дебиане показывает статус ФС, или всё-таки mount?

Past комментирует...

параметр bs лучше сделать еще больше, а именно равным размеру кеша копируемого диска. Т.е. например bs=8m, это сильно ускорит весь процесс

Boris Pankin комментирует...

Или df в дебиане показывает статус ФС, или всё-таки mount?

df наглядней

Анонимный комментирует...

Одно плохо, бэкап производится без учета ФС
Таким образом если на диске в 200G реальных данных скажем 100G, в образ все равно будут заворачиваться все 200.
И сжатие тут мало поможет, ибо неиспользуемые области содержат далеко не нулевые значения.

Анонимный комментирует...

Анонимный пишет...

Одно плохо, бэкап производится без учета ФС
Таким образом если на диске в 200G реальных данных скажем 100G, в образ все равно будут заворачиваться все 200.
И сжатие тут мало поможет, ибо неиспользуемые области содержат далеко не нулевые значения.


Для того чтобы учитывать ФС как Вы выразились есть утилита partimage. Которая делает образ только реальных данных. Правда имеется не во всех дистрибутивах в отличии от dd.

Анонимный комментирует...

Для того чтобы учитывать ФС как Вы выразились есть утилита partimage. Которая делает образ только реальных данных. Правда имеется не во всех дистрибутивах в отличии от dd.

Я это все к чему..
Может таки перед backup с использованием dd, как то прописать во все свободные блоки нули?
Тогда их участие в образе после сжатия будет не столь впечатляюще?

Аркадий М. комментирует...

я в свое время делал бэкап с помощью pax, она по сути создает обычный tar.gz, только сохраняет все права и владельцев ФС, ну а восстановление с помощью обычного tar/gunzip. Если кому интересно могу найти с какими ключами использовал.

PS. Бэкапил наживую (в часы наименьшей нагрузки), сервер под FreeBSD 6.0. Ну и естесственно проверял что юэкапы потом можно будет использовать, т.е. восстанавливал на другой машине (другом железе).

EvgeniyK комментирует...

Бэкапы нужны, чтобы было легче после такого: http://lug.wsu.edu/node/414 .

Deepwalker комментирует...

openssl+nc тоже дают шифрование. Просто раздаю с сервера образ машины эталонный, ставлю на образ пароль таким образом : )

Анонимный комментирует...

Одно плохо, бэкап производится без учета ФС. Таким образом если на диске в 200G реальных данных скажем 100G, в образ все равно будут заворачиваться все 200.
И сжатие тут мало поможет, ибо неиспользуемые области содержат далеко не нулевые значения.


Именно для бэкапа в своё время были созданы утилиты dump/restore, которые, в отличие от partimage, есть в любом дистрибутиве. Эти утилиты лишены перечисленных недостатков, кроме того, позволяют делать инкрементальный бэкап.
Перечитываем статью, заменяя dd на dump, и всё хорошо :)

Пример использования dump/restore с корневого раздела удалённой машины в текущую директорию (с файла будет немного по другому)

ssh backup-server.remote "dump -0af- /" | restore -xf .

oleg комментирует...

А чем плох backup с помощью tar ?

virens комментирует...

2 Portnov пишет...
А еще иногда (на ФС, отличных от ext3/reiser/xfs) возникают проблемы с файлами больше 2х или 4х Гб.
А что за файловые системы, у которых такие проблемы!? Неужели FAT\NTFS? :-)

2 jankkhvej пишет...
Или df в дебиане показывает статус ФС, или всё-таки mount?
Во всяком случае:

$ df
Файловая система 1K-блоков Исп Доступно Исп% смонтирована на
/dev/hda2 58314120 29571488 28742632 51% /

Показано, что раздел смонтирован.

2 past пишет...
параметр bs лучше сделать еще больше, а именно равным размеру кеша копируемого диска. Т.е. например bs=8m, это сильно ускорит весь процесс
Спасибо за ценное замечание, добавлено в текст.


2 Анонимный пишет...
Одно плохо, бэкап производится без учета ФС
Таким образом если на диске в 200G реальных данных скажем 100G, в образ все равно будут заворачиваться все 200.

Так это полный образ диска и есть.


2 Maverick пишет...
есть утилита partimage. Которая делает образ только реальных данных. Правда имеется не во всех дистрибутивах в отличии от dd.
В Дебиане есть, по крайней мере в Этче. Надо будет на досуге о ней написать. Maverick, спасибо за идею!

2 Deepwalker пишет...
openssl+nc тоже дают шифрование. Просто раздаю с сервера образ машины эталонный
В общем тоже вариант.

2 ujo пишет...
Перечитываем статью, заменяя dd на dump, и всё хорошо :)
Да, по ходу дела придётся писать ещё один пост :-)

И ещё раз спасибо за ценные мысли!

Анонимный комментирует...

Убеждаемся, написав в консоли df, что ни один из тех разделов, что мы собираемся копировать, не примонтирована на запись.
Наверно, раздел всё-таки мужского рода и окончание у "примонтирована" должно быть другим, а? Как считает автор? :)

Анонимный комментирует...

пофиг смонтирован ли первычный раздел или нет:
cat /dev/hda | gzip -9 > /mnt/disk2/obraz-hda.gz
и куча вариаций на тему.
точную копию диска (например когда собираешь пачками thin-клиенты):
cat /dev/hda > /dev/hdc

Portnov комментирует...

@virens
Да, Fat/Ntfs, а еще различные варианты iso9660/udf (если бэкапимся на двд). В большинстве случаев проблемы не возникает, но я предпочитаю перестраховаться :)

sda комментирует...

imho - может таки стоит перед бэкапом создать

dd if=/dev/zero of=./zero_file bs=FREE_SIZE count=1

и снять вопросы с размером запакованного архива?

Анонимный комментирует...

Здесь
http://www.samag.ru/art/11.2006/11.2006_03.html
описан скрипт, учитывающий файловую систему. Он для SystemRescueCd, но используемые пакеты можно поставить в любой линукс.
И вообще, SystemRescueCd, который можно запускать с CD или флешки, много интересного несет в себе.
А есть что-либо под линукс, что умеет запакованный образ раздела монтировать, чтобы можно было просмотреть и скопировать выборочные файлы?

Анонимный комментирует...

Привет, Virens. Можешь подсказать, есть небольшая задачка. Нужно мой ext3 раздел в 14Gb (есть только один раздел, монтирован на /) расширить, т.е. из 14Gb сделать 50Gb, и, конечно, сохранить при этом все те насройки и программы что есть уже в системе. Про это ли говорится в этом посте (или только о backup-е)? Если не про это, можешь, пожалуйста, подсказать, где можно найти/почитать как это правильно сделать.
Спасибо.
Александр.

Анонимный комментирует...

Ошибочка вышла немного. Пункт 3.1 (цитирую):
>Копируем и распаковываем файл-образ одновременно:
># gzip -x /mnt/sda1/hda.img.gz | dd of=/dev/hda conv=sync,noerror bs=64K
Вместо gzip -x должно быть gunzip -c. Ну и логичнее будет сказать "распаковываем и копируем", но это я уже придираюсь :-)

lavro комментирует...

На офф сайте Partimage предупреждается о НЕ поддежке фс ext4, btrfs

Анонимный комментирует...

при распаковке теперь вместо gzip -x gzip -d

virens комментирует...

Волею хаоса сюда нагрянул автор и узрел необходимость поправить пост.

@Анонимный комментирует...
Наверно, раздел всё-таки мужского рода и окончание у "примонтирована" должно быть другим, а? Как считает автор? :)
Автор считает так же. Просто многие посты в этом блоге напоминают римские катакомбы - они подкапываются и переделываются столько раз, что русская языка мало-мало шайтанамама :-)

@Анонимный комментирует...
пофиг смонтирован ли первычный раздел или нет:
Ну ты горяч, Анонимус!

и куча вариаций на тему.
В посте речь вообще-то про dd. Но мысль верная, и я её подумаю.


@sda комментирует...
imho - может таки стоит перед бэкапом создать
Занятно. Попробуем.


@Анонимный комментирует...
Здесь описан скрипт, учитывающий файловую систему. Он для SystemRescueCd, но используемые пакеты можно поставить в любой линукс.
Ссылка дохлая: "Внутренняя ошибка системы" и всё. А жаль.

И вообще, SystemRescueCd, который можно запускать с CD или флешки, много интересного несет в себе.
Йёда магистр с Анонимом согласен, SystemRescueCd к светлой стороне силы много интересного добавляет :-)

А есть что-либо под линукс, что умеет запакованный образ раздела монтировать, чтобы можно было просмотреть и скопировать выборочные файлы?
Хмм... дас ист гут проблем. Можно попробовать привлечь к этому squashFS - но оно без записи.



@Анонимный комментирует...
Ошибочка вышла немного. Пункт 3.1 (цитирую):
Всё течёт, всё меняется. Спасибо, Анонимус! Поправил. И да, так оно логичнее.

Анонимный комментирует...

Если использовать LVM - можно это все на живую делать, snapshot сделал с логического тома, бакапишь его и не паришся юзает его кто то или нет

virens комментирует...

@Анонимный комментирует...
Если использовать LVM - можно это все на живую делать
Это понятно, что можно, но у меня LVM нет.

Тут, кстати, один из приглашённых авторов (iv_vl) грозился разродиться постом про LVM. Но что-то у него это как-то не пошло. Анонимус не хочет поучаствовать в процессе?

iv_vl комментирует...

(iv_vl) грозился разродиться постом про LVM
Часть про установку LVM написана, и лежит у тебя в закрытом блоге. Я установил дебиан и просто занимаюсь наукой. На эксперименты не тянет - мне ехать, а не шашечки. Посему, если кто захочет дописать, то с радостью отдам котенка^Wстатью в хорошие руки.
P.S. Михаил, я начал раздумывать, в какие постдоки податься после защиты. Может выскажешь по email какие соображения по поиску? Ведь у тебя, дебианщика, всегда есть рецепты на все случаи жизни, поэтому и читаем с удовольствием твой блог. Или хотя бы про Австралию скажи, как с этим дела.

Iskander комментирует...

Есть вопрос, таким образом можно будет сделать бэкап флешки телефона, с целью развернуть этот бэкап на SD карточку большего размера?
Карточка сильно старее телефона и кажется скоро откинет копыта и под это дело я намереваюсь купить карточку большего размера.
P.S. понимаю вопрос глупый, но все же интересно, телефончик тоже далеко не новый на Symbian и некоторые программки, установленные на SD карточку, не так просто найти да и времени займет немало.

Vladimir Berkut комментирует...

Iskander, Да можно. Проблема возникнет только в "большести" другой карты. DD копирует побайтово все устройство, вместе с таблицей файлов. На Fat32 все блоки прописаны в эту таблицу. Поэтому ДВА варианта.

1) Скопировать с помощью dd на карточку, затем использовать gparted чтобы расширить раздел.
2) Снять образ с существующей карточки с помощью dd. Затем, используя mount -o loop подсоединить этот образ как диск, и просто перекопировать файлы с него на новую флэшку.

Успехов.

Отправить комментарий

Подписаться на RSS-ленту комментариев к этому посту.