Система резервного копирования файлов c rdiff-backup

Утилита rdiff-backup позволяет Baм создавать резервные копии ваших данных. (Работает в окружении различных unix-подобных ОС).

Все команды необходимо выполнять в Konsole от имени суперпользователя (root), если не указано обратное.

*Эта утилита - прекрасный инструмент для восстановления системы или обновления ядра после неудачного обновления. Так же замечательно она может быть применена при восстановлении отдельных файлов
*Так же как при использовании rsinc резервируются лишь измененные файлы (что существенно сокращает время создания резервной копии).
*История всех произведенных изменений сохраняется (это позволит восстановить не только последние измененные файлы, но и, к примеру, удаленные 3 недели назад!)
*Доступно безопасное сетевое копирование данных (используя ssh).
*Возможно создание резервных копий, смонтированных разделов целиком (что позволяет легко настроить ежедневное копирование данных, не нуждающееся в размонтировании резервируемого раздела).
*При выходе из строя старого жесткого диска, или покупке нового, Вы можете полностью восстановить данные!
*Возможно промышленное использование как инструмента резервного копирования в больших сетях (что для linux не вызывает ни малейших проблем, несколько сложнее с резервированием windows-машин).
*Являясь консольной утилитой, rdiff-backup легко встраивается в shell-скрипты, позволяя автоматизировать процесс резервного копирования посредством cron.
*При создании резервной копии с помощью rdiff-backup сохраняются как права доступа, так и символические ссылки. Т.е. после восстановления из резервной копии Вы получаете все "как было".

Что Вам нужно знать

Копии резервируемых файлов сохраняются целиком ( в несжатом виде). Таким же образом сохраняются истории произведенных изменений (пошаговое резервирование). Это означает, что суммарное пространство для резервной копии должно быть больше объёма самих резервируемых файлов! (При резервировании файлов объёмом 100Гб на диске необходимо выделить 120 Гб под резервную копию). Место для сохранения резервной копии необходимо выделять на отдельном жестком диске.

Как это работает

Предположим, что у Вас есть:
* Первый жесткий диск (sda) 100Гб используется со следующими смонтированными разделами: sda1 как / (корневой), sda5 для сохранения музыки и прочих файлов, sda6 под swap.
* Второй жесткий диск (sdb) 200Гб не используется и смонтирован как sdb1 ...(будет задействован для сохранения резервных копий).
* IP адресс 192.168.0.1

Сначала устанавливаем rdiff-backup:

# apt-get install rdiff-backup

Теперь рассмотрим пример резервирования раздела жесткого диска целиком (хотя можно осуществить резервирование любой отдельной директории), пусть это будут sda1 и sda5 (создавать бэкап раздела swap - необходимости нет). Создадим необходимые директории для сохраняемых файлов:

# mkdir -p /media/sdb1/rdiff-backups/192.168.0.1/root
# mkdir -p /media/sdb1/rdiff-backups/192.168.0.1/sda5

Необходимо указать свой IP-адрес для сохранения возможности резервирования данных с других хостов в будущем.

Резервирование

Синтаксис утилиты rdiff-backup: rdiff-backup source-dir dest-dir. (Примечание: всегда указывайте имя директории, а не файла!).

Для резервирования раздела sda5 выполнитe следующие действия в командной строке:

# rdiff-backup /media/sda5 /media/sdb1/rdiff-backups/192.168.0.1/sda5

Тоже самое селайте и для корневого раздела:

# rdiff-backup --exclude '/tmp/*' --exclude '/proc/*' --exclude '/sys/*' --exclude '/media/*/*' / /media/sdb1/rdiff-backups/192.168.0.1/root

Ошибки типа "AF_UNIX path too long" могут быть проигнорированы. Их появление может быть связано с тем, что при первичном копировании раздела rdiff-backup сохраняет все, а не только измененные файлы. Так же обращаем Ваше внимание на то, что из списка резервирования исключены /tmp(постоянно изменяющиеся временные файлы); /proc и /sys, как не содержащие реальных файлов; а также /mount(здесь содержится раздел с резервными копиями файлов; включив его в список, мы создадим бесконечный цикл "самокопирования" этого раздела. Если все же необходимо создать копию - придется сделать это отдельно.

Причина использования в команде '/proc/*' вместо '/proc' в том, что во втором случае произойдет копирование только названия директории, без ее содержимого. Это же относится и к /tmp, /sys, и в целом к использованию имен точек монтирования.

При восстановлении после сбоев или повреждений корневого раздела целиком, разделы /tmp, /proc, /sys и имена точек монтирования будут созданы заново (так как и должны быть). Если не существует раздела /tmp, старт Х-ов приведет к появлению многочисленных ошибок. Страничка man содержит подробные сведения об опциях --exclude and --include).

Восстановление директорий из файлов резервного копирования

В данном случае синтаксис команды rdiff-backup таков:

rdiff-backup -r <from-when> <source-dir> <dest-dir>

Теперь, если вы случайно удалили директорию /media/sda7/photos, ее возможно восстановить:

# rdiff-backup -r now /media/sdb1/rdiff-backups/192.168.0.1/sda5/photos /media/sda5/photos

Опция "-r now" означает восстановление из последнего бэкапа. Если резервное копирование осуществляется периодически (посредством crontab, например) и директория с фотографиями была удалена несколько дней назад, то для восстановления следует использовать соответствующий бэкап (не "now", т.к. в нем не содержатся необходимые файлы). То же самое верно во всех случаях, когда необходимо восстановить прежнюю версию чего бы то ни было.

Для восстановления из бэкапа, созданного 3 дня назад используйте: "-r 3D" ... но не забывайте свериться с указаниями man

"3D" позволяет вернуться к состоянию за 72 часа до настоящего момента, и если тогда не было создано резервной копии, восстановление автоматически произойдет из предыдущего бэкапа. Например, указана опция "3D", но существуют бэкапы только двухдневной и четырёхдневной давности; запрошенный файл будет восстановлен из бэкапа, созданного 4 дня назад ( это обстоятельство необходимо учесть перед проведением восстановления).

Следующая команда отображает дату и время резервных копий, созданных для sda5:

# rdiff-backup -l /media/sdb1/rdiff-backups/192.168.0.1/sda5
Восстановление разделов

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

ПРЕДУПРЕЖДЕНИЕ: Не пытайтесь восстановить корневой раздел, если Вы в него загрузились! Это может привести к потере всех данных на всех разделах, включая резервные копии на отдельном жестком диске!! ...rdiff-backup выполнит в точности то, что ему указано... если в бэкапе корневой раздел пуст, то при восстановлении будет удалённо все содержимое настоящего корневого раздела - в точности, как в резервной копии.

Для восстановления sda5 из последней резервной копии необходимо выполнить:

# rdiff-backup -r now /media/sdb1/rdiff-backups/192.168.0.1/sda5 /media/sda5
Восстановление корневого раздела

Восстановление корневого раздела - дело не простое. Как было сказано выше - не допускается восстановление "/", если он был смонтирован. Необходимость данного действия может возникнуть в результате неудачной инсталляции, обновления системы или ее ядра. При правильном исполнении - возможен откат к прежнему состоянию системы, и он займет не более 20 минут.

Один из способов восстановления состоит в загрузке в параллельно установленную Linux-систему. Далее процесс восстановления аналогичен вышеописанной стандартной процедуре (т.к. в загруженной системе восстанавливаемый корневой раздел не является корневым для запущенной системы, а выступает в роли обычной точки монтирования). Перегрузитесь в систему, корневой раздел которой был восстановлен - сама система будет в точности соответствовать использованной резервной копии. Этот способ - самый легкий.

Другим способом является загрузка с aptosid-live и осуществление восстановления корневого раздела из "Live-CD" системы (утилита rdif-backup включена в состав ПО на диске). Если же утилита не обнаружена в комплекте Live-CD, можно при загрузке в командной строке grub (Bootoptions, (Cheatcodes)) указать "unionfs", что позволит производить инсталляцию пакетов в режиме Live-CD. По окончании загрузки необходимо выполнить в командной строке:

$ sudo su
# wget -O /etc/apt/sources.list http://aptosid.com/files/misc/sources.list
# apt-get update
# apt-get install rdiff-backup
А теперь осуществим восстановление:
# mount /dev/sda1 /media/sda1
# mount /dev/sdb1 /media/sdb1
# rdiff-backup -r now /media/sdb1/rdiff-backups/192.168.0.1/root /media/sda1

Примечание: если вы не имеете диска aptosid, но располагаете Live-CD с поддержкой klik, установить rdiff-backup возможно с помощью Klik:

$ sudo ~/.zAppRun ~/Desktop/rdiff-backup_0.13.4-5.cmg rdiff-backup -r now /media/sdb1/rdiff-backups/192.168.0.1/root /media/sda1

Рекомендуется каждому попробовать восстановление корневого раздела на практике, так как нет ничего хуже, чем думать, как все просто и легко, а потом столкнуться с неожиданностью в аварийной ситуации.

Если жесткий диск был изменен или переформатирован, проверьте еще раз UUID (или меток) в /boot/grub/menu.lst (при grub-legacy) или файлы в /etc/grub.d (при grub2) и /etc/fstab и измените соответствующим образом. Самый простой способ получить информацию для изменения файлов menu.lst и fstab, (если есть такая необходимость) - можно применить суперпользователь:

blkid
Резервное копирование данных других хостов

Данные с удаленной машины можно сохранять локально, при условии наличия ssh доступа к удаленному хосту и достаточного количества свободного места на локальном жестком диске. На удаленной машине должен быть запущен сервер ssh, где при этом расположен сам хост - значения не имеет (это может быть и локальная сеть, и интернет).

Представим, что удаленный хост имеет следующие параметры:
1) 100Гб жесткий диск (sda) с обычными точками монтирования
2) sda1 используется как корневой раздел
3) sda5 предназначен для хранения временных файлов, которые мы не включаем в резервное копирование
4) sda6 как swap
5) IP адрес 192.168.0.2

Примечание: оба 100 гигабайтных харда обычно не могут быть зарезервированы на 200-гигабайтном винчестере (ввиду нехватки дискового пространства). Поскольку мы не копируем sda5 удаленного хоста, а разделы жесткого диска обычно не заполнены на 100% (хотя полагаться на это не стоит), можно сосчитать количество необходимого места на жестком диске и убедиться в его Наличии. Каждый раз, когда новый раздел сохраняется с помощью rdiff-backup, необходимо помнить, что создается новая 'структура' для вложенных файлов, требующая нового дополнительного пространства.

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

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

На локальном компьютере выполняем: Обратите внимание на использование двойного двоеточия ::

# mkdir /media/sdb1/rdiff-backups/192.168.0.2/root
# rdiff-backup --exclude '/tmp/*' --exclude '/proc/*' --exclude '/sys/*' --exclude '/media/*/*' 192.168.0.2::/ /media/sdb1/rdiff-backups/192.168.0.2/root

Теперь для восстановления директории на удаленном компьютере возможно инициирование процесса восстановления как локально, так и удаленно.

Восстановление директории /usr/local/games на удаленном компьютере, инициализируя процесс восстановления на нем же:

# rdiff-backup -r now 192.168.0.1::/media/sdb1/rdiff-backups/192.168.0.1/root/usr/local/games /usr/local/games

То же самое, но локально:

# rdiff-backup -r now /media/sdb1/rdiff-backups/192.168.0.1/root/usr/local/games 192.168.0.2::/usr/local/games

Используется такой же синтаксис, как при восстановлении корневого раздела с Live-CD (удаленная машина загружена с Live-CD ... пример - смотри выше).

Автоматизированное создание резервных копий:

Первое, что необходимо сделать для резервирования данных с удаленного компьютера, так это включить доступ к ключам ssh без использования пароля. Речь идет о входе без пароля с учетной записью root. Обсуждение возможности ограничиться беспарольным выполнением только команд rdiff-backup выходит за рамки данной статьи, подробная информация находится в разделе руководства "SSH Configuration" . Здесь мы рассмотрим простейший способ установки беспарольного логина, принимая политику "полного доверия".

Выполняем локально:

# [ -f /root/.ssh/id_rsa ] || ssh-keygen -t rsa -f /root/.ssh/id_rsa

Дважды нажимаем 'enter' для сохранения пустого пароля. После этого:

# cat /root/.ssh/id_rsa.pub | ssh 192.168.0.2 'mkdir -p /root/.ssh;\
> cat - >>/root/.ssh/authorized_keys2'

Будет запрошен пароль root

Теперь вы можете войти по ssh на удаленный хост под учетной записью root, не вводя пароль, и произвести автоматизацию rdiff-backup.

Следующим шагом создадим shell-script, подобный ниже приведенному и содержащий все необходимые команды rdiff-backup:

#!/bin/bash
RDIFF=/usr/bin/rdiff-backup
echo
echo "=======Backing up 192.168.0.1 root======="
${RDIFF} --ssh-no-compression --exclude '/tmp/*' --exclude '/proc/*' --exclude '/sys/*' --exclude '/media/*/*' / /media/sdb1/rdiff-backups/192.168.0.1/root
echo "(and purge increments older than 1 month)"
${RDIFF} --remove-older-than 1M --force /media/sdb1/rdiff-backups/192.168.0.1/root
echo
echo "=======Backing up 192.168.0.1 mount sda5======="
${RDIFF} --ssh-no-compression --exclude /media/sda5/myjunk /media/sda5 /media/sdb1/rdiff-backups/192.168.0.1/sda5
echo "(and purge increments older than 1 months)"
${RDIFF} --remove-older-than 1M --force /media/sdb1/rdiff-backups/192.168.0.1/sda5
echo
echo "=======Backing up 192.168.0.2 root======="
${RDIFF} --ssh-no-compression --exclude '/tmp/*' --exclude '/proc/*' --exclude '/sys/*' --exclude '/media/*/*' --exclude '/mnt/*/*' 192.168.0.2::/media/sdb1/rdiff-backups/192.168.0.2/root
echo "(and purge increments older than 1 months)"
${RDIFF} --remove-older-than 1M --force /media/sdb1/rdiff-backups/192.168.0.2/root

Сохраним скрипт под именем "myrdiff-backups.bash" в директории /usr/local/bin локально (на бэкап-сервере), не забываем сделать его исполняемым. Запускаем, чтобы убедится, что скрипт работает.

И в последнюю очередь прописываем в crontab (root-овый) вызов скрипта ежедневно в 8 часов вечера. Для этого выполняем от имени root следующее:

# crontab -e
и пишем следующее
0 20 * * * /usr/local/bin/myrdiff-backups.bash
Содержание, последний раз пересмотрено 14/08/2010 0100 UTC