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)
- [Работа с файловой и другими системами ZFS](#работа-с-файловой-и-другими-системами-zfs) - [Работа с файловой и другими системами ZFS](#работа-с-файловой-и-другими-системами-zfs)
- [Файловая система](#файловая-система) - [Файловая система](#файловая-система)
- [Snapshots (снепшоты или снимки состояния) #{.anchor}](#snapshots-снепшоты-или-снимки-состояния-anchor) - [Snapshots (снапшоты или снимки состояния)](#snapshots-снапшоты-или-снимки-состояния)
- [Снова вернемся к пулам #{.anchor}](#снова-вернемся-к-пулам-anchor) - [Снова вернемся к пулам](#снова-вернемся-к-пулам)
Данный справочник является переводом [данной статьи](http://lildude.co.uk/zfs-cheatsheet). Авторы перевода: [Евгений Ратников](http://citkit.ru/articles/504/) и [Сгибнев Михаил](http://dreamcatcher.ru/). Огромное им спасибо за проделанную работу! Данный справочник является переводом [данной статьи](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 ```bash
[root@zfs /]# zfs create myzfs/colin [root@zfs /]# zfs create myzfs/colin
[root@zfs /]# df -Th [root@zfs ~]# df -Th | grep zfs
Файловая система Тип Размер Использовано Дост Использовано% Cмонтировано в
...
myzfs zfs 832M 128K 832M 1% /myzfs myzfs zfs 832M 128K 832M 1% /myzfs
myzfs/colin zfs 832M 128K 832M 1% /myzfs/colin myzfs/colin zfs 832M 128K 832M 1% /myzfs/colin
[root@zfs /]# [root@zfs ~]#
``` ```
Получить список файловых систем ZFS можно следующей командой. Получить список файловых систем ZFS можно следующей командой.
@ -463,103 +461,99 @@ myzfs/colin 24K 832M 24K /myzfs/colin
[root@zfs /]# [root@zfs /]#
``` ```
В данный момент в нашем пуле имеется одно зеркало, в которое входят два В данный момент в нашем пуле имеется одно зеркало, в которое входят два диска: disk2 и disk3.
диска: disc2 и disc3.
Давайте попробуем расширить наш пул. Попытаемся добавить к нему disc1 Давайте попробуем расширить наш пул. Попытаемся добавить к нему disk1
``` {tabindex="0"}
zpool add myzfs /disk1
```bash
[root@zfs ~]# zpool add myzfs /disk1
invalid vdev specification invalid vdev specification
use '-f' to override the following errors: use '-f' to override the following errors:
mismatched replication level: pool uses mirror and new vdev is file mismatched replication level: pool uses mirror and new vdev is file
[root@zfs ~]#
``` ```
Попытка добавления не удалась, т.к. она неоднозначно и при добавлении Попытка добавления не удалась, т.к. она неоднозначна и при добавлении диска к существующему зеркалу необходимо указать дополнительно один из
диска к существующему зеркалу необходимо указать дополнительно один из существующих в этом зеркале дисков, либо добавить минимум два диска для формирования нового зеркала, которое будет входить в данный пул.
существующих в этом зеркале дисков, либо добавить минимум два диска для
формирования нового зеркала, которое будет входить в данный пул.
Добавим к пулу новое зеркало, состоящее из дисков: disc1 и disc5 Добавим к пулу новое зеркало, состоящее из дисков: disk1 и disk5
``` {tabindex="0"}
zpool add myzfs mirror /disk1 /disk5
zpool status -v
```bash
[root@zfs ~]# zpool add myzfs mirror /disk1 /disk5
[root@zfs ~]# zpool status
pool: myzfs pool: myzfs
state: ONLINE 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: config:
NAME STATE READ WRITE CKSUM NAME STATE READ WRITE CKSUM
myzfs ONLINE 0 0 0 myzfs ONLINE 0 0 0
mirror ONLINE 0 0 0 mirror-0 ONLINE 0 0 0
/disk3 ONLINE 0 0 0 //disk3 ONLINE 0 0 0
/disk2 ONLINE 0 0 0 //disk2 ONLINE 0 0 0
mirror ONLINE 0 0 0 mirror-1 ONLINE 0 0 0
/disk1 ONLINE 0 0 0 /disk1 ONLINE 0 0 0
/disk5 ONLINE 0 0 0 /disk5 ONLINE 0 0 0
errors: No known data errors errors: No known data errors
[root@zfs ~]#
``` ```
Добавим теперь к пулу еще одну файловую систему и посмотрим, как это Добавим теперь к пулу еще одну файловую систему и посмотрим, как это отразится на размере файловых систем, входящих в пул.
отразится на размере файловых систем, входящих в пул.
``` {tabindex="0"} ```bash
zfs create myzfs/colin2 [root@zfs ~]# zfs create myzfs/colin2
zfs list [root@zfs ~]# zfs list
NAME USED AVAIL REFER MOUNTPOINT
NAME USED AVAIL REFER MOUNTPOINT myzfs 216K 1.75G 24K /myzfs
myzfs 172K 159M 21K /myzfs myzfs/colin 24K 1.75G 24K /myzfs/colin
myzfs/colin 18K 159M 18K /myzfs/colin myzfs/colin2 24K 1.75G 24K /myzfs/colin2
myzfs/colin2 18K 159M 18K /myzfs/colin2 [root@zfs ~]#
``` ```
Обе файловые системы, входящие в пул, по объему равны всему пулу. В этом Обе файловые системы, входящие в пул, по объему равны всему пулу. В этом заключается одно из преимуществ системы ZFS --- по-умолчанию нет никакого ограничения на файловые системы.
заключается одно из преимуществ системы ZFS --- по умолчанию нет
никакого ограничения на файловые системы.
Чтобы явно управлять объемом файловых систем, можно прибегнуть к Чтобы явно управлять объемом файловых систем, можно прибегнуть к резервированию --- выделению гарантированного объема для файловой системы, либо квотированию --- ограничению файловой системы по максимальному объему.
резервированию --- выделению гарантированного объема для файловой
системы, либо квотированию --- ограничению файловой системы по
максимальному объему.
Давайте зарезервируем для файловой системы `/myzfs/colin` место в пуле, Давайте зарезервируем для файловой системы `/myzfs/colin` место в пуле, равное 200 Мб. Остальные файловые системы, заполняя пул, в любом случае
равное 20 Мб. Остальные файловые системы, заполняя пул, в любом случае оставят для этой файловой системы 200 Мб места.
оставят для этой файловой системы 20 Мб места.
``` {tabindex="0"}
zfs set reservation=20m myzfs/colin
zfs list -o reservation
```bash
[root@zfs ~]# zfs set reservation=200m myzfs/colin
[root@zfs ~]# zfs list -o reservation
RESERV RESERV
none none
20M 200M
none none
[root@zfs ~]#
``` ```
Теперь для файловой системы `/myzfs/colin2` установим квоту в 20 Мб. Это Теперь для файловой системы `/myzfs/colin2` установим квоту в 250 Мб. Это означает, что данная файловая система не сможет занять в пуле более 250
означает, что данная файловая система не сможет занять в пуле более 20
Мб, даже если пул будет полностью свободным. Мб, даже если пул будет полностью свободным.
``` {tabindex="0"} ```bash
zfs set quota=20m myzfs/colin2 [root@zfs ~]# zfs set quota=250m myzfs/colin2
zfs list -o quota myzfs/colin myzfs/colin2 [root@zfs ~]# zfs list -o quota myzfs/colin myzfs/colin2
QUOTA QUOTA
none none
20M 250M
[root@zfs ~]#
``` ```
Также для файловой системы `/myzfs/colin2` включим сжатие. Сжатие Также для файловой системы `/myzfs/colin2` включим сжатие. Сжатие достаточно эффективно работает на уровне ZFS практически без потерь производительности (конечно же, при условии, что производительности сервера достаточно).
достаточно эффективно работает на уровне ZFS практически без потерь
производительности (конечно же, при условии, что производительности
сервера достаточно). Вместо `compression=on` можно использовать
`compression=gzip`.
``` {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 set compression=on myzfs/colin2
zfs list -o compression zfs list -o compression
@ -569,188 +563,176 @@ COMPRESS
on on
``` ```
Чтобы сделать файловую систему доступной по протоколу NFS, достаточно Чтобы сделать файловую систему доступной по протоколу NFS, достаточно выполнить одну команду. Причем после перезагрузки сервера доступ к файловой системе утерян не будет. Никаких дополнительных настроек операционной системы производить не нужно.
выполнить одну команду. Причем после перезагрузки сервера доступ к
файловой системе утерян не будет. Никаких дополнительных настроек
операционной системы производить не нужно.
``` {tabindex="0"} ```bash
zfs set sharenfs=on myzfs/colin2 [root@zfs ~]# zfs set sharenfs=on myzfs/colin2
zfs get sharenfs myzfs/colin2 [root@zfs ~]# zfs get sharenfs myzfs/colin2
NAME PROPERTY VALUE SOURCE
NAME PROPERTY VALUE SOURCE myzfs/colin2 sharenfs on local
myzfs/colin2 sharenfs on local [root@zfs ~]#
``` ```
Точно так же в одну команду ресурс можно сделать доступным по протоколу Точно так же в одну команду ресурс можно сделать доступным по протоколу SMB. Что пользователям ОС Windows наверняка пригодится. В системе должен быть установлен пакет `samba-usershares`.
SMB. Что пользователям ОС Windows наверняка пригодится.
``` {tabindex="0"} ```bash
zfs set sharesmb=on myzfs/colin2 [root@zfs ~]# zfs set sharesmb=on myzfs/colin2
zfs get sharesmb myzfs/colin2 [root@zfs ~]# zfs get sharesmb myzfs/colin2
NAME PROPERTY VALUE SOURCE
NAME PROPERTY VALUE SOURCE myzfs/colin2 sharesmb on local
myzfs/colin2 sharesmb on local [root@zfs ~]#
``` ```
Для повышения надежности (если у вас обычный пул, без избыточности), Для повышения надежности (если у вас обычный пул, без избыточности), можно использовать следующую опцию файловой системы.
можно использовать следующую опцию файловой системы.
``` {tabindex="0"} ```bash
zfs set copies=2 myzfs/colin2 [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"} ```bash
zfs snapshot myzfs/colin@test [root@zfs ~]# zfs snapshot myzfs/colin@test
zfs list [root@zfs ~]# zfs list -t snapshot
NAME USED AVAIL REFER MOUNTPOINT
NAME USED AVAIL REFER MOUNTPOINT myzfs/colin@test 0B - 24K -
myzfs 20.2M 139M 21K /myzfs [root@zfs ~]#
myzfs/colin 18K 159M 18K /myzfs/colin
myzfs/colin@test 0 - 18K -
myzfs/colin2 18K 20.0M 18K /myzfs/colin2
``` ```
Если появится необходимость отката к снепшоту, достаточно выполнить одну Если появится необходимость отката к снапшоту, достаточно выполнить одну команду.
команду.
``` {tabindex="0"} ```bash
zfs rollback myzfs/colin@test [root@zfs ~]# zfs rollback myzfs/colin@test
``` ```
Снэпшот можно подмониторовать, как обычно. Например так. Снапшот можно подмониторовать, как обычно. Например так.
``` {tabindex="0"} ```bash
mount -t zfs myzfs/colin@test /mnt [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"} ```bash
zfs clone myzfs/colin@test myzfs/colin3 [root@zfs ~]# zfs clone myzfs/colin@test myzfs/colin3
zfs list [root@zfs ~]# zfs list
NAME USED AVAIL REFER MOUNTPOINT
NAME USED AVAIL REFER MOUNTPOINT myzfs 200M 1.55G 25K /myzfs
myzfs 20.2M 139M 21K /myzfs myzfs/colin 24K 1.75G 24K /myzfs/colin
myzfs/colin 18K 159M 18K /myzfs/colin myzfs/colin2 24K 250M 24K /myzfs/colin2
myzfs/colin@test 0 - 18K - myzfs/colin3 0B 1.55G 24K /myzfs/colin3
myzfs/colin2 18K 20.0M 18K /myzfs/colin2 [root@zfs ~]#
myzfs/colin3 0 139M 18K /myzfs/colin3
``` ```
Теперь давайте удалим наши файловые системы `/myzfs/colin` и Теперь давайте удалим наши файловые системы `/myzfs/colin` и `/myzfs/colin2`
`/myzfs/colin2`
Сперва удалим пустую файловую систему `/myzfs/colin2` Сперва удалим пустую файловую систему `/myzfs/colin2`
``` {tabindex="0"} ```bash
zfs destroy myzfs/colin2 [root@zfs ~]# zfs destroy myzfs/colin2
zfs list [root@zfs ~]# zfs list
NAME USED AVAIL REFER MOUNTPOINT
NAME USED AVAIL REFER MOUNTPOINT myzfs 200M 1.55G 25K /myzfs
myzfs 20.1M 139M 22K /myzfs myzfs/colin 24K 1.75G 24K /myzfs/colin
myzfs/colin 18K 159M 18K /myzfs/colin myzfs/colin3 0B 1.55G 24K /myzfs/colin3
myzfs/colin@test 0 - 18K - [root@zfs ~]#
myzfs/colin3 0 139M 18K /myzfs/colin3
``` ```
Файловая система удалилась без проблем. Теперь удалим файловую систему, Файловая система удалилась без проблем. Теперь удалим файловую систему, для которой существует снапшот.
для которой существует снепшот.
``` {tabindex="0"}
zfs destroy myzfs/colin
```bash
[root@zfs ~]# zfs destroy myzfs/colin
cannot destroy 'myzfs/colin': filesystem has children cannot destroy 'myzfs/colin': filesystem has children
use '-r' to destroy the following datasets: use '-r' to destroy the following datasets:
myzfs/colin@test myzfs/colin@test
[root@zfs ~]#
``` ```
Удаление невозможно, т.к. у файловой системы имеется дочерний объект. Удаление невозможно, т.к. у файловой системы имеется дочерний объект. Можно воспользоваться параметром `-r` чтобы удалить файловую систему
Можно воспользоваться параметром `-r` чтобы удалить файловую систему
вместе со всеми дочерними объектами рекурсивно. вместе со всеми дочерними объектами рекурсивно.
Мы можем отключить снепшот от `/myzfs/colin` и оставить его дочерним Мы можем отключить снапшот от `/myzfs/colin` и оставить его дочерним только для `/myzfs/colin3`
только для `/myzfs/colin3`
``` {tabindex="0"} ```bash
zfs promote myzfs/colin3 [root@zfs ~]# zfs list -t snapshot
zfs list NAME USED AVAIL REFER MOUNTPOINT
myzfs/colin@test 0B - 24K -
NAME USED AVAIL REFER MOUNTPOINT [root@zfs ~]#
myzfs 20.1M 139M 21K /myzfs [root@zfs ~]# zfs promote myzfs/colin3
myzfs/colin 0 159M 18K /myzfs/colin [root@zfs ~]# zfs list -t snapshot
myzfs/colin3 18K 139M 18K /myzfs/colin3 NAME USED AVAIL REFER MOUNTPOINT
myzfs/colin3@test 0 - 18K - myzfs/colin3@test 0B - 24K -
[root@zfs ~]#
[root@zfs ~]# zfs destroy myzfs/colin
zfs destroy myzfs/colin [root@zfs ~]# zfs list
zfs list NAME USED AVAIL REFER MOUNTPOINT
myzfs 264K 1.75G 24K /myzfs
NAME USED AVAIL REFER MOUNTPOINT myzfs/colin3 24K 1.75G 24K /myzfs/colin3
myzfs 147K 159M 21K /myzfs [root@zfs ~]#
myzfs/colin3 18K 159M 18K /myzfs/colin3 [root@zfs ~]# zfs list -t snapshot
myzfs/colin3@test 0 - 18K - NAME USED AVAIL REFER MOUNTPOINT
myzfs/colin3@test 0B - 24K -
[root@zfs ~]#
``` ```
Теперь сделанный ранее снепшот для `/myzfs/colin` стал дочерним Теперь сделанный ранее снапшот для `/myzfs/colin` стал дочерним объектом `/myzfs/colin3`. Таким образом у файловой системы `/myzfs/colin` больше нет дочерних объектов и ее можно без труда разобрать (удалить).
объектом `/myzfs/colin3`. Таким образом у файловой
системы `/myzfs/colin` больше нет дочерних объектов и ее можно без труда
разобрать (удалить).
Если вдруг понадобиться переименовать ранее созданную файловую систему Если вдруг понадобиться переименовать ранее созданную файловую систему или снапшот, то можно воспользоваться следующими командами.
или снепшот, то можно воспользоваться следующими командами.
``` {tabindex="0"} ```bash
zfs rename myzfs/colin3 myzfs/bob [root@zfs ~]# zfs rename myzfs/colin3 myzfs/bob
zfs list [root@zfs ~]# zfs list
NAME USED AVAIL REFER MOUNTPOINT
NAME USED AVAIL REFER MOUNTPOINT myzfs 270K 1.75G 25K /myzfs
myzfs 153K 159M 21K /myzfs myzfs/bob 24K 1.75G 24K /myzfs/bob
myzfs/bob 18K 159M 18K /myzfs/bob [root@zfs ~]#
myzfs/bob@test 0 - 18K - [root@zfs ~]# zfs rename myzfs/bob@test myzfs/bob@newtest
[root@zfs ~]#
zfs rename myzfs/bob@test myzfs/bob@newtest [root@zfs ~]# zfs list -t snapshot
zfs list NAME USED AVAIL REFER MOUNTPOINT
myzfs/bob@newtest 0B - 24K -
NAME USED AVAIL REFER MOUNTPOINT [root@zfs ~]#
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"} ```bash
zfs get all [root@zfs ~]# zfs get all
NAME PROPERTY VALUE SOURCE
NAME PROPERTY VALUE SOURCE myzfs type filesystem -
myzfs type filesystem - myzfs creation Ср апр 3 16:15 2024 -
myzfs creation Tue Sep 11 14:21 2007 - myzfs used 270K -
myzfs used 146K - myzfs available 1.75G -
myzfs available 159M - myzfs referenced 25K -
myzfs referenced 20K - myzfs compressratio 1.00x -
[...] [...]
``` ```
Если пул нам более не нужен, можем его удалить. Однако, нельзя удалить Если пул нам более не нужен, можем его удалить. **(не выполняйте это сейчас. Пул нам еще понадобится далее)**
пул, в котором имеются активные файловые системы.
``` {tabindex="0"} ```bash
zpool destroy myzfs [root@zfs ~]# zpool destroy myzfs
[root@zfs ~]# zfs list
cannot destroy 'myzfs': pool is not empty no datasets available
use '-f' to force destruction anyway [root@zfs ~]# zpool status
no pools available
[root@zfs ~]#
``` ```
Чтобы принудительно удалить пул, используйте параметр `-f` (не Чтобы принудительно удалить пул, используйте параметр `-f` (не
@ -782,7 +764,7 @@ myzfs 159M 20K 159M 1% /myzfs
myzfs/bob 159M 18K 159M 1% /myzfs/bob myzfs/bob 159M 18K 159M 1% /myzfs/bob
``` ```
Снепшот можно сделать и на удаленный ресурс (или другое место в снапшот можно сделать и на удаленный ресурс (или другое место в
локальной системе). локальной системе).
``` {tabindex="0"} ``` {tabindex="0"}
@ -797,9 +779,9 @@ myzfs/bob 18K 159M 18K /myzfs/bob
myzfs/bob@newtest 0 - 18K - myzfs/bob@newtest 0 - 18K -
``` ```
В данном случае снепшот передан `zfs receive` на локальном узле (в В данном случае снапшот передан `zfs receive` на локальном узле (в
демонстрационных целях). В реальной ситуации таким образом можно сделать демонстрационных целях). В реальной ситуации таким образом можно сделать
снепшот на другой узел сети. снапшот на другой узел сети.
Zpool ведет собственную историю всех команд. Посмотреть историю можно Zpool ведет собственную историю всех команд. Посмотреть историю можно
следующим образом. следующим образом.
@ -861,5 +843,5 @@ Disqus.](https://disqus.com/?ref_noscript)
- [Работа с пулом ZFS](#работа-с-пулом-zfs) - [Работа с пулом ZFS](#работа-с-пулом-zfs)
- [Работа с файловой и другими системами ZFS](#работа-с-файловой-и-другими-системами-zfs) - [Работа с файловой и другими системами ZFS](#работа-с-файловой-и-другими-системами-zfs)
- [Файловая система](#файловая-система) - [Файловая система](#файловая-система)
- [Snapshots (снепшоты или снимки состояния) #{.anchor}](#snapshots-снепшоты-или-снимки-состояния-anchor) - [Snapshots (снапшоты или снимки состояния)](#snapshots-снапшоты-или-снимки-состояния)
- [Снова вернемся к пулам #{.anchor}](#снова-вернемся-к-пулам-anchor) - [Снова вернемся к пулам](#снова-вернемся-к-пулам)