Малоизвестный, но чрезвычайно удобный способ работы со снапшотами в ZFS |
[исправить] |
Интересный способ работы со снапшотами ZFS без использования команд zfs, причем
метод можно использовать не только с локальной машины, но и с удаленной.
Работа локально.
Создаем временный ZFS пул для тестирования:
jmoekamp@opensolaris1:/testpool1# zpool create -f testpool1 /export/home/jmoekamp/test
Переходим в данную директорию и создаем небольшой файл для подтверждения
работоспособности снапшотов:
jmoekamp@opensolaris1:/# cd testpool1
jmoekamp@opensolaris1:/testpool1# touch testfile1
jmoekamp@opensolaris1:/testpool1# ls
testfile1
Для просмотра ранее созданных снапшотов можно использовать путь .zfs/snapshot
(снапшотов нет, директория пуста):
jmoekamp@opensolaris1:/testpool1# cd /testpool1/.zfs/snapshot
jmoekamp@opensolaris1:/testpool1/.zfs/snapshot#
Но самое интересное, что через манипуляцию файлами в директории .zfs можно
создавать, переименовывать и удалять снапшоты ! Без вызова zfs-команд, просто
манипулируя файлами.
Создадим в директории .zfs поддиректорию:
jmoekamp@opensolaris1:/testpool1/.zfs/snapshot# mkdir snapshot-21042010-1
jmoekamp@opensolaris1:/testpool1/.zfs/snapshot# zfs list -t snapshot | grep testpool1
testpool1@snapshot-21042010-1 0 - 22K -
Как видим, автоматически был создан новый снапшот файловой системы.
Проверить данный факт можно создав в основном дереве ZFS дополнительный файл:
jmoekamp@opensolaris1:/testpool1/.zfs/snapshot# ls -l /testpool1
total 1
-rw-r--r-- 1 root root 0 2010-04-21 17:42 testfile1
jmoekamp@opensolaris1:/testpool1/.zfs/snapshot# touch /testpool1/testfile2
jmoekamp@opensolaris1:/testpool1/.zfs/snapshot# ls -l /testpool1
total 1
-rw-r--r-- 1 root root 0 2010-04-21 17:42 testfile1
-rw-r--r-- 1 root root 0 2010-04-21 17:45 testfile2
jmoekamp@opensolaris1:/testpool1/.zfs/snapshot# cd snapshot-21042010-1/
jmoekamp@opensolaris1:/testpool1/.zfs/snapshot/snapshot-21042010-1# ls -l
total 1
-rw-r--r-- 1 root root 0 2010-04-21 17:42 testfile1
Переименуем директорию со снапшотом при помощи обычной команды mv, при этом
автоматически будет переименован и снапшот:
jmoekamp@opensolaris1:/testpool1/.zfs/snapshot# mv snapshot-21042010-1 snapshot-21042010-1.1
jmoekamp@opensolaris1:/testpool1/.zfs/snapshot# zfs list -t snapshot | grep testpool1
[email protected] 19K - 22K -
Создаем еще один снапшот:
jmoekamp@opensolaris1:/testpool1/.zfs/snapshot# mkdir snapshot-21042010-2
jmoekamp@opensolaris1:/testpool1/.zfs/snapshot# zfs list -t snapshot | grep testpool1
[email protected] 19K - 22K -
testpool1@snapshot-21042010-2 0 - 22K -
Как видно внутри уже два файла, в отличие от одного в первом примере.
Для удаления снапшота достаточно удалить связанную с ним директорию:
jmoekamp@opensolaris1:/testpool1/.zfs/snapshot# rmdir snapshot-21042010-1.1
jmoekamp@opensolaris1:/testpool1/.zfs/snapshot# ls -l
total 2
drwxr-xr-x 2 root root 4 2010-04-21 17:45 snapshot-21042010-2
jmoekamp@opensolaris1:/testpool1/.zfs/snapshot# zfs list -t snapshot | grep testpool1
testpool1@snapshot-21042010-2 18K - 22K -
Удаленное управление снапшотами
Для управления снапшотами с другой машины можно использовать ssh или NFS.
Экспортируем ZFS-раздел по NFS:
jmoekamp@opensolaris1:/testpool1/.zfs/snapshot# zfs set sharenfs=on testpool1
Монтируем данный NFS раздел с другой машины (в примере используем в качестве
имени хоста NFS-клиента hivemind):
jmoekamp@hivemind:~$ pfexec mount 192.168.2.123:/testpool1 /mnt
jmoekamp@hivemind:~$ cd /mnt
jmoekamp@hivemind:/mnt$ cd .zfs
jmoekamp@hivemind:/mnt/.zfs$ ls
shares snapshot
jmoekamp@hivemind:/mnt/.zfs$ cd snapshot
jmoekamp@hivemind:/mnt/.zfs/snapshot$ ls
snapshot-21042010-2
Как и в случае с локальной системой, манипуляции с поддиректориями в
директории .zfs в примонтированном NFS-разделе приводят к манипуляции со
снапшотами на другой машине.
Предварительно предоставляем пользователю jmoekamp право создавать,
переименовывать и удалять снапшоты на базовом сервере opensolaris1:
jmoekamp@opensolaris1:/testpool1/.zfs/snapshot# zfs allow -u jmoekamp create,destroy,mount,snapshot testpool1
Пробуем создать снапшот, примонтировав NFS под пользователем jmoekamp:
jmoekamp@hivemind:/mnt/.zfs/snapshot$ mkdir snapshot-remote-21042010
Проверяем:
jmoekamp@opensolaris1:/testpool1/.zfs/snapshot# zfs list -t snapshot | grep "testpool1"
testpool1@snapshot-21042010-2 18K - 22K -
testpool1@snapshot-remote-21042010 0 - 22K -
Пробуем переименовать:
jmoekamp@hivemind:/mnt/.zfs/snapshot$ mv snapshot-remote-21042010 snapshot-remote-21042010-2
Проверяем, что это не обман зрения и все действительно работает:
jmoekamp@opensolaris1:/testpool1/.zfs/snapshot# zfs list -t snapshot | grep "testpool1"
testpool1@snapshot-21042010-2 18K - 22K -
testpool1@snapshot-remote-21042010-2 0 - 22K -
Пробуем удалить снапшот:
jmoekamp@hivemind:/mnt/.zfs/snapshot$ rmdir snapshot-remote-21042010-2/
Проверяем на сервере:
jmoekamp@opensolaris1:/testpool1/.zfs/snapshot# zfs list -t snapshot | grep "testpool1"
testpool1@snapshot-21042010-2 18K - 22K -
|
|
|
|
Раздел: Корень / Администратору / Система / Диски и файлы / Файловые системы |
1.5, hhg (ok), 18:38, 29/04/2010 [ответить]
| +/– |
забавно. можно лозунг вывешивать: перед началом "революции" в проекте - создай директорию в бэкапе. и всё будет.
| |
1.7, iZEN (ok), 15:40, 11/10/2012 [ответить]
| +/– |
% zfs list -t snapshot -r roxy
NAME USED AVAIL REFER MOUNTPOINT
roxy/usr/local@201210101308 1K - 3,43G -
roxy/usr/local@201210110640 1K - 3,43G -
roxy/var/db/pkg@201210091936 17,8M - 123M -
roxy/var/db/pkg@201210100746 17,8M - 123M -
roxy/var/db/pkg@201210101308 17,8M - 123M -
roxy/var/db/pkg@201210110640 17,8M - 123M -
% rm -rf /var/db/pkg/.zfs/snapshot/*
...
rm: /var/db/pkg/.zfs/snapshot/201210110640/xmlto-0.0.25/+DESC: Read-only file system
rm: /var/db/pkg/.zfs/snapshot/201210110640/xmlto-0.0.25/+MTREE_DIRS: Read-only file system
rm: /var/db/pkg/.zfs/snapshot/201210110640/xmlto-0.0.25/+CONTENTS: Read-only file system
rm: /var/db/pkg/.zfs/snapshot/201210110640/xmlto-0.0.25/+COMMENT: Read-only file system
rm: /var/db/pkg/.zfs/snapshot/201210110640/xmlto-0.0.25: Read-only file system
rm: /var/db/pkg/.zfs/snapshot/201210110640: Operation not supported
| |
|