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 то, чего ему не хватает из коробки: понятную политику хранения и регулярную репликацию. Начните с одного набора данных, проверьте конфигурацию в режиме симуляции, затем включите таймер и только после этого добавляйте удалённую копию. Главное правило — не считать снапшот резервной копией, пока вы не проверили восстановление. Регулярная учебная проверка клона занимает минуты, но именно она отличает работающую схему от набора красивых команд.

Насколько публикация полезна?

Нажмите на звезду, чтобы оценить!

Средняя оценка 0 / 5. Количество оценок: 0

Оценок пока нет. Поставьте оценку первым.

Поделиться: Telegram ВКонтакте