Гид по технологиям

ZFS: снимки, клоны и репликация

6 min read Системное администрирование Обновлено 27 Nov 2025
ZFS: снимки, клоны и репликация
ZFS: снимки, клоны и репликация

Ключевые варианты поиска по теме

  • ZFS снимки и откат
  • ZFS клоны и зависимые снимки
  • ZFS репликация через SSH
  • zfs send receive примеры

Обзор снимков ZFS

Снимок — одна из ключевых возможностей ZFS. Это только для чтения точка времени (point-in-time) файловой системы или тома. Сам по себе снимок почти не потребляет пространства в пуле: он начинает занимать место только тогда, когда блоки, на которые он ссылается, изменяются в основном наборе данных. Проще говоря: снимок хранит только различия между текущим состоянием и состоянием на момент создания снимка.

Когда использовать снимок

  • Быстрый бэкап перед установкой ПО или обновлением системы.
  • Возможность откатить изменения после ошибочной операции.
  • Исторические точки для отладки и аудита.

Важно: снимки — только для чтения. Для записи используйте клон, созданный из снимка.

Создание и удаление снимка ZFS

Снимки томов напрямую не монтируются, но из них можно создавать клоны, отправлять их на бэкап или откатывать к ним файловую систему. Команды для работы: zfs snapshot и zfs destroy.

Создадим пул datapool.

# zpool create datapool mirror /dev/sdb /dev/sdc   
# zpool list  
NAME       SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT  
datapool  1.98G    65K  1.98G         -     0%     0%  1.00x  ONLINE  -

Создадим файловую систему для демонстрации:

# zfs create datapool/docs -o mountpoint=/docs  
# zfs list -r datapool  
NAME            USED  AVAIL  REFER  MOUNTPOINT  
datapool       93.5K  1.92G    19K  /datapool  
datapool/docs    19K  1.92G    19K  /docs

Создать снимок можно так (опция -r — рекурсивная):

# zfs snapshot datapool/docs@version1  
# zfs list -t snapshot  
NAME                     USED  AVAIL  REFER  MOUNTPOINT  
datapool/docs@version1      0      -  19.5K  -

Чтобы удалить снимок, используйте zfs destroy:

# zfs destroy datapool/docs@version1  
# zfs list -t snapshot  
no datasets available

Откат к снимку

Для демонстрации создадим файл в /docs:

# echo "version 1" > /docs/data.txt  
# cat /docs/data.txt  
version 1

Создадим снимок и изменим файл:

# zfs snapshot datapool/docs@version1  
# zfs list -t snapshot  
NAME                     USED  AVAIL  REFER  MOUNTPOINT  
datapool/docs@version1     9K      -  19.5K  -
# echo "version 2" > /docs/data.txt  
# cat /docs/data.txt  
version 2

Откат возвращает файловую систему в состояние на момент снимка:

# zfs list -t snapshot  
NAME                     USED  AVAIL  REFER  MOUNTPOINT  
datapool/docs@version1  9.50K      -  19.5K  -  
# zfs rollback datapool/docs@version1  
# cat /docs/data.txt  
version 1

Переименование снимка:

# zfs rename datapool/docs@version1 datapool/docs@version2  
# zfs list -t snapshot  
NAME                     USED  AVAIL  REFER  MOUNTPOINT  
datapool/docs@version2  9.50K      -  19.5K  -

Важно: датасет нельзя разрушить, если у него есть снимки. Опция -r разрушит рекурсивно вместе со снимками.

# zfs destroy datapool/docs  
cannot destroy 'datapool/docs': filesystem has children  
use '-r' to destroy the following datasets:  
datapool/docs@version2
# zfs destroy -r datapool/docs  
# zfs list -t snapshot  
no datasets available

Обзор клонов ZFS

Клон — это записываемая файловая система или том, чьё начальное содержимое равно содержимому снимка исходного датасета. Клон создаётся только из снимка, и пока клону нужен снимок-родитель, этот снимок нельзя удалить.

Создание и удаление клона ZFS

Пример создания файловой системы и папок для клонирования:

# zfs create datapool/docs -o mountpoint=/docs  
# zfs list -r datapool  
NAME            USED  AVAIL  REFER  MOUNTPOINT  
datapool       93.5K  1.92G    19K  /datapool  
datapool/docs    19K  1.92G    19K  /docs
# mkdir /docs/folder{1..5}  
# ls /docs/  
folder1  folder2  folder3  folder4  folder5

Создаём снимок и клонируем его:

# zfs snapshot datapool/docs@today  
# zfs list -t snapshot  
NAME                  USED  AVAIL  REFER  MOUNTPOINT  
datapool/docs@today      0      -    19K  -
# zfs clone datapool/docs@today datapool/pict  
# zfs list  
NAME            USED  AVAIL  REFER  MOUNTPOINT  
datapool        166K  1.92G    19K  /datapool  
datapool/docs    19K  1.92G    19K  /docs  
datapool/pict     1K  1.92G    19K  /datapool/pict

Проверьте содержимое клона:

# ls /datapool/pict  
folder1  folder2  folder3  folder4  folder5

Попытка удалить снимок, от которого зависит клон, приведёт к ошибке:

# zfs destroy datapool/docs@today  
cannot destroy 'datapool/docs@today': snapshot has dependent clones  
use '-R' to destroy the following datasets:  
datapool/pict

Сначала удалите клoн, затем снимок:

# zfs destroy datapool/pict
# zfs destroy datapool/docs@today  
# zfs list -t snapshot  
no datasets available

Обзор репликации ZFS

Репликация базируется на снимках. Вы создаёте снимок, сериализуете его в поток и восстанавливаете на другом пуле или машине. Команды: zfs send и zfs receive. Передача может идти напрямую в файл, по SSH или через другие каналы.

Настройка репликации ZFS на примере локального и удалённого пула

Мы будем реплицировать datapool -> backuppool. Можно также отправлять снимки по сети на другую машину.

Создадим пул backuppool:

# zpool create backuppool mirror sde sdf  
# zpool list  
NAME         SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT  
backuppool  1.98G    50K  1.98G         -     0%     0%  1.00x  ONLINE  -  
datapool    1.98G   568K  1.98G         -     0%     0%  1.00x  ONLINE  -

Проверка статуса pools:

# zpool status  
  pool: datapool  
 state: ONLINE  
  scan: none requested  
config:  
  
        NAME        STATE     READ WRITE CKSUM  
        datapool    ONLINE       0     0     0  
          mirror-0  ONLINE       0     0     0  
            sdb     ONLINE       0     0     0  
            sdc     ONLINE       0     0     0  
  
errors: No known data errors

(вывод backuppool аналогичен)

Создаём снимок и реплицируем его на backuppool:

# zfs snapshot datapool/docs@today  
# zfs list -t snapshot  
NAME                  USED  AVAIL  REFER  MOUNTPOINT  
datapool/docs@today      0      -    19K  -  
# ls /docs/  
folder1  folder2  folder3  folder4  folder5

Репликация:

# zfs send datapool/docs@today | zfs receive backuppool/backup  
# zfs list  
NAME                USED  AVAIL  REFER  MOUNTPOINT  
backuppool           83K  1.92G    19K  /backuppool  
backuppool/backup    19K  1.92G    19K  /backuppool/backup  
datapool            527K  1.92G    19K  /datapool  
datapool/docs        19K  1.92G    19K  /docs

Проверяем содержимое:

# ls /backuppool/backup  
folder1  folder2  folder3  folder4  folder5

Для репликации на удалённый хост используйте SSH:

# zfs send datapool/docs@today | ssh otherserver zfs recv backuppool/backup

Важно: при сетевой репликации убедитесь, что у приёмной стороны есть соответствующие права и достаточно места на пуле.

Мини-методология: регулярная инкрементальная репликация

  1. Создавайте регулярные снимки с меткой времени: datapool/docs@YYYYMMDD-HHMM.
  2. Первый обмен — полный: zfs send pool/dataset@base | zfs recv dest/prefix.
  3. Для последующих передач делайте инкременты: zfs send -i pool/dataset@previous pool/dataset@current | zfs recv dest/prefix.
  4. Сохраняйте и ротационно удаляйте старые снимки на приёмной стороне в соответствии с политикой хранения.

Пример команды для инкрементального отправления:

zfs send -i datapool/docs@20250101-0000 datapool/docs@20250101-0600 | ssh backup zfs recv backuppool/backup

Контрольные списки по ролям

Чек-лист для администратора системы:

  • Проверить состояние пулов: zpool status.
  • Убедиться в наличии свободного места на приёмном пуле.
  • Создать снимок с понятным именем.
  • Проверить, что ssh-ключи настроены для безпарольной передачи (если репликация по сети).
  • Настроить cron/systemd timer для автоматических снимков и репликации.

Чек-лист для инженера DevOps:

  • Автоматизировать создание снимков и отправку через CI/CD или cron.
  • Реализовать мониторинг успешности zfs send/recv и алерты.
  • План ротации снимков и удаление старых инкрементов.

Критерии приёмки

  • Снимок создан и виден в zfs list -t snapshot.
  • Откат к снимку корректно восстанавливает файлы.
  • Клон создаётся и монтируется в ожидаемую точку.
  • Репликация завершилась без ошибок и приёмный пул содержит ожидаемые файлы.

Тестовые сценарии

  1. Создать снимок, изменить файлы, откатиться — проверить содержимое.
  2. Создать снимок, клонировать, записать данные в клон — убедиться, что родительский снимок не изменился.
  3. Выполнить полный zfs send/recv локально — проверить размер и содержимое.
  4. Выполнить инкрементальную репликацию через SSH — проверить, что только дельта передана.

Когда это не подходит и альтернативы

Когда ZFS-снимки и репликация могут оказаться неудобны:

  • Нужна дедупликация на уровне файлов в пользовательском пространстве или гибкая дедупликация между разными файловыми системами — рассмотрите rsync, borgbackup, restic.
  • Если платформа не поддерживает ZFS нативно (например, некоторые дистрибутивы или облачные тома), используйте инструменты уровня блоков или файлов.

Альтернативные подходы:

  • rsync — хорошо подходит для гибкой синхронизации и фильтрации файлов.
  • LVM snapshots — для систем, где ZFS недоступен.
  • Бэкапы приложений с точки зрения уровня данных (например, баз данных с dump/restore).

Ментальные модели и эвристики

  • Снимок = дешёвая точка времени. Создание мгновенно, хранит только изменения.
  • Клон = записываемая ветка снимка. Пока клон существует, родительский снимок нельзя удалить.
  • Репликация = сериализация снимков + передача потоков. Первый раз — полный дамп, далее — инкременты.

Безопасность и рекомендации по сети

  • Используйте защищённый канал (ssh) для передачи снимков между машинами.
  • Применяйте ключи SSH с ограничением команд и с минимальными привилегиями.
  • Проверяйте права и владельцев на приёмной стороне после восстановления.
  • Шифрование: если данные чувствительны, используйте шифрование на уровне ZFS (если поддерживается) или тоннелируйте через защищённую сеть.

Важно: не держите приватные ключи без пароля на машинах без физической защиты.

Глоссарий в одну строку

  • Снимок (snapshot): только для чтения точка времени файловой системы.
  • Клон (clone): записываемая файловая система, созданная из снимка.
  • Репликация (replication): передача снимка на другой пул или машину через zfs send | zfs receive.
  • Инкрементальная отправка: команда zfs send -i позволяет передавать только изменения между двумя снимками.

Быстрая шпаргалка команд

  • Создать снимок: zfs snapshot pool/dataset@snapname
  • Список снимков: zfs list -t snapshot
  • Удалить снимок: zfs destroy pool/dataset@snapname
  • Создать клон: zfs clone pool/dataset@snapname pool/newdataset
  • Отправить снимок локально: zfs send pool/dataset@snapname | zfs receive targetpool/target
  • Отправить через SSH: zfs send pool/dataset@snapname | ssh host zfs recv targetpool/target
  • Инкремент: zfs send -i pool/ds@old pool/ds@new | zfs receive targetpool/target

Пример потока принятия решения

flowchart TD
  A[Есть необходимость в точках восстановления?] -->|Да| B[Использовать ZFS снимки]
  B --> C{Нужно ли писать в копию?}
  C -->|Да| D[Создать клон из снимка]
  C -->|Нет| E[Оставить снимок]
  B --> F{Нужно ли хранить на другом хосте?}
  F -->|Да| G[Настроить zfs send | ssh | zfs recv]
  F -->|Нет| H[Локальное хранение; план ротации}

Заключение

Снимки, клоны и репликация — базовые мощные инструменты ZFS для защиты данных, быстрого восстановления и синхронизации между пулами или серверами. Снимки дают дешёвые точки времени, клоны позволяют работать с копиями под запись, а zfs send/recv реализует надёжную репликацию. Планируйте политику создания снимков и ротации, автоматизируйте процессы и контролируйте безопасность канала репликации.

Итого:

  • Создавайте понятные имена снимков с датой/временем.
  • Используйте инкременты для экономии трафика и времени.
  • Автоматизируйте и мониторьте процесс репликации.

Источник команд и примеров: практические примеры zfs snapshot, zfs clone и zfs send/receive, показанные выше.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро