- [Snapshots (снепшоты или снимки состояния) #{.anchor}](#snapshots-снепшоты-или-снимки-состояния-anchor)
- [Снова вернемся к пулам #{.anchor}](#снова-вернемся-к-пулам-anchor)
Данный справочник является переводом [данной статьи](http://lildude.co.uk/zfs-cheatsheet). Авторы перевода: [Евгений Ратников](http://citkit.ru/articles/504/) и [Сгибнев Михаил](http://dreamcatcher.ru/). Огромное им спасибо за проделанную работу!
Не забывайте про страницы справки по командам работы с ZFS.
Так как включить в пул (zpool) можно любые сущности файловой системы, автор приводит примеры построения пулов и работы с ними с использованием простых файлов. Итак, создадим несколько файлов, с которыми будем работать подобно дискам.
Мы создали 5 «виртуальных дисков». Четыре имеют размер по 1000 Мб, а один - 500 Мб. Это пригодится для демонстрации работы с устройствами (разделами) разной ёмкости.
Попробуем снова создать пул типа `MIRROR` (зеркало), но на этот раз попытаемся включить в него диски разного размера. Zpool не даст нам этого сделать. Чтобы безоговорочно создать такой пул, используйте опцию `-f`, но в этом случае помните --- размер зеркала будет равен объему наименьшего диска.
Создать зеркалируемое (*MIRROR*) хранилище можно на двух и более устройствах. Сколько устройств в пуле типа `MIRROR` --- столько у нас есть одинаковых копий данных.
Вместо зеркалирования можно использовать массивы `RAID`. Для этого необходимо создавать пул типа `raidz` вместо `mirror`. Подробнее <https://docs.freebsd.org/en/books/handbook/zfs/>.
А что будет, если попытаемся *удалить*, а не исключить устройство из пула? Zpool сообщит нам о том, что устройство не может быть удалено. Для начала его нужно отключить.
Теперь попробуем отключить один из дисков. Пока диск отключен, на него не будет производиться запись и с него не будет производиться чтение. Если использовать параметр `-t`, то при перезагрузке сервера диск вернется в состояние онлайн автоматически.
В данный момент в нашем пуле два диска: disk1 и disk2. Также в системе имеется дискdisk3, но он не подключен к пулу. Предположим, что disk1 вышел из строя и его нужно заменить на disk3.
Периодически для исправления ошибок необходимо выполнять процедуру чистки (scrubbing) для пулов типа *MIRROR* или *RAID-Z*. Данная процедура находит ошибки в контрольных суммах и исправляет их. Также восстанавливаются сбойные блоки.
Если ключ `-d` не указать, то команда ищет `/dev/dsk`. Так как в данном примере мы используем файлы, необходимо указать директорию с файлами используемыми хранилищем.
Обновление версии пула. Показать версию используемого пула. Флаг `-v` показывает возможности, поддерживаемые данным пулом. Используйте флаг `-a`, чтобы обновить все доступные пулы до новейшей из них версии. Обновленные пулы больше не будут доступны из систем, на которых работают более старые версии.
Enhanced dataset functionality, used by other features.
embedded_data
Blocks which compress very well use even less space.
bookmarks (read-only compatible)
"zfs bookmark" command
filesystem_limits (read-only compatible)
Filesystem and snapshot limits.
large_blocks
Support for blocks larger than 128KB.
large_dnode
Variable on-disk size of dnodes.
sha512
SHA-512/256 hash algorithm.
skein
Skein hash algorithm.
edonr
Edon-R hash algorithm.
userobj_accounting (read-only compatible)
User/Group object accounting.
encryption
Support for dataset level encryption
project_quota (read-only compatible)
space/object accounting based on project ID.
device_removal
Top-level vdevs can be removed, reducing logical pool size.
obsolete_counts (read-only compatible)
Reduce memory used by removed devices when their blocks are freed or remapped.
zpool_checkpoint (read-only compatible)
Pool state can be checkpointed, allowing rewind later.
spacemap_v2 (read-only compatible)
Space maps representing large segments are more efficient.
allocation_classes (read-only compatible)
Support for separate allocation classes.
resilver_defer (read-only compatible)
Support for deferring new resilvers when one is already running.
bookmark_v2
Support for larger bookmarks
redaction_bookmarks
Support for bookmarks which store redaction lists for zfs redacted send/recv.
redacted_datasets
Support for redacted datasets, produced by receiving a redacted zfs send stream.
bookmark_written
Additional accounting, enabling the written#<bookmark> property(space written since a bookmark), and estimates of send stream sizes for incrementals from bookmarks.
log_spacemap (read-only compatible)
Log metaslab changes on a single spacemap and flush them periodically.
livelist (read-only compatible)
Improved clone deletion performance.
device_rebuild (read-only compatible)
Support for sequential mirror/dRAID device rebuilds
В данный момент в нашем пуле имеется одно зеркало, в которое входят два
диска: disc2 и disc3.
Давайте попробуем расширить наш пул. Попытаемся добавить к нему disc1
``` {tabindex="0"}
zpool add myzfs /disk1
invalid vdev specification
use '-f' to override the following errors:
mismatched replication level: pool uses mirror and new vdev is file
```
Попытка добавления не удалась, т.к. она неоднозначно и при добавлении
диска к существующему зеркалу необходимо указать дополнительно один из
существующих в этом зеркале дисков, либо добавить минимум два диска для
формирования нового зеркала, которое будет входить в данный пул.
Добавим к пулу новое зеркало, состоящее из дисков: disc1 и disc5
``` {tabindex="0"}
zpool add myzfs mirror /disk1 /disk5
zpool status -v
pool: myzfs
state: ONLINE
scrub: none requested
config:
NAME STATE READ WRITE CKSUM
myzfs ONLINE 0 0 0
mirror ONLINE 0 0 0
/disk3 ONLINE 0 0 0
/disk2 ONLINE 0 0 0
mirror ONLINE 0 0 0
/disk1 ONLINE 0 0 0
/disk5 ONLINE 0 0 0
errors: No known data errors
```
Добавим теперь к пулу еще одну файловую систему и посмотрим, как это
отразится на размере файловых систем, входящих в пул.
``` {tabindex="0"}
zfs create myzfs/colin2
zfs list
NAME USED AVAIL REFER MOUNTPOINT
myzfs 172K 159M 21K /myzfs
myzfs/colin 18K 159M 18K /myzfs/colin
myzfs/colin2 18K 159M 18K /myzfs/colin2
```
Обе файловые системы, входящие в пул, по объему равны всему пулу. В этом
заключается одно из преимуществ системы ZFS --- по умолчанию нет
никакого ограничения на файловые системы.
Чтобы явно управлять объемом файловых систем, можно прибегнуть к
резервированию --- выделению гарантированного объема для файловой
системы, либо квотированию --- ограничению файловой системы по
максимальному объему.
Давайте зарезервируем для файловой системы `/myzfs/colin` место в пуле,
равное 20 Мб. Остальные файловые системы, заполняя пул, в любом случае
оставят для этой файловой системы 20 Мб места.
``` {tabindex="0"}
zfs set reservation=20m myzfs/colin
zfs list -o reservation
RESERV
none
20M
none
```
Теперь для файловой системы `/myzfs/colin2` установим квоту в 20 Мб. Это
означает, что данная файловая система не сможет занять в пуле более 20
Мб, даже если пул будет полностью свободным.
``` {tabindex="0"}
zfs set quota=20m myzfs/colin2
zfs list -o quota myzfs/colin myzfs/colin2
QUOTA
none
20M
```
Также для файловой системы `/myzfs/colin2` включим сжатие. Сжатие
достаточно эффективно работает на уровне ZFS практически без потерь
производительности (конечно же, при условии, что производительности
сервера достаточно). Вместо `compression=on` можно использовать
`compression=gzip`.
``` {tabindex="0"}
zfs set compression=on myzfs/colin2
zfs list -o compression
COMPRESS
off
off
on
```
Чтобы сделать файловую систему доступной по протоколу NFS, достаточно
выполнить одну команду. Причем после перезагрузки сервера доступ к
файловой системе утерян не будет. Никаких дополнительных настроек
операционной системы производить не нужно.
``` {tabindex="0"}
zfs set sharenfs=on myzfs/colin2
zfs get sharenfs myzfs/colin2
NAME PROPERTY VALUE SOURCE
myzfs/colin2 sharenfs on local
```
Точно так же в одну команду ресурс можно сделать доступным по протоколу
SMB. Что пользователям ОС Windows наверняка пригодится.
``` {tabindex="0"}
zfs set sharesmb=on myzfs/colin2
zfs get sharesmb myzfs/colin2
NAME PROPERTY VALUE SOURCE
myzfs/colin2 sharesmb on local
```
Для повышения надежности (если у вас обычный пул, без избыточности),
можно использовать следующую опцию файловой системы.
``` {tabindex="0"}
zfs set copies=2 myzfs/colin2
```
Теперь в файловой системе будет храниться по две копии каждого блока.
Это имеет смысл, если пул без избыточности (*mirror* / *raidz*).
### Snapshots (снепшоты или снимки состояния) [\#](#snapshots-%d1%81%d0%bd%d0%b5%d0%bf%d1%88%d0%be%d1%82%d1%8b-%d0%b8%d0%bb%d0%b8-%d1%81%d0%bd%d0%b8%d0%bc%d0%ba%d0%b8-%d1%81%d0%be%d1%81%d1%82%d0%be%d1%8f%d0%bd%d0%b8%d1%8f){.anchor}
Создать снепшот файловой системы очень просто. Давайте создадим снепшот
для файловой системы `myzfs/colin` и назовем его*test*.
``` {tabindex="0"}
zfs snapshot myzfs/colin@test
zfs list
NAME USED AVAIL REFER MOUNTPOINT
myzfs 20.2M 139M 21K /myzfs
myzfs/colin 18K 159M 18K /myzfs/colin
myzfs/colin@test 0 - 18K -
myzfs/colin2 18K 20.0M 18K /myzfs/colin2
```
Если появится необходимость отката к снепшоту, достаточно выполнить одну
команду.
``` {tabindex="0"}
zfs rollback myzfs/colin@test
```
Снэпшот можно подмониторовать, как обычно. Например так.
``` {tabindex="0"}
mount -t zfs myzfs/colin@test /mnt
```
Даже можно клонировать файловую системы из снепшота в новую файловую
систему.
``` {tabindex="0"}
zfs clone myzfs/colin@test myzfs/colin3
zfs list
NAME USED AVAIL REFER MOUNTPOINT
myzfs 20.2M 139M 21K /myzfs
myzfs/colin 18K 159M 18K /myzfs/colin
myzfs/colin@test 0 - 18K -
myzfs/colin2 18K 20.0M 18K /myzfs/colin2
myzfs/colin3 0 139M 18K /myzfs/colin3
```
Теперь давайте удалим наши файловые системы `/myzfs/colin` и
`/myzfs/colin2`
Сперва удалим пустую файловую систему `/myzfs/colin2`
``` {tabindex="0"}
zfs destroy myzfs/colin2
zfs list
NAME USED AVAIL REFER MOUNTPOINT
myzfs 20.1M 139M 22K /myzfs
myzfs/colin 18K 159M 18K /myzfs/colin
myzfs/colin@test 0 - 18K -
myzfs/colin3 0 139M 18K /myzfs/colin3
```
Файловая система удалилась без проблем. Теперь удалим файловую систему,
для которой существует снепшот.
``` {tabindex="0"}
zfs destroy myzfs/colin
cannot destroy 'myzfs/colin': filesystem has children
use '-r' to destroy the following datasets:
myzfs/colin@test
```
Удаление невозможно, т.к. у файловой системы имеется дочерний объект.
Можно воспользоваться параметром `-r` чтобы удалить файловую систему
вместе со всеми дочерними объектами рекурсивно.
Мы можем отключить снепшот от `/myzfs/colin` и оставить его дочерним
только для `/myzfs/colin3`
``` {tabindex="0"}
zfs promote myzfs/colin3
zfs list
NAME USED AVAIL REFER MOUNTPOINT
myzfs 20.1M 139M 21K /myzfs
myzfs/colin 0 159M 18K /myzfs/colin
myzfs/colin3 18K 139M 18K /myzfs/colin3
myzfs/colin3@test 0 - 18K -
zfs destroy myzfs/colin
zfs list
NAME USED AVAIL REFER MOUNTPOINT
myzfs 147K 159M 21K /myzfs
myzfs/colin3 18K 159M 18K /myzfs/colin3
myzfs/colin3@test 0 - 18K -
```
Теперь сделанный ранее снепшот для `/myzfs/colin` стал дочерним
объектом `/myzfs/colin3`. Таким образом у файловой
системы `/myzfs/colin` больше нет дочерних объектов и ее можно без труда
разобрать (удалить).
Если вдруг понадобиться переименовать ранее созданную файловую систему
или снепшот, то можно воспользоваться следующими командами.
``` {tabindex="0"}
zfs rename myzfs/colin3 myzfs/bob
zfs list
NAME USED AVAIL REFER MOUNTPOINT
myzfs 153K 159M 21K /myzfs
myzfs/bob 18K 159M 18K /myzfs/bob
myzfs/bob@test 0 - 18K -
zfs rename myzfs/bob@test myzfs/bob@newtest
zfs list
NAME USED AVAIL REFER MOUNTPOINT
myzfs 146K 159M 20K /myzfs
myzfs/bob 18K 159M 18K /myzfs/bob
myzfs/bob@newtest 0 - 18K -
```
### Снова вернемся к пулам [\#](#%d1%81%d0%bd%d0%be%d0%b2%d0%b0-%d0%b2%d0%b5%d1%80%d0%bd%d0%b5%d0%bc%d1%81%d1%8f-%d0%ba-%d0%bf%d1%83%d0%bb%d0%b0%d0%bc){.anchor}
Получить полную информацию о пулах можно следующим образом.
``` {tabindex="0"}
zfs get all
NAME PROPERTY VALUE SOURCE
myzfs type filesystem -
myzfs creation Tue Sep 11 14:21 2007 -
myzfs used 146K -
myzfs available 159M -
myzfs referenced 20K -
[...]
```
Если пул нам более не нужен, можем его удалить. Однако, нельзя удалить
пул, в котором имеются активные файловые системы.
``` {tabindex="0"}
zpool destroy myzfs
cannot destroy 'myzfs': pool is not empty
use '-f' to force destruction anyway
```
Чтобы принудительно удалить пул, используйте параметр `-f` (не
выполняйте это сейчас. Пул нам еще понадобится далее)
``` {tabindex="0"}
zpool destroy -f myzfs
zpool status -v
no pools available
```
Отключить файловую систему от пула можно следующим образом.
``` {tabindex="0"}
zfs unmount myzfs/bob
df -h
myzfs 159M 20K 159M 1% /myzfs
```
Подключить файловую систему к пулу вот так.
``` {tabindex="0"}
zfs mount myzfs/bob
df -h
myzfs 159M 20K 159M 1% /myzfs
myzfs/bob 159M 18K 159M 1% /myzfs/bob
```
Снепшот можно сделать и на удаленный ресурс (или другое место в