Rdiff-backup написан на Python и использует библиотеку librsync для передачи данных.
Умеет копировать файлы на удаленный хост.
Также можно делать бекап с удаленного хоста, но предварительно нужно установить там Rdiff-backup.
Хранит информацию об изменениях файлов (дельты) в сжатом виде, хорошо для больших файлов, позволяет экономить место на диске.
Метаданные (права, даты, владелец) хранятся в отдельных файлах.
Наличие конфигурационного файла не предполагается. Автоматизировать придется самому.
Запуск бекапа производится из консоли.
В качестве источника/назначения могут быть локальные файловые системы на том же сервере или удалённое копирование поверх ssh/rsync протоколов.
Например, при локальном копировании
1 |
# rdiff-backup <source> <destination> |
При удаленном копировании
С локального сервера на удаленный
1 |
# rdiff-backup /etc root@192.168.10.56::/backup1/server1/etc |
C удаленного на локальный
1 |
# rdiff-backup root@192.168.10.56::/etc /backup/server1/etc |
По-умолчанию rdiff-backup выполняет задания с уровнем детализации (verbosity) = 3. Возможные значения — от 0 до 9.
0=не выводить ничего, даже критические ошибки.
9=максимально возможный детальный лог
Можем регулировать любыми значениями от 0 до 9.
1. Установка Rdiff-backup
1 |
# apt-get install rdiff-backup |
2. Использование Rdiff-backup
Локальное бекапирование
Например, сдеалем бекап каталога /etc/
1 |
# rdiff-backup /etc /backup/etc |
В качестве получателя необходимо указывать либо пустой, либо несуществующий каталог, иначе rdiff-backup откажет в выполнении бекапа
Удаленное бекапирование (на удаленном сервере предварительно также необходимо установить Rdiff-backup)
Для удобства копирвоания настроим аутентификацию по SSH-ключам
1 |
# ssh-keygen -t rsa -b 4096 |
1 |
# ssh-copy-id -i .ssh/id_rsa.pub root@192.168.10.56 |
С локального сервера на удаленный
1 |
# rdiff-backup /etc root@192.168.10.56::/backup1/etc |
После завершения сессий архивации rdiff-backup создаёт в каталоге архива специальный файл
1 |
rdiff-backup-data/session_statistics* |
, содержащий разнообразную статистическую информацию о результатах сессии.
Этот файл доступен для просмотра
1 |
# cat /backup1/etc/rdiff-backup-data/session_statistics.2016-09-07T13\:09\:44+03\:00.data |
Утилита предлагает специальную опцию —calculate-average, при помощи которой можно получить общее представление об архиве,
1 |
# rdiff-backup --calculate-average /backup1/etc/rdiff-backup-data/session_statistics.2016-09-07T13\:09\:44+03\:00.data |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
--------------[ Average of 1 stat files ]-------------- ElapsedTime 1.27 (1.27 seconds) SourceFiles 1934.0 SourceFileSize 2164267.0 (2.06 MB) MirrorFiles 1.0 MirrorFileSize 0.0 (0 bytes) NewFiles 1933.0 NewFileSize 2164267.0 (2.06 MB) DeletedFiles 0.0 DeletedFileSize 0.0 (0 bytes) ChangedFiles 1.0 ChangedSourceSize 0.0 (0 bytes) ChangedMirrorSize 0.0 (0 bytes) IncrementFiles 0.0 IncrementFileSize 0.0 (0 bytes) TotalDestinationSizeChange 2164267.0 (2.06 MB) Errors 0 ------------------------------------------------------- |
Для просмотра статистки при выполнении бекапа можно использовать опцию —print-statistics
1 |
# rdiff-backup --print-statistics /etc root@192.168.10.56::/backup1/etc |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
--------------[ Session statistics ]-------------- StartTime 1473243157.00 (Wed Sep 7 13:12:37 2016) EndTime 1473243158.06 (Wed Sep 7 13:12:38 2016) ElapsedTime 1.06 (1.06 seconds) SourceFiles 1935 SourceFileSize 2164271 (2.06 MB) MirrorFiles 1934 MirrorFileSize 2164267 (2.06 MB) NewFiles 1 NewFileSize 4 (4 bytes) DeletedFiles 0 DeletedFileSize 0 (0 bytes) ChangedFiles 1 ChangedSourceSize 0 (0 bytes) ChangedMirrorSize 0 (0 bytes) IncrementFiles 2 IncrementFileSize 0 (0 bytes) TotalDestinationSizeChange 4 (4 bytes) Errors 0 -------------------------------------------------- |
Поскольку rdiff-backup выполняет инкрементное копирование, при регулярном архивировании часто изменявшиеся в прошлом файлы будут иметь несколько версий. Чтобы получить информацию об имеющихся в архиве инкрементах файлов/каталогов, используем ключ —list-increments:
1 |
# rdiff-backup --list-increments /backup1/etc/ |
1 2 3 |
Found 1 increments: increments.2016-09-07T13:11:20+03:00.dir Wed Sep 7 13:11:20 2016 Current mirror: Wed Sep 7 13:12:37 2016 |
Получение списка файлов на определённый момент времени
Список всех файлов в архиве, которые в нём содержались 2 версии назад, включая также файлы, которые были удалены в последующих версиях:
1 |
# rdiff-backup --list-at-time 2B root@192.168.10.56::/backup1/etc/ |
Аналогично, но выводит список файлов/каталогов, которые в нем содержались 1 день назад, включая также файлы, которые были удалены в течение последних суток
1 |
# rdiff-backup --list-at-time 1D root@192.168.10.56::/backup1/etc/ |
Получение списка изменявшихся файлов
Часто бывает необходимо получить список файлов, которые модифицировались за определённый промежуток времени.
Список файлов, которые менялись за последние 10 минут:
1 |
# rdiff-backup --list-changed-since 10M root@192.168.10.56::/backup1/etc/ |
1 2 |
changed . new mynewfile.txt |
Сравнение архива и текущего состояния файлов
Список всех файлов, которые были изменены в каталоге /etc с момента его последней архивации в каталог /backup1/etc на удаленный сервер 192.168.10.56
1 |
# rdiff-backup --compare /etc root@192.168.10.56::/backup1/etc/ |
1 |
No changes found. Directory matches archive data. |
3. Восстановление бекапа
Поскольку rdiff-backup хранит файлы в открытом/неизменном, то в случае необходимости восстановить файл-каталог можно просто скопировать его обратно из архива обычной командой cp (если бекап локального каталога выполнялся локально)
Для восстановления из удаленного сервера используем команду rdiff-backup
Восстановить(-r) файл /etc/newfile.txt из последней версии архива(now),расположенного на удаленной системе(192.168.10.56 в каталоге /backup1/etc)
1 |
# rdiff-backup -r now root@192.168.10.56::/backup1/etc/newfile.txt /etc/newfile.txt |
1 |
Fatal Error: Restore target /etc/newfile.txt already exists, specify --force to overwrite. |
Т.к файл на приемнике уже существует, то rdiff-backup отказывается его заменять и предлагает использовать опцию —force для принудительной перезаписи существующего файла
1 |
# rdiff-backup --force -r now root@192.168.10.56::/backup1/etc/newfile.txt /etc/newfile.txt |
Если необходимо восстановить определенную копию файла newfile.txt, а не последнюю, то для начала просмотрим существующие версии файла
1 |
# rdiff-backup --list-increments root@192.168.10.56::/backup1/etc/newfile.txt |
1 2 3 |
Found 1 increments: newfile.txt.2016-09-07T13:12:37+03:00.diff.gz Wed Sep 7 13:12:37 2016 Current mirror: Wed Sep 7 13:36:15 2016 |
Восстановим нужную версию файла, указав нужную версию файла из каталога increments
1 |
# rdiff-backup --force 192.168.10.56::/backup1/etc/rdiff-backup-data/increments/newfile.txt.2016-09-07T13:12:37+03:00.diff.gz /etc/newfile.txt |
Если необходимо восстановить файл на одну версию назад(старше)
1 |
# rdiff-backup --force -r 1B 192.168.10.56::/backup1/etc/newfile.txt /etc/newfile.txt |
Или через указание даты
1 |
# rdiff-backup --force -r 2016-09-07T13:12:37+03:00 192.168.10.56::/backup1/etc/newfile.txt /etc/newfile.txt |
4. Удаление старых версий
Для удаления бекапов старше определенного времени используется опция
—remove-older-than.
Например, удаляем бекапы старше одного месяца:
1 |
# rdiff-backup --remove-older-than 1M 192.168.10.56::/backup1/etc |
1 |
No increments older than Mon Aug 8 14:08:36 2016 found, exiting. |
Или удаляем бекапы старше 5 сессий/версий
1 |
# rdiff-backup --remove-older-than 5B 192.168.10.56::/backup1/etc |
1 |
No increments older than Wed Sep 7 13:09:44 2016 found, exiting. |
5. Исключение каталогов/файлов из бекапа
Создадим бекап всей файловой системы за исключением содержимого указанных каталогов, указанных в опции —exclude
1 |
# rdiff-backup --exclude '/tmp/*' --exclude '/proc/*' --exclude '/sys/*' --exclude '/media/*' --exclude '/mnt/*' --exclude '/var/lib/lxc/*' --exclude '/var/lib/lxcsnapshot/*' --exclude /backup / root@192.168.10.56::/backup2/server1 |
Иногда проще указать то, что нужно скопировать, вместо того, что НЕ нужно. Следующая команда скопирует, например, /usr/local/bin, пропустив при этом /usr/bin:
1 |
# rdiff-backup --include /usr/local --exclude /usr / root@192.168.10.56::/backup2/server1 |
при множественном использовании опций ‘—include’ / ‘—exclude’ их приоритет зависит от порядка появления в команде.
rdiff-backup позволяет использовать шаблоны подобные тем, которые используются в rsync: ‘**’ эквивалентны любому пути, а ‘*’ — любому пути без завершающего слеша. Так, например, следующая команда скопирует /usr/local и /var, но пропустит всё остальное:
1 |
# rdiff-backup --include /usr/local --include /var --exclude '**' / root@192.168.10.56::/backup2/server1 |
Кавычки нужны, поскольку большинство оболочек обрабатывают звёздочки как спецсимволы, превращая их в маски.
6. Создание скрипта для бекапа
Создадим скрипт для бекапа и добавим его в планировщик заданий cron на ежесуточное выполнение
1 |
# mkdir /usr/local/scripts |
1 |
# nano /usr/local/scripts/backup.sh |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
#!/bin/bash # Определяем имя сервера который бекапим – используем это для создании структуры каталогов на удаленном сервере HOSTNAME=$(which hostname) HOST_NAME=$($HOSTNAME -s) RDIFF_BACKUP=$(which rdiff-backup) # Адрес Backup-сервера, на который будем бекапить BACKUP_SERVER='192.168.10.56' # Пользователь от имени которого будем бекапить(подключаться на сервер бекапов) USER='root' # Директория на сервере бекапов в которой создаются бекапы PREFIX='/backup' # Директории которые ИСКЛЮЧАЕМ из бекапа EXCLUDE_DIR1='/proc/*' EXCLUDE_DIR2='/sys/*' EXCLUDE_DIR3='/media/*' EXCLUDE_DIR4='/mnt/*' EXCLUDE_DIR5='/tmp/*' $RDIFF_BACKUP --exclude=$EXCLUDE_DIR1 \ --exclude=$EXCLUDE_DIR2 \ --exclude=$EXCLUDE_DIR3 \ --exclude=$EXCLUDE_DIR4 \ --exclude=$EXCLUDE_DIR5 / $USER@$BACKUP_SERVER::$PREFIX/$HOST_NAME |
Выставляем бит исполнения для скрипта и добавляем его в сron
1 |
# chmod +x /usr/local/scripts/backup.sh |
1 |
# crontab -e |
1 |
15 2 * * * root bash /usr/local/scripts/backup.sh |
при использовании нестандартного порта SSH при подключении к удаленному хосту указываем порт SSH в опции —remote-schema
1 |
--remote-schema "ssh -C -p 2220 %s rdiff-backup --server" |
По умолчанию используется следующая —remote-schema
1 |
--remote-schema "ssh -C %s rdiff-backup --server" |
1 2 |
С - включение сжатия %s - имя хоста подставляется вместо %s |
Скрипт для бекапа с удаленного сервера каталога с данными
1 |
# nano /usr/local/scripts/rdiff-backup.sh |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
#!/bin/bash RDIFF_BACKUP=$(which rdiff-backup) USER='root' DATE="$(date +%Y-%m-%d)" LOGFILE="/var/log/rdiff-backup.log" HOSTNAME1="myservername" DEST_DIR1="/home/backup/rdiff-backup/$HOSTNAME1" INCLUDE_DIR1='/var/www/data' ${RDIFF_BACKUP} --remote-schema "ssh -C -p 2220 %s rdiff-backup --server" $USER@$HOSTNAME1::${INCLUDE_DIR1} ${DEST_DIR1} exitcode=$? if [ "$exitcode" -eq "0" ] then echo "Rdiff-backup $HOSTNAME1 completed successfully - $DATE" >> $LOGFILE else echo "Rdiff-backup $HOSTNAME1 is failed - $DATE" >> $LOGFILE fi # Delete backups older 30 days ${RDIFF_BACKUP} --remove-older-than 1M ${DEST_DIR1} |
Источник:
http://ashep.org/2012/rezervnoe-kopirovanie-pri-pomoshhi-rdiff-backup/#.V8_V0zW22Ul
http://ashep.org/2012/rabota-s-arxivami-rdiff-backup/#.V8_ZsTW22Ul
http://www.hilik.org.ua/rdiff-backup/
http://www.nongnu.org/rdiff-backup/examples.html