Автоматический бэкап в Linux с помощью rsnapshot

Утилита rsnapshot основана на rsync, в состоянии делать периодические спэпшоты файлов по заданным путям, в том числе и удаленных систем через SSH. Имеется в репах большинства Linux дистрибутивов и даже роутеров. Снэпшоты создаются используя хардлинки, поэтому используемое место на жестком диске равняется общему занимаемому объему + объем инкрементов.

Конфигурация сводится к редактированию файла 

/etc/rsnapshot.conf

. Для начала нужно создать папку где будут храниться бэкапы. У меня это будет backup в корневом каталоге.

$ cd /
$ sudo mkdir backup

Открываем любимым редактором файл /etc/rsnapshot.conf с правами администратора:

sudo vim /etc/rsnapshot.conf

Параметр snapshot_root содержит путь для бэкапов, изменяем его:

snapshot_root   /.snapshots/

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

Раскомментируем нужные утилиты 

cmd_ssh

cmd_du

 и 

cmd_rsnapshot_diff

.

Теперь раздел 

BACKUP LEVELS / INTERVALS

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

retain  twiceaday   2
retain  daily    7
retain  weekly   4
retain  monthly    12

Первая строка — бэкап будет делаться 2 раза в день, соответственно, храним 2 копии. После первого срабатывания будет создана папка 

twiceaday.0

, после второго 

twiceaday.1

. Когда придет время третьего срабатывания (я имею ввиду вообще по счету) то содержимое 

twiceaday.0

 будет перезаписано, потом содержимое 

twiceaday.1

 и так далее.

Вторая строка — она не делает бэкапа, как я уже говорил, она указывает брать содержимое крайней папки из 1-й строки и определить его в свою папку с соответствующим номером. Например при первом запуске в нашем случае будет создана папка 

daily.0

 в которую попадет содержимое 

twiceaday.1

. При втором выполнении произойдет то же самое только в папку 

daily.1

 и так далее пока не дойдет до 

daily.6

, следующее после него выполнение перезапишет 

daily.0

, последующее 

daily.1

 и т.д.

Третья и четвертая строки — аналогично второй, только они ротируют предыдущие уровни: weekly ротирует daily, а monthly — weekly.

Быть может не совсем понятно описал, но на деле все просто. У нас получится ежедневный бэкап длиной в год. Twiceaday ввел потому, что в бэкапе будет участвовать домашний ноутбук, а он может не оказаться включенным во время создания бэкапа, пускай отрабатывает дважды в день.

В разделе 

GLOBAL OPTIONS

 можно раскомментировать опцию 

logfile /var/log/rsnapshot

, чтобы смотреть логи.

Раздел 

BACKUP POINTS / SCRIPTS

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

backup  /home/  localhost/
/home/

 — что бэкапится, 

localhost/

 — куда.

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

sudo rsnapshot configtest

Должно выдать 

Syntax OK

. Если выдало что-то другое значит кое у кого не очень прямые руки  есть ошибки. У меня это было так:

----------------------------------------------------------------------------
rsnapshot encountered an error! The program was invoked with these options:
/usr/bin/rsnapshot configtest
----------------------------------------------------------------------------
ERROR: /etc/rsnapshot.conf on line 67:
ERROR: cmd_rsnapshot_diff /usr/local/bin/rsnapshot-diff - \
/usr/local/bin/rsnapshot-diff is not executable
ERROR: ---------------------------------------------------------------------
ERROR: Errors were found in /etc/rsnapshot.conf,
ERROR: rsnapshot can not continue. If you think an entry looks right, make
ERROR: sure you don't have spaces where only tabs should be

После замены пути до 

rsnapshot-diff

 все стало на свои места.

Теперь можно проверить выполнение бэкапа:

sudo rsnapshot -t twiceaday

В выводе не должно быть ничего подозрительного.

Бэкап удаленной системы делается так:

backup  username@example.net:/home/username/ example.net/ exclude=/projects,exclude=/test

Cуть та же самая — что, куда. Еще один параметр — исключения (то, что не будет копироваться). Исключения делаются не только при удаленном бэкапе. Например так можно забэкапить систему локального компьютера:

backup  /       localhost/      exclude=/dev,exclude=/proc,exclude=/sys,exclude=/tmp,exclude=/run,exclude=/mnt,exclude=/media,exclude=/lost+found,exclude=/backup

Главное не забывать тестировать конфиги и запуск. После этого нужно сделать записи в кроне для автоматизации, хотя wiki арча предлагает создать сервис и таймеры для systemd, я решил сделать по старинке.

Для этого нужно создать файл 

/etc/cron.d/rsnapshot:
# rsnapshot backup
15      07,19    *       *       *       root    /usr/bin/rsnapshot twiceaday
0       0        *       *       *       root    /usr/bin/rsnapshot daily
0       01       *       *       7       root    /usr/bin/rsnapshot weekly
0       03       15      *       *       root    /usr/bin/rsnapshot monthly