Надоело мне в повседневности использовать обычный скрипт резервного копирования и ручного удаления полученного файла по прошествии некоторого времени дабы не кончилось место на разделе куда складывается бекап. Пора бы уже все сделать как подобает системному администратору, а именно чтобы я больше не участвовал в процессе, а только получал уведомления на почту о работает. Поиск необходимого инструмента вывел меня на утилиту 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
Размер:
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
на почту приходит вот такое сообщение:
Вот сколько раз запускал утилиту столько и файлов создалось но основе главного символических ссылок:
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.