Sanoid — набор утилит для ZFS, который превращает ручное создание снапшотов в понятную политику хранения. Один конфигурационный файл описывает, сколько часовых, дневных, недельных и месячных копий нужно сохранять для каждого набора данных. Второй инструмент, Syncoid, использует эти же снапшоты для инкрементальной репликации на другой диск или сервер. Они закрывают типовую задачу домашней лаборатории — регулярные точки восстановления.
Что дают Sanoid и Syncoid
Sanoid создаёт и удаляет снапшоты по политике, ориентируясь на имена вида autosnap_2026-11-05_12:00:01_hourly. Ручные снапшоты он не трогает. Syncoid передаёт данные через zfs send и zfs receive, умеет работать рекурсивно, сжимать поток и продолжать прерванную передачу. Оба инструмента написаны на Perl, распространяются под GPLv3 и не требуют собственной базы данных: всё состояние хранится в ZFS и конфигурации.
Установка и проверка
В Debian 13, Ubuntu 24.04 и новее пакет есть в штатных репозиториях. В Linux Mint 22 он также доступен, поскольку база — Ubuntu 24.04. Проверьте доступность пакета:
apt policy sanoid
sudo apt install sanoid
sanoid --version
systemctl list-timers 'sanoid*'
Пакет обычно приносит systemd-таймер с sanoid --cron. Интервал в разных сборках отличается, но таймер лишь будит программу, а решение принимает Sanoid по счётчикам. Если таймера нет, добавьте cron с TZ=UTC, чтобы переход на летнее время не сдвигал суточные снапшоты.
Политика хранения
Основной файл — /etc/sanoid/sanoid.conf. Файл sanoid.defaults.conf содержит шаблоны; редактировать его не нужно. Секция — это имя набора данных ZFS. Параметр use_template = production подключает готовый профиль, а строки ниже уточняют его. recursive = yes распространяет политику на дочерние наборы, process_children_only = yes исключает из обработки сам родительский набор. autosnap и autoprune включают создание и удаление копий.
Числа задают не глубину в днях, а количество последних снапшотов каждого типа. Если указать hourly = 24, останутся 24 последних часовых копии; daily = 14 — 14 последних суточных. Старые копии удаляются при autoprune = yes, но только по счётчикам и именам autosnap. Поэтому политику сначала проверяют в режиме симуляции.
[tank/data]
use_template = production
recursive = yes
process_children_only = yes
hourly = 24
daily = 14
weekly = 8
monthly = 12
yearly = 0
autosnap = yes
autoprune = yes
[tank/vm]
use_template = production
hourly = 48
daily = 30
weekly = 8
monthly = 6
Виртуальным машинам нужно больше часовых копий, архивам — месячные и годовые. Не копируйте профиль вслепую: у наборов данных разная скорость изменения и цена ошибки.
Первый запуск и таймер
Сначала прогоните конфигурацию без изменений. Ключ --readonly показывает, что Sanoid собирается сделать, но ничего не создаёт и не удаляет:
sudo sanoid --cron --readonly --verbose
sudo sanoid --cron --verbose
zfs list -t snapshot -o name,creation,used -s creation tank/data | tail -20
Если в выводе появились имена с суффиксами hourly и daily, а список снапшотов это подтверждает, включайте таймер. Команда systemctl enable --now sanoid.timer запускает расписание сразу. Проверяйте и журнал: journalctl -u sanoid.service --since today. Типичная ошибка — набор не указан в конфиге или находится под родителем без recursive: снапшоты не появляются, а ошибки может не быть.
Репликация через Syncoid
Syncoid запускается вручную или из таймера и сам находит общий снапшот на источнике и приёмнике. Первый запуск передаёт полный поток, последующие — только изменения. Направление задаётся порядком аргументов: источник слева, приёмник справа. Для отправки на удалённый сервер используется обычный SSH.
sudo syncoid --recursive --compress=zstd-fast \
tank/data backup@192.0.2.10:tank/data
sudo syncoid --recursive --compress=zstd-fast \
backup@192.0.2.10:tank/data tank/data
Первый пример отправляет данные на сервер, второй — забирает их с сервера. Ключ --compress=zstd-fast снижает нагрузку на сеть, но требует поддержки на обеих сторонах; без неё Syncoid продолжит без сжатия. --source-bwlimit=20m ограничивает полосу, чтобы репликация не забивала канал. --delete-target-snapshots удаляет на приёмнике снапшоты, которых нет на источнике: используйте его только когда приёмник действительно является точной копией, а не самостоятельным хранилищем.
Для репликации на несколько приёмников полезны --no-sync-snap и --create-bookmark: Syncoid перестаёт создавать временные снапшоты и оставляет закладку на последнюю успешно переданную точку. Это уменьшает мусор и позволяет продолжить передачу даже после удаления старого снапшота.
Автоматизация и мониторинг
Syncoid не поставляется с готовым таймером, поэтому расписание создают вручную. Юнит запускается от root, если не настроены отдельные ключи и делегирование прав; для выделенного пользователя настройте zfs allow и добавьте --no-privilege-elevation.
[Unit]
Description=Syncoid replication
After=network-online.target
Wants=network-online.target
[Service]
Type=oneshot
ExecStart=/usr/sbin/syncoid --recursive --compress=zstd-fast tank/data backup@192.0.2.10:tank/data
[Install]
WantedBy=multi-user.target
Таймер с Persistent=true догонит пропущенный запуск после выключения сервера, а RandomizedDelaySec разведёт несколько задач по времени. После включения проверьте systemctl list-timers и первый успешный запуск в журнале. Для мониторинга Sanoid отдаёт состояние снапшотов и пула: sanoid --monitor-snapshots, --monitor-health и --monitor-capacity. Команды возвращают код, по которому мониторинг поймёт, всё ли в порядке.
Восстановление удобнее делать через клон, а не через немедленный откат: клон не разрушает текущее состояние и позволяет сравнить файлы. Команда zfs clone tank/data@autosnap_2026-11-05_12:00:01_daily tank/restore создаёт доступную копию. Полный откат zfs rollback -r уничтожает более новые снапшоты, поэтому перед ним снимают свежую копию.
Чек-лист внедрения
- Проверьте, что пул здоров:
zpool statusиzfs list. - Опишите в конфиге только нужные наборы данных и проверьте политику в
--readonly. - Убедитесь, что таймер включён, а журнал не содержит ошибок.
- Настройте отдельный SSH-ключ для репликации и ограничьте доступ приёмника.
- Проверьте восстановление из клона, а не только наличие снапшотов.
- Добавьте мониторинг свободного места: снапшоты занимают место и могут заполнить пул.
Итог
Sanoid и Syncoid дают ZFS то, чего ему не хватает из коробки: понятную политику хранения и регулярную репликацию. Начните с одного набора данных, проверьте конфигурацию в режиме симуляции, затем включите таймер и только после этого добавляйте удалённую копию. Главное правило — не считать снапшот резервной копией, пока вы не проверили восстановление. Регулярная учебная проверка клона занимает минуты, но именно она отличает работающую схему от набора красивых команд.