Автоматические снапшоты ZFS без боли
Долгое время я делал снапшоты ZFS обычным cron-скриптом. Работало, но с двумя проблемами: невнятное логирование и неудобная чистка старых снапшотов. В итоге переехал на systemd-таймеры и небольшую обёртку, и стало заметно спокойнее.
Базовая идея — отдельный таймер на каждую периодичность (час, день, неделя), каждый создаёт снапшот со своим префиксом. Чистку повесил туда же, чтобы не плодить сущности.
Создание снапшота с меткой времени выглядит так:
zfs snapshot -r tank/data@auto-hourly-$(date +%Y%m%d-%H%M)
Юнит таймера простой — запускаем сервис раз в час:
[Unit]
Description=Hourly ZFS snapshot
[Timer]
OnCalendar=hourly
Persistent=true
[Install]
WantedBy=timers.target
Чистку старых снапшотов удобно делать по дате в имени, а не по реальному времени создания — так предсказуемее. Я храню 24 часовых, 7 дневных и 4 недельных. Грабли, на которые наступил: Persistent=true важен, иначе после простоя машины таймер не отрабатывает пропущенный запуск, и в истории появляются дыры.
Ещё один момент — рекурсивный флаг -r. Если датасетов много, снапшот всего пула разом может быть тяжеловат; в итоге я снапшочу только то, что реально меняется, а не корень целиком.
Итог: меньше скриптов, внятные логи через journalctl, и откат на любую точку одной командой. Для домашнего файлового сервера более чем достаточно.