rsnapshot — обёртка над rsync, которая делает инкрементальные резервные копии с жёсткими ссылками. Каждый новый снимок выглядит как полная копия, но занимает место только за изменённые файлы. Это удобно для домашнего сервера, небольшого офиса и виртуальных машин: история за недели и месяцы без огромного архива. Разберём установку, конфигурацию, ротацию и восстановление.
Как работают жёсткие ссылки
При первом запуске rsnapshot копирует файлы в каталог снимка. При следующем — сравнивает состояние с предыдущим и создаёт жёсткие ссылки на неизменённые файлы, а изменённые копирует заново. Жёсткая ссылка — это второе имя того же файла на диске, поэтому место не удваивается.
Важное ограничение: все снимки должны находиться на одной файловой системе. Если разнести каталоги по разным разделам, жёсткие ссылки не сработают и копии начнут занимать полный объём. Также нельзя редактировать файлы внутри снимков — это изменит данные во всех ссылках.
Установка
Пакет есть в репозиториях Debian, Ubuntu, Fedora и EPEL для RHEL-совместимых систем. Вместе с ним ставится rsync. Для удалённых копий понадобится SSH-ключ без пароля и настроенный доступ.
sudo apt update
sudo apt install -y rsnapshot rsync
rsnapshot -V
man rsnapshot | head -40
Конфигурация
Основной файл — /etc/rsnapshot.conf. Сначала задайте корень снимков и интервал хранения. Затем перечислите, что копировать. Синтаксис чувствителен к табуляции: между параметром и значением должен быть символ табуляции, иначе утилита выдаст ошибку.
config_version 1.2
snapshot_root /srv/backup/
cmd_rsync /usr/bin/rsync
cmd_ssh /usr/bin/ssh
ssh_args -i /root/.ssh/backup_key
link_dest 1
sync_first 1
use_lazy_deletes 1
logfile /var/log/rsnapshot.log
lockfile /var/run/rsnapshot.pid
Директивы retain задают глубину истории. Имена hourly, daily, weekly, monthly — стандартные уровни; можно использовать свои, но они должны совпадать с аргументом при запуске.
retain hourly 6
retain daily 7
retain weekly 4
retain monthly 12
Теперь точки копирования. Локальный путь указывают от корня, удалённый — через SSH. Второй аргумент задаёт относительный путь внутри снимка.
backup /etc/ localhost/etc/
backup /home/ localhost/home/
backup /var/www/ localhost/www/
backup root@fileserver:/data/ fileserver/data/
Для удалённого сервера заранее проверьте вход по ключу и отсутствие запроса пароля:
ssh -i /root/.ssh/backup_key root@fileserver "test -d /data && echo ok"
Исключения и подготовка данных
Не копируйте псевдофайловые системы и кэши: /proc, /sys, /dev, /run, а также каталоги контейнеров и временные файлы. Исключения задаются директивой exclude, а шаблоны можно вынести в отдельный файл.
exclude /proc/*
exclude /sys/*
exclude /dev/*
exclude /var/cache/apt/*
exclude *.tmp
exclude /home/*/.cache/
Базы данных нельзя копировать на работающем сервере простым rsync: файлы могут быть в несогласованном состоянии. Сначала сделайте логический дамп в отдельный каталог, затем копируйте его обычной директивой backup. Дамп удобно готовить отдельным скриптом перед запуском rsnapshot.
pg_dump -U app app > /var/lib/dump/app.sql
# в конфиге rsnapshot:
backup /var/lib/dump/ localhost/dump/
Скрипт подготовки должен завершаться с ненулевым кодом при ошибке и не запускать rsnapshot, если дамп не создан. Проверьте это вручную перед постановкой в расписание.
Первый запуск и ротация
Сначала выполните пробный прогон: rsnapshot -t показывает команды без изменений. Затем запустите sync, если включён sync_first, и создайте первый снимок. При sync_first схема работы меняется: сначала обновляется промежуточный каталог .sync, потом из него строятся снимки.
rsnapshot -t hourly
rsnapshot sync
rsnapshot hourly
При ротации rsnapshot переименовывает каталоги: daily.0 становится daily.1, самый старый уровень удаляется. При sync_first в cron перед младшим интервалом добавляют отдельный sync, а остальные вызовы только ротируют каталоги.
0 */4 * * * root /usr/bin/rsnapshot sync && /usr/bin/rsnapshot hourly
30 2 * * * root /usr/bin/rsnapshot daily
0 3 * * 1 root /usr/bin/rsnapshot weekly
0 4 1 * * root /usr/bin/rsnapshot monthly
В системах с systemd можно использовать таймеры. Они удобнее для логирования и не зависят от почтового агента, но требуют отдельного unit-файла и проверки через systemctl list-timers.
Проверка и восстановление
Смотрите журнал после каждого запуска и проверяйте код возврата. Ошибка rsync не всегда останавливает весь процесс, поэтому одного «тихого» крона недостаточно. Полезны команды diff и du: первая показывает изменения между снимками, вторая — занятое место.
rsnapshot diff daily.0 daily.1
rsnapshot du
tail -n 50 /var/log/rsnapshot.log
Восстановление сводится к копированию файлов из нужного снимка. Не перемещайте и не редактируйте файлы внутри архива: скопируйте их в отдельный каталог и только потом работайте.
rsync -aH /srv/backup/daily.0/localhost/etc/ /tmp/restore/etc/
diff -r /etc /tmp/restore/etc | head -30
Проверьте, что каталог снимков не попадает в другие задания копирования. Обязательно проверяйте восстановление целиком, а не отдельный файл. Раз в квартал разверните копию на тестовом хосте и убедитесь, что сервисы запускаются с восстановленными конфигами.
Ограничения и типичные ошибки
- Разные файловые системы. Жёсткие ссылки работают только в пределах одного раздела.
- Изменение файлов в архиве. Ломает общую историю; архив должен быть только для чтения.
- Копирование баз на ходу. Приводит к битым дампам; нужен предварительный dump.
- Переполнение диска. Следите за местом и настройте оповещения.
- Отсутствие проверки. Копия без теста восстановления не считается резервной.
Для шифрования архива используйте отдельный зашифрованный том или инструменты вроде restic и borg, если требования выше, чем даёт rsnapshot. Для защиты от шифровальщиков держите одну копию offline или на другом хосте.
Чек-лист
- Корень снимков на отдельном диске с запасом места.
- Табуляция в конфиге и проверка через rsnapshot -t.
- Исключены /proc, /sys, /dev и кэши.
- Базы данных выгружаются скриптом до копирования.
- Настроены cron или systemd-таймеры и контроль кода возврата.
- Проверено восстановление на тестовом стенде.
Итог
rsnapshot — простой и предсказуемый инструмент для файловых резервных копий. Он не заменяет систему управления бэкапами с дедупликацией и шифрованием, но отлично закрывает задачу «хранить историю версий без лишнего места». Главное — держать архив на одной файловой системе, готовить дампы баз заранее и регулярно проверять восстановление.