master
Долгий Артём 2024-04-04 12:49:08 +03:00
parent add41635c5
commit 432c089d55
1 changed files with 183 additions and 201 deletions

View File

@ -4,8 +4,8 @@
- [Работа с пулом ZFS](#работа-с-пулом-zfs)
- [Работа с файловой и другими системами ZFS](#работа-с-файловой-и-другими-системами-zfs)
- [Файловая система](#файловая-система)
- [Snapshots (снепшоты или снимки состояния) #{.anchor}](#snapshots-снепшоты-или-снимки-состояния-anchor)
- [Снова вернемся к пулам #{.anchor}](#снова-вернемся-к-пулам-anchor)
- [Snapshots (снапшоты или снимки состояния)](#snapshots-снапшоты-или-снимки-состояния)
- [Снова вернемся к пулам](#снова-вернемся-к-пулам)
Данный справочник является переводом [данной статьи](http://lildude.co.uk/zfs-cheatsheet). Авторы перевода: [Евгений Ратников](http://citkit.ru/articles/504/) и [Сгибнев Михаил](http://dreamcatcher.ru/). Огромное им спасибо за проделанную работу!
@ -445,12 +445,10 @@ myzfs 135K 960M 0 0 0 0
```bash
[root@zfs /]# zfs create myzfs/colin
[root@zfs /]# df -Th
Файловая система Тип Размер Использовано Дост Использовано% Cмонтировано в
...
[root@zfs ~]# df -Th | grep zfs
myzfs zfs 832M 128K 832M 1% /myzfs
myzfs/colin zfs 832M 128K 832M 1% /myzfs/colin
[root@zfs /]#
[root@zfs ~]#
```
Получить список файловых систем ZFS можно следующей командой.
@ -463,103 +461,99 @@ myzfs/colin 24K 832M 24K /myzfs/colin
[root@zfs /]#
```
В данный момент в нашем пуле имеется одно зеркало, в которое входят два
диска: disc2 и disc3.
В данный момент в нашем пуле имеется одно зеркало, в которое входят два диска: disk2 и disk3.
Давайте попробуем расширить наш пул. Попытаемся добавить к нему disc1
``` {tabindex="0"}
zpool add myzfs /disk1
Давайте попробуем расширить наш пул. Попытаемся добавить к нему disk1
```bash
[root@zfs ~]# 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
[root@zfs ~]#
```
Попытка добавления не удалась, т.к. она неоднозначно и при добавлении
диска к существующему зеркалу необходимо указать дополнительно один из
существующих в этом зеркале дисков, либо добавить минимум два диска для
формирования нового зеркала, которое будет входить в данный пул.
Попытка добавления не удалась, т.к. она неоднозначна и при добавлении диска к существующему зеркалу необходимо указать дополнительно один из
существующих в этом зеркале дисков, либо добавить минимум два диска для формирования нового зеркала, которое будет входить в данный пул.
Добавим к пулу новое зеркало, состоящее из дисков: disc1 и disc5
``` {tabindex="0"}
zpool add myzfs mirror /disk1 /disk5
zpool status -v
Добавим к пулу новое зеркало, состоящее из дисков: disk1 и disk5
```bash
[root@zfs ~]# zpool add myzfs mirror /disk1 /disk5
[root@zfs ~]# zpool status
pool: myzfs
state: ONLINE
scrub: none requested
scan: scrub repaired 0B in 00:00:00 with 0 errors on Wed Apr 3 16:27:35 2024
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
mirror-0 ONLINE 0 0 0
//disk3 ONLINE 0 0 0
//disk2 ONLINE 0 0 0
mirror-1 ONLINE 0 0 0
/disk1 ONLINE 0 0 0
/disk5 ONLINE 0 0 0
errors: No known data errors
[root@zfs ~]#
```
Добавим теперь к пулу еще одну файловую систему и посмотрим, как это
отразится на размере файловых систем, входящих в пул.
Добавим теперь к пулу еще одну файловую систему и посмотрим, как это отразится на размере файловых систем, входящих в пул.
``` {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
```bash
[root@zfs ~]# zfs create myzfs/colin2
[root@zfs ~]# zfs list
NAME USED AVAIL REFER MOUNTPOINT
myzfs 216K 1.75G 24K /myzfs
myzfs/colin 24K 1.75G 24K /myzfs/colin
myzfs/colin2 24K 1.75G 24K /myzfs/colin2
[root@zfs ~]#
```
Обе файловые системы, входящие в пул, по объему равны всему пулу. В этом
заключается одно из преимуществ системы ZFS --- по умолчанию нет
никакого ограничения на файловые системы.
Обе файловые системы, входящие в пул, по объему равны всему пулу. В этом заключается одно из преимуществ системы ZFS --- по-умолчанию нет никакого ограничения на файловые системы.
Чтобы явно управлять объемом файловых систем, можно прибегнуть к
резервированию --- выделению гарантированного объема для файловой
системы, либо квотированию --- ограничению файловой системы по
максимальному объему.
Чтобы явно управлять объемом файловых систем, можно прибегнуть к резервированию --- выделению гарантированного объема для файловой системы, либо квотированию --- ограничению файловой системы по максимальному объему.
Давайте зарезервируем для файловой системы `/myzfs/colin` место в пуле,
равное 20 Мб. Остальные файловые системы, заполняя пул, в любом случае
оставят для этой файловой системы 20 Мб места.
``` {tabindex="0"}
zfs set reservation=20m myzfs/colin
zfs list -o reservation
Давайте зарезервируем для файловой системы `/myzfs/colin` место в пуле, равное 200 Мб. Остальные файловые системы, заполняя пул, в любом случае
оставят для этой файловой системы 200 Мб места.
```bash
[root@zfs ~]# zfs set reservation=200m myzfs/colin
[root@zfs ~]# zfs list -o reservation
RESERV
none
20M
200M
none
[root@zfs ~]#
```
Теперь для файловой системы `/myzfs/colin2` установим квоту в 20 Мб. Это
означает, что данная файловая система не сможет занять в пуле более 20
Теперь для файловой системы `/myzfs/colin2` установим квоту в 250 Мб. Это означает, что данная файловая система не сможет занять в пуле более 250
Мб, даже если пул будет полностью свободным.
``` {tabindex="0"}
zfs set quota=20m myzfs/colin2
zfs list -o quota myzfs/colin myzfs/colin2
```bash
[root@zfs ~]# zfs set quota=250m myzfs/colin2
[root@zfs ~]# zfs list -o quota myzfs/colin myzfs/colin2
QUOTA
none
20M
250M
[root@zfs ~]#
```
Также для файловой системы `/myzfs/colin2` включим сжатие. Сжатие
достаточно эффективно работает на уровне ZFS практически без потерь
производительности (конечно же, при условии, что производительности
сервера достаточно). Вместо `compression=on` можно использовать
`compression=gzip`.
Также для файловой системы `/myzfs/colin2` включим сжатие. Сжатие достаточно эффективно работает на уровне ZFS практически без потерь производительности (конечно же, при условии, что производительности сервера достаточно).
``` {tabindex="0"}
ZFS использует несколько различных алгоритмов сжатия, оптимизированных для различных типов данных:
- **LZ4** Алгоритм по-умолчанию, использующий сжатие LZ4. Предпочтение отдается скорости, а не степени сжатия.
- **LZJB** Устаревший формат с приемлемым сжатием и скоростью.
- **Gzip** Стандартное сжатие gzip. Несколько уровней сжатия от 1 до 9, чем выше, тем лучше, но медленнее.
- **ZLE** оптимизирован для нулевых блоков.
Алгоритмы адаптивно выбирают оптимальную стратегию сжатия для каждого типа данных.
При этом, вместо `compression=on` можно явно указать алгоритм сжатия `compression=gzip-9`, `compression=lzjb`, `compression=zle` и т.д.
```bash
zfs set compression=on myzfs/colin2
zfs list -o compression
@ -569,188 +563,176 @@ COMPRESS
on
```
Чтобы сделать файловую систему доступной по протоколу NFS, достаточно
выполнить одну команду. Причем после перезагрузки сервера доступ к
файловой системе утерян не будет. Никаких дополнительных настроек
операционной системы производить не нужно.
Чтобы сделать файловую систему доступной по протоколу NFS, достаточно выполнить одну команду. Причем после перезагрузки сервера доступ к файловой системе утерян не будет. Никаких дополнительных настроек операционной системы производить не нужно.
``` {tabindex="0"}
zfs set sharenfs=on myzfs/colin2
zfs get sharenfs myzfs/colin2
NAME PROPERTY VALUE SOURCE
myzfs/colin2 sharenfs on local
```bash
[root@zfs ~]# zfs set sharenfs=on myzfs/colin2
[root@zfs ~]# zfs get sharenfs myzfs/colin2
NAME PROPERTY VALUE SOURCE
myzfs/colin2 sharenfs on local
[root@zfs ~]#
```
Точно так же в одну команду ресурс можно сделать доступным по протоколу
SMB. Что пользователям ОС Windows наверняка пригодится.
Точно так же в одну команду ресурс можно сделать доступным по протоколу SMB. Что пользователям ОС Windows наверняка пригодится. В системе должен быть установлен пакет `samba-usershares`.
``` {tabindex="0"}
zfs set sharesmb=on myzfs/colin2
zfs get sharesmb myzfs/colin2
NAME PROPERTY VALUE SOURCE
myzfs/colin2 sharesmb on local
```bash
[root@zfs ~]# zfs set sharesmb=on myzfs/colin2
[root@zfs ~]# zfs get sharesmb myzfs/colin2
NAME PROPERTY VALUE SOURCE
myzfs/colin2 sharesmb on local
[root@zfs ~]#
```
Для повышения надежности (если у вас обычный пул, без избыточности),
можно использовать следующую опцию файловой системы.
Для повышения надежности (если у вас обычный пул, без избыточности), можно использовать следующую опцию файловой системы.
``` {tabindex="0"}
zfs set copies=2 myzfs/colin2
```bash
[root@zfs ~]# zfs set copies=2 myzfs/colin2
[root@zfs ~]# zfs get copies myzfs/colin2
NAME PROPERTY VALUE SOURCE
myzfs/colin2 copies 2 local
[root@zfs ~]#
```
Теперь в файловой системе будет храниться по две копии каждого блока.
Это имеет смысл, если пул без избыточности (*mirror* / *raidz*).
Теперь в файловой системе будет храниться по две копии каждого блока. Это имеет смысл, если пул без избыточности (*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}
### Snapshots (снапшоты или снимки состояния)
Создать снепшот файловой системы очень просто. Давайте создадим снепшот
для файловой системы `myzfs/colin` и назовем его *test*.
Создать снапшот файловой системы очень просто. Давайте создадим снапшот для файловой системы `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
```bash
[root@zfs ~]# zfs snapshot myzfs/colin@test
[root@zfs ~]# zfs list -t snapshot
NAME USED AVAIL REFER MOUNTPOINT
myzfs/colin@test 0B - 24K -
[root@zfs ~]#
```
Если появится необходимость отката к снепшоту, достаточно выполнить одну
команду.
Если появится необходимость отката к снапшоту, достаточно выполнить одну команду.
``` {tabindex="0"}
zfs rollback myzfs/colin@test
```bash
[root@zfs ~]# zfs rollback myzfs/colin@test
```
Снэпшот можно подмониторовать, как обычно. Например так.
Снапшот можно подмониторовать, как обычно. Например так.
``` {tabindex="0"}
mount -t zfs myzfs/colin@test /mnt
```bash
[root@zfs ~]# mount -t zfs myzfs/colin@test /mnt
[root@zfs ~]#
[root@zfs ~]# mount | grep /mnt
myzfs/colin@test on /mnt type zfs (ro,relatime,xattr,noacl)
[root@zfs ~]#
[root@zfs ~]# umount /mnt
[root@zfs ~]#
```
Даже можно клонировать файловую системы из снепшота в новую файловую
систему.
Даже можно клонировать файловую системы из снапшота в новую файловую систему.
``` {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
```bash
[root@zfs ~]# zfs clone myzfs/colin@test myzfs/colin3
[root@zfs ~]# zfs list
NAME USED AVAIL REFER MOUNTPOINT
myzfs 200M 1.55G 25K /myzfs
myzfs/colin 24K 1.75G 24K /myzfs/colin
myzfs/colin2 24K 250M 24K /myzfs/colin2
myzfs/colin3 0B 1.55G 24K /myzfs/colin3
[root@zfs ~]#
```
Теперь давайте удалим наши файловые системы `/myzfs/colin` и
`/myzfs/colin2`
Теперь давайте удалим наши файловые системы `/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
```bash
[root@zfs ~]# zfs destroy myzfs/colin2
[root@zfs ~]# zfs list
NAME USED AVAIL REFER MOUNTPOINT
myzfs 200M 1.55G 25K /myzfs
myzfs/colin 24K 1.75G 24K /myzfs/colin
myzfs/colin3 0B 1.55G 24K /myzfs/colin3
[root@zfs ~]#
```
Файловая система удалилась без проблем. Теперь удалим файловую систему,
для которой существует снепшот.
``` {tabindex="0"}
zfs destroy myzfs/colin
Файловая система удалилась без проблем. Теперь удалим файловую систему, для которой существует снапшот.
```bash
[root@zfs ~]# zfs destroy myzfs/colin
cannot destroy 'myzfs/colin': filesystem has children
use '-r' to destroy the following datasets:
myzfs/colin@test
[root@zfs ~]#
```
Удаление невозможно, т.к. у файловой системы имеется дочерний объект.
Можно воспользоваться параметром `-r` чтобы удалить файловую систему
Удаление невозможно, т.к. у файловой системы имеется дочерний объект. Можно воспользоваться параметром `-r` чтобы удалить файловую систему
вместе со всеми дочерними объектами рекурсивно.
Мы можем отключить снепшот от `/myzfs/colin` и оставить его дочерним
только для `/myzfs/colin3`
Мы можем отключить снапшот от `/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 -
```bash
[root@zfs ~]# zfs list -t snapshot
NAME USED AVAIL REFER MOUNTPOINT
myzfs/colin@test 0B - 24K -
[root@zfs ~]#
[root@zfs ~]# zfs promote myzfs/colin3
[root@zfs ~]# zfs list -t snapshot
NAME USED AVAIL REFER MOUNTPOINT
myzfs/colin3@test 0B - 24K -
[root@zfs ~]#
[root@zfs ~]# zfs destroy myzfs/colin
[root@zfs ~]# zfs list
NAME USED AVAIL REFER MOUNTPOINT
myzfs 264K 1.75G 24K /myzfs
myzfs/colin3 24K 1.75G 24K /myzfs/colin3
[root@zfs ~]#
[root@zfs ~]# zfs list -t snapshot
NAME USED AVAIL REFER MOUNTPOINT
myzfs/colin3@test 0B - 24K -
[root@zfs ~]#
```
Теперь сделанный ранее снепшот для `/myzfs/colin` стал дочерним
объектом `/myzfs/colin3`. Таким образом у файловой
системы `/myzfs/colin` больше нет дочерних объектов и ее можно без труда
разобрать (удалить).
Теперь сделанный ранее снапшот для `/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 -
```bash
[root@zfs ~]# zfs rename myzfs/colin3 myzfs/bob
[root@zfs ~]# zfs list
NAME USED AVAIL REFER MOUNTPOINT
myzfs 270K 1.75G 25K /myzfs
myzfs/bob 24K 1.75G 24K /myzfs/bob
[root@zfs ~]#
[root@zfs ~]# zfs rename myzfs/bob@test myzfs/bob@newtest
[root@zfs ~]#
[root@zfs ~]# zfs list -t snapshot
NAME USED AVAIL REFER MOUNTPOINT
myzfs/bob@newtest 0B - 24K -
[root@zfs ~]#
```
### Снова вернемся к пулам [\#](#%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 -
```bash
[root@zfs ~]# zfs get all
NAME PROPERTY VALUE SOURCE
myzfs type filesystem -
myzfs creation Ср апр 3 16:15 2024 -
myzfs used 270K -
myzfs available 1.75G -
myzfs referenced 25K -
myzfs compressratio 1.00x -
[...]
```
Если пул нам более не нужен, можем его удалить. Однако, нельзя удалить
пул, в котором имеются активные файловые системы.
Если пул нам более не нужен, можем его удалить. **(не выполняйте это сейчас. Пул нам еще понадобится далее)**
``` {tabindex="0"}
zpool destroy myzfs
cannot destroy 'myzfs': pool is not empty
use '-f' to force destruction anyway
```bash
[root@zfs ~]# zpool destroy myzfs
[root@zfs ~]# zfs list
no datasets available
[root@zfs ~]# zpool status
no pools available
[root@zfs ~]#
```
Чтобы принудительно удалить пул, используйте параметр `-f` (не
@ -782,7 +764,7 @@ myzfs 159M 20K 159M 1% /myzfs
myzfs/bob 159M 18K 159M 1% /myzfs/bob
```
Снепшот можно сделать и на удаленный ресурс (или другое место в
снапшот можно сделать и на удаленный ресурс (или другое место в
локальной системе).
``` {tabindex="0"}
@ -797,9 +779,9 @@ myzfs/bob 18K 159M 18K /myzfs/bob
myzfs/bob@newtest 0 - 18K -
```
В данном случае снепшот передан `zfs receive` на локальном узле (в
В данном случае снапшот передан `zfs receive` на локальном узле (в
демонстрационных целях). В реальной ситуации таким образом можно сделать
снепшот на другой узел сети.
снапшот на другой узел сети.
Zpool ведет собственную историю всех команд. Посмотреть историю можно
следующим образом.
@ -861,5 +843,5 @@ Disqus.](https://disqus.com/?ref_noscript)
- [Работа с пулом ZFS](#работа-с-пулом-zfs)
- [Работа с файловой и другими системами ZFS](#работа-с-файловой-и-другими-системами-zfs)
- [Файловая система](#файловая-система)
- [Snapshots (снепшоты или снимки состояния) #{.anchor}](#snapshots-снепшоты-или-снимки-состояния-anchor)
- [Снова вернемся к пулам #{.anchor}](#снова-вернемся-к-пулам-anchor)
- [Snapshots (снапшоты или снимки состояния)](#snapshots-снапшоты-или-снимки-состояния)
- [Снова вернемся к пулам](#снова-вернемся-к-пулам)