Что такое 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:00tank/data@hourly-2025-01-01-14:30tank/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.