Надоело мне в повседневности использовать обычный скрипт резервного копирования и ручного удаления полученного файла по прошествии некоторого времени дабы не кончилось место на разделе куда складывается бекап. Пора бы уже все сделать как подобает системному администратору, а именно чтобы я больше не участвовал в процессе, а только получал уведомления на почту о работает. Поиск необходимого инструмента вывел меня на утилиту rsnapshot — судя по документации это то что мне нужно. И вот я на старте составить себе шпаргалку по работе с утилитой rsnapshot для резервного копировать каталога с бекапами на другую систему или на текущую.

Создаю каталоги необходимые мне для изучения:

ekzorchik@srv-mon:~$ mkdir file1 → каталог который нужно зарезервировать

ekzorchik@srv-mon:~$ mkdir file2 → каталог где хранить резервную копию

Обновляю систему до самого актуального состояния в рамках текущего релиза:

ekzorchik@srv-mon:~$ sudo apt-get update && sudo apt-get upgrade -y

ekzorchik@srv-mon:~$ uname -a && cat /etc/os-release

Linux srv-mon 3.13.0-32-generic #57~precise1-Ubuntu SMP Tue Jul 15 03:51:20 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

NAME="Ubuntu"

VERSION="12.04.5 LTS, Precise Pangolin"

ID=ubuntu

ID_LIKE=debian

PRETTY_NAME="Ubuntu precise (12.04.5 LTS)"

VERSION_ID="12.04"

ekzorchik@srv-mon:~$ sudo apt-get install rsnapshot -y

ekzorchik@srv-mon:~$ rsnapshot --version

rsnapshot 1.3.1

ekzorchik@srv-mon:~$ sudo cp /etc/rsnapshot.conf /etc/rsnapshot.conf.backup

На заметку: Настройка бэкапа осуществляется командой backup <откуда> <куда>:

На заметку: Помните, что в конфигурационном файле недопустимы пробелы — используйте только табы.

ekzorchik@srv-mon:~$ sudo nano /etc/rsnapshot.conf

config_version 1.2

snapshot_root /home/ekzorchik/file2

cmd_cp /bin/cp

cmd_rm /bin/rm

cmd_rsync /usr/bin/rsync

cmd_logger /usr/bin/logger

cmd_rsnapshot_diff /usr/bin/rsnapshot-diff

cmd_du /usr/bin/du

# retain<2TAB><название_интервала(hourly(ежечастно),daily(ежедневно),weekly(еженедельно))_количество_снимков

#если доступно присутствует указанное количество копий, далее будет заменять наиболее старая более новой.

retain<TAB><TAB>hourly<TAB>4

#вывод на консоль обо всех выполняемых командах

verbose 3

loglevel 3

logfile /var/log/rsnapshot.log

lockfile /var/run/rsnapshot.pid

backup /home/ekzorchik/file1 localhost/

#исключить из бекапа как файлы так и каталоги, к примеру:

#exclude .Trash/

#exclude *.tmp

После проверяю конфигурационный файл на наличие ошибок:

ekzorchik@srv-mon:~$ whereis rsnapshot

rsnapshot: /usr/bin/rsnapshot /etc/rsnapshot.conf /usr/share/man/man1/rsnapshot.1.gz

ekzorchik@srv-mon:~$ rsnapshot configtest

Syntax OK

Также замечу, что выводимые на консоль пояснения на счет ошибок достаточно информативны и у Вас не должно возникнуть проблем в их исправлении.

Т.к. ошибок нет, то можно съемулировать запуск утилиты rsnapshot в тестовом режиме (хорошо для отладки и понимания задействованных ключей):

ekzorchik@srv-mon:~$ rsnapshot hourly

Could not open logfile /var/log/rsnapshot.log for writing

Do you have write permission for this file?

ekzorchik@srv-mon:~$ sudo rsnapshot -t hourly

echo 12146 > /var/run/rsnapshot.pid

/bin/cp -al /home/ekzorchik/file2/hourly.0 /home/ekzorchik/file2/hourly.1

/usr/bin/rsync -a –delete –numeric-ids –relative –delete-excluded \

/home/ekzorchik/file1 /home/ekzorchik/file2/hourly.0/localhost/

touch /home/ekzorchik/file2/hourly.0/

А теперь запускаю, как боевое использование:

ekzorchik@srv-mon:~$ sudo rsnapshot hourly

echo 12131 > /var/run/rsnapshot.pid

mkdir -m 0755 -p /home/ekzorchik/file2/hourly.0/

/usr/bin/rsync -a –delete –numeric-ids –relative –delete-excluded \

/home/ekzorchik/file1 /home/ekzorchik/file2/hourly.0/localhost/

touch /home/ekzorchik/file2/hourly.0/

rm -f /var/run/rsnapshot.pid

В итоге в каталоге /home/ekzorchik/file2/ будет первая копия файла, если в исходный каталог добавить еще файлов то после запуска rsnapshot содержимое file2 пример вид:

ekzorchik@srv-mon:~$ sudo apt-get install tree -y

Структура каталога резервного копирования rsnapshot

Размер:

ekzorchik@srv-mon:~$ sudo rsnapshot du

/usr/bin/du -csh /home/ekzorchik/file2/hourly.0/ \

/home/ekzorchik/file2/hourly.1/

193M /home/ekzorchik/file2/hourly.0/

20K /home/ekzorchik/file2/hourly.1/

193M total

Ниже лог по всем командам которые прошли после запуска:

ekzorchik@srv-mon:~$ sudo tail -f /var/log/rsnapshot.log

[04/May/2016:10:39:29] /usr/bin/rsnapshot hourly: started

[04/May/2016:10:39:29] echo 12131 > /var/run/rsnapshot.pid

[04/May/2016:10:39:29] mkdir -m 0755 -p /home/ekzorchik/file2/hourly.0/

[04/May/2016:10:39:29] /usr/bin/rsync -a –delete –numeric-ids –relative –delete-excluded /home/ekzorchik/file1 /home/ekzorchik/file2/hourly.0/localhost/

[04/May/2016:10:39:30] touch /home/ekzorchik/file2/hourly.0/

[04/May/2016:10:39:30] rm -f /var/run/rsnapshot.pid

[04/May/2016:10:39:30] /usr/bin/rsnapshot hourly: completed successfully

Уже начав выше использовать данную утилиту rsnapshot пришел к выводу, что вместо папки localhost которая создается внутри переменной snapshot_root правильнее использовать текущее имя хоста системы, т. е. В конечном итоге будет так:

backup /home/ekzorchik/file1 srv-mon/

ekzorchik@srv-mon:~$ sudo rsnapshot hourly

ekzorchik@srv-mon:~$ ls -lh file2/hourly.0/srv-mon/home/ekzorchik/file1/

total 193M

-rw-rw-r– 1 ekzorchik ekzorchik 134M May 4 10:51 dokuwiki_29_04_2016_15_49_29.tar

-rw-rw-r– 1 ekzorchik ekzorchik 59M May 4 08:35 tips_dokuwiki_v1_04_05_2016_08:20:50.tgz

Т.к. уже имеются несколько бекапов можно их сравнить, идентичны ли они или нет:

ekzorchik@srv-mon:~$ sudo rsnapshot diff --help

Usage: rsnapshot diff [backup level|dir] [backup level|dir]

ekzorchik@srv-mon:~$ sudo rsnapshot diff hourly.0 hourly.1

/usr/bin/rsnapshot-diff -vi /home/ekzorchik/file2/hourly.0 \

/home/ekzorchik/file2/hourly.1

Comparing /home/ekzorchik/file2/hourly.1 to /home/ekzorchik/file2/hourly.0

+ /home/ekzorchik/file2/hourly.0/srv-mon/home/ekzorchik/file1/tips_dokuwiki_v1_04_05_2016_08:20:50.tgz

+ /home/ekzorchik/file2/hourly.0/srv-mon/home/ekzorchik/file1/dokuwiki_29_04_2016_15_49_29.tar

Between /home/ekzorchik/file2/hourly.1 and /home/ekzorchik/file2/hourly.0:

2 were added, taking 201376703 bytes;

0 were removed, saving 0 bytes;

из вывода видно, что самый последний бекап hourly.0 были добавлены 2 файла из бекапа hourly 1 (где вместо имени хоста стояло по дефолту localhost).

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

ekzorchik@srv-mon:~$ sudo nano /etc/default/rsync

RSYNC_NICE='10'

По умолчанию в Ubuntu‘системах создается файл в котором правда закомментированы задания на запуск их можно отредактировать по своему усмотрению:

ekzorchik@srv-mon:~$ sudo nano /etc/cron.d/rsnapshot

0 */4 * * * root /usr/bin/rsnapshot hourly

, т. е. Бекап каждый четыре часа.

Для того чтобы восстановить данные из резервной копии всего лишь навсегда скопировать файлы на исходное место и если нужно поправить права доступа к восстановленному:

ekzorchik@srv-mon:~$ sudo cp /home/ekzorchik/file2/hourly.0/srv-mon/home/ekzorchik/file1/tips_dokuwiki_v1_04_05_2016_08\:20\:50.tgz /home/ekzorchik/file1/

ekzorchik@srv-mon:~$ sudo chown -R ekzorchik:ekzorchik /home/ekzorchik/file1

Если нужно иметь резервную копию за каждый день и за каждую неделю, то конфигурационный файл /etc/rsnapshot.conf будет следующим:

ekzorchik@srv-mon:~$ sudo nano /etc/rsnapshot.conf

retain daily 7

retain weekly 4

ekzorchik@srv-mon:~$ sudo rsnapshot configtest

Syntax OK

ekzorchik@srv-mon:~$ sudo rm -Rf file2/*

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

ekzorchik@srv-mon:~$ sudo rsnapshot daily

ekzorchik@srv-mon:~$ sudo rm -Rf file2/*

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

ekzorchik@srv-mon:~$ sudo nano /etc/cron.d/rsnapshot

15 02 * * * root /usr/bin/rsnapshot daily

15 03 * * * root /usr/bin/rsnapshot weekly

На заметку: rsnapshot делает инкрементальные бекапы и создает жесткие ссылки между одинаковыми данными в пределах рабочего каталога.
использует опцию -l при копировании cp daily.0 в daily.1

ekzorchik@srv-mon:~$ find file2/daily.0/ -type f | wc -l

2

ekzorchik@srv-mon:~$ find file2/daily.1/ -type f | wc -l

2

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

ekzorchik@srv-mon:~$ sudo updatedb

ekzorchik@srv-mon:~$ locate rsnapreport.pl

/usr/share/doc/rsnapshot/examples/utils/rsnapreport.pl.gz

ekzorchik@srv-mon:~$ sudo gzip -d /usr/share/doc/rsnapshot/examples/utils/rsnapreport.pl.gz

ekzorchik@srv-mon:~$ sudo mv /usr/share/doc/rsnapshot/examples/utils/rsnapreport.pl /usr/local/bin

ekzorchik@srv-mon:~$ sudo chmod +x /usr/local/bin/rsnapreport.pl

ekzorchik@srv-mon:~$ sudo apt-get install mailutils ssmtp -y

General type of mail configuration: No configuration

Т.к. у меня в сети почтовый сервер на базе Zimbra, то настройки MTA агента для работы с ним будут следующими:

ekzorchik@srv-mon:~$ sudo nano /etc/ssmtp/ssmtp.conf

root=notify-balashiha@nemdom.ru

mailhub=<mail_server:<port>

rewriteDomain=nemdom.ru

UseSTARTTLS=Yes

AuthUser=notify-balashiha@nemdom.ru

AuthPass=<password>

FromLineOvveride=yes

ekzorchik@srv-mon:~$ sudo nano /etc/ssmtp/revaliases

root:notify-balashiha@nemdom.ru:<mail_server>:<port>

ekzorchik:notify-balashiha@nemdom.ru:<mail_server>:<port>

Если тестовое письмо пришло — а у меня оно пришло, то продолжаем:

ekzorchik@srv-mon:~$ echo "test message" | ssmtp -s Test alexander.ollo@nemdom.ru

А теперь собственно настройка rsnapshot на работу с E-Mail:

ekzorchik@srv-mon:~$ sudo nano /etc/rsnapshot.conf

rsync_long_args --stats --delete --numeric-ids --relative --delete-excluded

ekzorchik@srv-mon:~$ sudo rsnapshot configtest

Syntax OK

ekzorchik@srv-mon:~$ sudo rsnapshot daily 2>&1 | /usr/local/bin/rsnapreport.pl | mail -s "Backup Daily successfully on srv-mon" alexander.ollo@nemdom.ru

на почту приходит вот такое сообщение:

Отчет по почте о завершении работы rsnapshot

Вот сколько раз запускал утилиту столько и файлов создалось но основе главного символических ссылок:

ekzorchik@srv-mon:~$ sudo rsnapshot du

/usr/bin/du -csh /home/ekzorchik/file2/daily.0/ \

/home/ekzorchik/file2/daily.1/ /home/ekzorchik/file2/daily.2/ \

/home/ekzorchik/file2/daily.3/ /home/ekzorchik/file2/daily.4/ \

/home/ekzorchik/file2/daily.5/ /home/ekzorchik/file2/daily.6/

193M /home/ekzorchik/file2/daily.0/

20K /home/ekzorchik/file2/daily.1/

20K /home/ekzorchik/file2/daily.2/

20K /home/ekzorchik/file2/daily.3/

20K /home/ekzorchik/file2/daily.4/

20K /home/ekzorchik/file2/daily.5/

20K /home/ekzorchik/file2/daily.6/

193M total

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

ekzorchik@srv-mon:~$ sudo crontab -e

15 02 * * * root /usr/bin/rsnapshot daily 2>&1 | /usr/local/bin/rsnapreport.pl | mail -s "Backup Daily successfully on srv-mon" alexander.ollo@nemdom.ru

15 03 * * * root /usr/bin/rsnapshot weekly 2>&1 | /usr/local/bin/rsnapreport.pl | mail -s "Backup Weakly successfully on srv-mon" alexander.ollo@nemdom.ru

Хочу заметить, что только на первый взгляд все кажется трудным в использовании, а решив попробовать (т. е. Съесть свою самую большую лягушку) в последствии осознаешь, что ничего сложно да и не было. Главное верить в себя и иметь/нарабатывать базу в любое свободное время. Приведу небольшой пример что я имею ввиду, вот сейчас хоть у меня и есть абонемент в спортзал (хожу преимущественно в бассейн), делаю перерывы на работе и поднимаюсь по лестнице (3 этажа), делаю подходы на брусьях, турнике. А для чего это — держать себя в форме и не зависимо от текущих задач есть своих больших лягушек. На этом я прощаюсь, до новых заметок на моем блоге, с уважением автор блога — ekzorchik.

От ekzorchik

Всем хорошего дня, меня зовут Александр. Я под ником - ekzorchik, являюсь автором всех написанных, разобранных заметок. Большинство вещей с которыми мне приходиться разбираться, как на работе, так и дома выложены на моем блоге в виде пошаговых инструкции. По сути блог - это шпаргалка онлайн. Каждая новая работа где мне случалось работать вносила новые знания и нюансы работы и соответственно я расписываю как сделать/решить ту или иную задачу. Это очень помогает. Когда сам разбираешь задачу, стараешься ее приподнести в виде структурированной заметки чтобы было все наглядно и просто, то процесс усвоения идет в гору. Также прошу на https://win.ekzorchik.ru https://lin.ekzorchik.ru https://net.ekzorchik.ru https://voip.ekzorchik.ru https;//home.ekzorchik.ru