Автоматические снапшоты ZFS без боли

14 апреля 2026 · 6 мин чтения

Долгое время я делал снапшоты 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, и откат на любую точку одной командой. Для домашнего файлового сервера более чем достаточно.

← К записям