ZFS снапшоты: создание, именование и автоматизация по расписанию | AdminWiki

ZFS снапшоты: создание, именование и автоматизация по расписанию

07 сентября 2026 5 мин. чтения

Что такое ZFS-снапшот и зачем он нужен

ZFS-снапшот - это мгновенная, доступная только для чтения копия файловой системы или тома. Создание снапшота занимает доли секунды и не требует дополнительного места благодаря механизму copy-on-write. При изменении данных ZFS сохраняет только изменённые блоки, поэтому снапшоты эффективно используют пространство.

Снапшоты решают типовые задачи: защита от случайного удаления файлов, откат после неудачного обновления ПО, создание точек восстановления перед рискованными операциями. В отличие от полного резервного копирования, снапшоты локальны и не защищают от выхода из строя всего пула, но обеспечивают быстрое восстановление на уровне датасета.

Практическое применение снапшотов описано в обзоре возможностей ZFS, а стратегии резервного копирования с их использованием - в руководстве по TrueNAS.

Создание снапшотов вручную: команда zfs snapshot

Базовая команда для создания снапшота:

zfs snapshot <dataset>@<snapname>

Например, для датасета tank/data и снапшота backup-2025-01-01:

zfs snapshot tank/data@backup-2025-01-01

Снапшот создаётся мгновенно. Имя снапшота должно быть уникальным в пределах датасета. Используйте понятные имена, отражающие назначение и время.

Синтаксис и основные опции

Полный синтаксис команды:

zfs snapshot [-r] [-o property=value] <dataset>@<snapname>

Опции:

  • -r - рекурсивно создать снапшоты для всех дочерних датасетов.
  • -o property=value - установить свойство для создаваемого снапшота (например, -o readonly=on).

Пример рекурсивного создания снапшота для всего пула:

zfs snapshot -r tank@before-upgrade

Создание снапшота с дополнительным свойством:

zfs snapshot -o zfs:type=manual tank/data@manual-2025-01-01

Примеры для типовых сценариев

Перед обновлением системы или приложения:

zfs snapshot -r tank@before-upgrade-$(date +%Y%m%d)

Ежедневный снапшот с автоматической меткой времени:

zfs snapshot tank/data@daily-$(date +%Y%m%d)

Снапшот всего пула с рекурсией:

zfs snapshot -r tank@full-$(date +%Y%m%d-%H%M%S)

Правила именования снапшотов

Единая схема именования упрощает автоматизацию, поиск и управление жизненным циклом. Рекомендуемый формат:

<dataset>@<type>-<YYYY-MM-DD>-<HH:MM>

Где type - тип снапшота: manual, hourly, daily, weekly, monthly.

Рекомендуемые шаблоны имен

Примеры хороших имён:

  • tank/data@daily-2025-01-01-00:00
  • tank/data@hourly-2025-01-01-14:30
  • tank/data@manual-before-upgrade-2025-01-01

Плохие имена: snap1, backup, test - они не несут информации о времени и назначении.

Использование меток времени и префиксов

Для автоматической генерации имён используйте команду date:

zfs snapshot tank/data@daily-$(date +%Y-%m-%d-%H%M%S)

Префиксы (manual-, auto-, hourly-, daily-) позволяют быстро фильтровать снапшоты по типу. Например, список всех ежедневных снапшотов:

zfs list -t snapshot -o name | grep 'daily-'

Автоматизация создания снапшотов по расписанию

Регулярное создание снапшотов защищает данные без ручного вмешательства. Рассмотрим два подхода: cron и systemd timers.

Настройка cron для периодических снапшотов

Добавьте строки в crontab (crontab -e):

# Ежечасный снапшот
0 * * * * /sbin/zfs snapshot tank/data@hourly-$(date +\%Y-\%m-\%d-\%H)
# Ежедневный снапшот в 00:00
0 0 * * * /sbin/zfs snapshot tank/data@daily-$(date +\%Y-\%m-\%d)
# Еженедельный снапшот в воскресенье в 00:00
0 0 * * 0 /sbin/zfs snapshot tank/data@weekly-$(date +\%Y-\%m-\%d)

Обратите внимание на экранирование символа % в cron - он должен быть записан как \%.

Использование systemd timers

Systemd timers предоставляют более гибкое управление и логирование. Создайте service unit /etc/systemd/system/zfs-snapshot@.service:

[Unit]
Description=ZFS snapshot for %i
After=local-fs.target

[Service]
Type=oneshot
ExecStart=/sbin/zfs snapshot tank/data@%i-$(date +%%Y-%%m-%%d-%%H%%M%%S)

Затем timer unit /etc/systemd/system/zfs-snapshot-hourly.timer:

[Unit]
Description=Hourly ZFS snapshot

[Timer]
OnCalendar=hourly
Persistent=true

[Install]
WantedBy=timers.target

Активируйте таймер:

systemctl enable --now zfs-snapshot-hourly.timer

Преимущества systemd timers: точное планирование, автоматический запуск пропущенных задач при Persistent=true, интеграция с journald.

Управление хранением и удаление устаревших снапшотов

Без политики хранения количество снапшотов растёт и занимает место. Определите сроки хранения для каждого типа.

Определение политики хранения

Типовая политика:

  • Ежечасные снапшоты - хранить 24 часа (24 штуки).
  • Ежедневные - хранить 7 дней (7 штук).
  • Еженедельные - хранить 4 недели (4 штуки).
  • Ежемесячные - хранить 12 месяцев (12 штук).

Учитывайте объём изменяемых данных и доступное место. Например, при изменении 10 ГБ в день и хранении 7 ежедневных снапшотов потребуется до 70 ГБ дополнительного пространства.

Автоматическое удаление старых снапшотов

Удаление конкретного снапшота:

zfs destroy tank/data@daily-2025-01-01

Автоматическая ротация с помощью скрипта. Пример для хранения последних 7 ежедневных снапшотов:

#!/bin/bash
# Удалить все ежедневные снапшоты, кроме 7 последних
zfs list -H -o name -t snapshot | grep 'tank/data@daily-' | sort | head -n -7 | xargs -r -n 1 zfs destroy

Проверяйте список перед удалением. Ошибка в фильтре может привести к потере нужных снапшотов.

Просмотр и мониторинг снапшотов

Список всех снапшотов:

zfs list -t snapshot

Снапшоты конкретного датасета:

zfs list -t snapshot -r tank/data

Детальная информация о снапшоте:

zfs get all tank/data@daily-2025-01-01

Занимаемое место:

zfs list -r -t snapshot -o name,used,referenced tank/data

Поля: USED - место, занимаемое снапшотом, REFER - объём данных, на который ссылается снапшот. Регулярный мониторинг помогает вовремя заметить аномальный рост.

Восстановление данных из снапшота

Для восстановления используйте zfs rollback или клонирование.

Откат к предыдущему состоянию

Полный откат датасета к состоянию снапшота:

zfs rollback tank/data@daily-2025-01-01

Все изменения после снапшота будут потеряны. Если после снапшота были созданы другие снапшоты, потребуется опция -r для их удаления:

zfs rollback -r tank/data@daily-2025-01-01

Клонирование снапшота для извлечения файлов

Клонирование создаёт доступную для записи копию снапшота без изменения исходного датасета:

zfs clone tank/data@daily-2025-01-01 tank/data-restore

Затем смонтируйте клон и скопируйте нужные файлы:

mount -t zfs tank/data-restore /mnt/restore
cp /mnt/restore/path/to/file /original/location/

После восстановления удалите клон:

zfs destroy tank/data-restore

Подробнее о восстановлении отдельных файлов без отката всего датасета читайте в отдельном руководстве.

Влияние снапшотов на производительность и место

Снапшоты используют copy-on-write: при создании они не занимают места, но по мере изменения данных в датасете растут. Например, если после снапшота изменить 5 ГБ данных, снапшот займёт 5 ГБ для хранения старых версий блоков.

Большое количество снапшотов (сотни и тысячи) может замедлить операции zfs list и другие команды, так как ZFS перебирает все снапшоты. Для большинства сценариев десятки снапшотов не оказывают заметного влияния на производительность.

Контролируйте место с помощью zfs list -o space и своевременно удаляйте ненужные снапшоты.

Лучшие практики и типовые ошибки

Рекомендации:

  • Всегда тестируйте восстановление из снапшота на тестовом датасете.
  • Используйте единые правила именования с метками времени.
  • Автоматизируйте создание и удаление снапшотов.
  • Настройте мониторинг свободного места и количества снапшотов.
  • Храните снапшоты не дольше необходимого срока.

Типовые ошибки:

  • Создание снапшотов без политики хранения - приводит к переполнению пула.
  • Игнорирование мониторинга места - неожиданное исчерпание диска.
  • Неправильное экранирование % в cron - команда не выполняется.
  • Использование неинформативных имён - сложно найти нужный снапшот.

Для комплексной стратегии резервного копирования с репликацией снапшотов изучите руководство по репликации ZFS.

Поделиться:
Сохранить гайд? В закладки браузера