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Важно: при сетевой репликации убедитесь, что у приёмной стороны есть соответствующие права и достаточно места на пуле.
Мини-методология: регулярная инкрементальная репликация
- Создавайте регулярные снимки с меткой времени: datapool/docs@YYYYMMDD-HHMM.
- Первый обмен — полный: zfs send pool/dataset@base | zfs recv dest/prefix.
- Для последующих передач делайте инкременты: zfs send -i pool/dataset@previous pool/dataset@current | zfs recv dest/prefix.
- Сохраняйте и ротационно удаляйте старые снимки на приёмной стороне в соответствии с политикой хранения.
Пример команды для инкрементального отправления:
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.
- Откат к снимку корректно восстанавливает файлы.
- Клон создаётся и монтируется в ожидаемую точку.
- Репликация завершилась без ошибок и приёмный пул содержит ожидаемые файлы.
Тестовые сценарии
- Создать снимок, изменить файлы, откатиться — проверить содержимое.
- Создать снимок, клонировать, записать данные в клон — убедиться, что родительский снимок не изменился.
- Выполнить полный zfs send/recv локально — проверить размер и содержимое.
- Выполнить инкрементальную репликацию через 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, показанные выше.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента