- [Работа с пулом ZFS #{.anchor}](#работа-с-пулом-zfs-anchor)
- [Работа с файловой и другими системами ZFS #{.anchor}](#работа-с-файловой-и-другими-системами-zfs-anchor)
- [Файловая система #{.anchor}](#файловая-система-anchor)
- [Snapshots (снепшоты или снимки состояния) #{.anchor}](#snapshots-снепшоты-или-снимки-состояния-anchor)
- [Снова вернемся к пулам #{.anchor}](#снова-вернемся-к-пулам-anchor)
Данный справочник является переводом [данной статьи](http://lildude.co.uk/zfs-cheatsheet). Авторы перевода: [Евгений Ратников](http://citkit.ru/articles/504/) и [Сгибнев Михаил](http://dreamcatcher.ru/). Огромное им спасибо за проделанную работу!
Не забывайте про страницы справки по командам работы с ZFS.
Если нужно получить статистику по операциям ввода/вывода пулов,
выполняем команду.
``` {tabindex="0"}
zpool iostat 5
capacity operations bandwidth
pool used avail read write read write
---------- ----- ----- ----- ----- ----- -----
myzfs 112K 95.4M 0 4 26 11.4K
myzfs 112K 95.4M 0 0 0 0
myzfs 112K 95.4M 0 0 0 0
```
## Работа с файловой и другими системами ZFS [\#](#%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%b0-%d1%81-%d1%84%d0%b0%d0%b9%d0%bb%d0%be%d0%b2%d0%be%d0%b9-%d0%b8-%d0%b4%d1%80%d1%83%d0%b3%d0%b8%d0%bc%d0%b8-%d1%81%d0%b8%d1%81%d1%82%d0%b5%d0%bc%d0%b0%d0%bc%d0%b8-zfs){.anchor}
### Файловая система [\#](#%d1%84%d0%b0%d0%b9%d0%bb%d0%be%d0%b2%d0%b0%d1%8f-%d1%81%d0%b8%d1%81%d1%82%d0%b5%d0%bc%d0%b0){.anchor}
Создадим файловую систему в нашем пуле. Затем проверим автомонтирование
новой файловой системы.
``` {tabindex="0"}
zfs create myzfs/colin
df -h
Filesystem kbytes used avail capacity Mounted on
...
myzfs/colin 64M 18K 63M 1% /myzfs/colin
```
Получить список файловых систем ZFS можно следующей командой.
``` {tabindex="0"}
zfs list
NAME USED AVAIL REFER MOUNTPOINT
myzfs 139K 63.4M 19K /myzfs
myzfs/colin 18K 63.4M 18K /myzfs/colin
```
В данный момент в нашем пуле имеется одно зеркало, в которое входят два
диска: 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
```
Снепшот можно сделать и на удаленный ресурс (или другое место в