Автоматический бэкап в 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_sshcmd_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