notes/zfs_commands.md

808 lines
35 KiB
Markdown
Raw Normal View History

2024-04-03 15:41:08 +03:00
# ZFS --- Справочник команд
- [ZFS --- Справочник команд](#zfs-----справочник-команд)
2024-04-03 16:38:22 +03:00
- [Работа с пулом ZFS](#работа-с-пулом-zfs)
- [Работа с файловой и другими системами ZFS](#работа-с-файловой-и-другими-системами-zfs)
- [Файловая система](#файловая-система)
2024-04-04 12:49:08 +03:00
- [Snapshots (снапшоты или снимки состояния)](#snapshots-снапшоты-или-снимки-состояния)
- [Снова вернемся к пулам](#снова-вернемся-к-пулам)
2024-04-03 15:41:08 +03:00
Данный справочник является переводом [данной статьи](http://lildude.co.uk/zfs-cheatsheet). Авторы перевода: [Евгений Ратников](http://citkit.ru/articles/504/) и [Сгибнев Михаил](http://dreamcatcher.ru/). Огромное им спасибо за проделанную работу!
Не забывайте про страницы справки по командам работы с ZFS.
2024-04-03 15:42:24 +03:00
```bash
2024-04-03 15:41:57 +03:00
man zpool
man zfs
```
2024-04-03 16:38:22 +03:00
Так как включить в пул (zpool) можно любые сущности файловой системы, автор приводит примеры построения пулов и работы с ними с использованием простых файлов. Итак, создадим несколько файлов, с которыми будем работать подобно дискам.
2024-04-03 15:41:08 +03:00
2024-04-03 16:38:22 +03:00
```bash
[root@zfs]# cd /
[root@zfs /]# for i in {1..3}; do dd if=/dev/zero of=disk$i bs=1M count=1000; done
[root@zfs /]# dd if=/dev/zero of=disk4 bs=1M count=500
[root@zfs /]# dd if=/dev/zero of=disk5 bs=1M count=1000
[root@zfs /]#
2024-04-03 15:41:08 +03:00
```
2024-04-03 16:40:52 +03:00
Мы создали 5 «виртуальных дисков». Четыре имеют размер по 1000 Мб, а один - 500 Мб. Это пригодится для демонстрации работы с устройствами (разделами) разной ёмкости.
2024-04-03 15:41:08 +03:00
2024-04-03 16:38:22 +03:00
## Работа с пулом ZFS
2024-04-03 15:41:08 +03:00
2024-04-03 16:38:22 +03:00
Теперь создадим простой пул без избыточности, затем проверим его размер и использование.
2024-04-03 15:41:08 +03:00
2024-04-03 16:38:22 +03:00
```bash
[root@zfs /]# zpool create myzfs /disk1 /disk2
[root@zfs /]#
```
2024-04-03 15:41:08 +03:00
2024-04-03 16:38:22 +03:00
```bash
[root@zfs /]# zpool list
NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
myzfs 1.88G 110K 1.87G - - 0% 0% 1.00x ONLINE -
[root@zfs /]#
2024-04-03 15:41:08 +03:00
```
2024-04-03 16:38:22 +03:00
Созданы пул автоматически монтируется в каталог `/myzfs`. Посмотрим более детальную информацию о нашем хранилище.
2024-04-03 15:41:08 +03:00
2024-04-03 16:38:22 +03:00
```bash
[root@zfs /]# zpool status
2024-04-03 15:41:08 +03:00
pool: myzfs
state: ONLINE
config:
2024-04-03 16:38:22 +03:00
2024-04-03 15:41:08 +03:00
NAME STATE READ WRITE CKSUM
myzfs ONLINE 0 0 0
/disk1 ONLINE 0 0 0
/disk2 ONLINE 0 0 0
errors: No known data errors
2024-04-03 16:38:22 +03:00
[root@zfs /]#
2024-04-03 15:41:08 +03:00
```
2024-04-03 16:38:22 +03:00
Из вывода видно, что в пул включены два диска. Пул без избыточности (не mirror и не RAIDZ).
2024-04-03 15:41:08 +03:00
2024-04-03 16:38:22 +03:00
Теперь попробуем удалить только что созданный пул. Должны же мы это уметь.
2024-04-03 15:41:08 +03:00
2024-04-03 16:38:22 +03:00
```bash
[root@zfs /]# zpool destroy myzfs
[root@zfs /]# zpool list
2024-04-03 15:41:08 +03:00
no pools available
2024-04-03 16:38:22 +03:00
[root@zfs /]#
2024-04-03 15:41:08 +03:00
```
2024-04-03 16:38:22 +03:00
Попробуем снова создать пул типа `MIRROR` (зеркало), но на этот раз попытаемся включить в него диски разного размера. Zpool не даст нам этого сделать. Чтобы безоговорочно создать такой пул, используйте опцию `-f`, но в этом случае помните --- размер зеркала будет равен объему наименьшего диска.
2024-04-03 15:41:08 +03:00
2024-04-03 16:38:22 +03:00
```bash
[root@zfs /]# zpool create myzfs mirror /disk1 /disk4
2024-04-03 15:41:08 +03:00
invalid vdev specification
use '-f' to override the following errors:
2024-04-03 16:38:22 +03:00
/disk1 is part of active pool 'myzfs'
[root@zfs /]#
2024-04-03 15:41:08 +03:00
```
2024-04-03 16:38:22 +03:00
Создать зеркалируемое (*MIRROR*) хранилище можно на двух и более устройствах. Сколько устройств в пуле типа `MIRROR` --- столько у нас есть одинаковых копий данных.
2024-04-03 15:41:08 +03:00
2024-04-03 16:38:22 +03:00
```bash
[root@zfs /]# zpool create -f myzfs mirror /disk1 /disk2 /disk3
[root@zfs /]# zpool list
NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
myzfs 960M 129K 960M - - 0% 0% 1.00x ONLINE -
[root@zfs /]#
[root@zfs /]# zpool status
2024-04-03 15:41:08 +03:00
pool: myzfs
state: ONLINE
config:
NAME STATE READ WRITE CKSUM
myzfs ONLINE 0 0 0
2024-04-03 16:38:22 +03:00
mirror-0 ONLINE 0 0 0
2024-04-03 15:41:08 +03:00
/disk1 ONLINE 0 0 0
/disk2 ONLINE 0 0 0
/disk3 ONLINE 0 0 0
errors: No known data errors
2024-04-03 16:38:22 +03:00
[root@zfs /]#
2024-04-03 15:41:08 +03:00
```
2024-04-03 16:38:22 +03:00
Вместо зеркалирования можно использовать массивы `RAID`. Для этого необходимо создавать пул типа `raidz` вместо `mirror`. Подробнее <https://docs.freebsd.org/en/books/handbook/zfs/>.
2024-04-03 15:41:08 +03:00
2024-04-03 16:38:22 +03:00
Давайте теперь исключим один из дисков из пула. Так как этот диск относится к зеркалу `MIRROR`, то при его исключении никаких проблем не возникает.
2024-04-03 15:41:08 +03:00
2024-04-03 16:38:22 +03:00
```bash
[root@zfs /]# zpool detach myzfs /disk3
[root@zfs /]# zpool status
2024-04-03 15:41:08 +03:00
pool: myzfs
state: ONLINE
config:
NAME STATE READ WRITE CKSUM
myzfs ONLINE 0 0 0
2024-04-03 16:38:22 +03:00
mirror-0 ONLINE 0 0 0
2024-04-03 15:41:08 +03:00
/disk1 ONLINE 0 0 0
/disk2 ONLINE 0 0 0
errors: No known data errors
2024-04-03 16:38:22 +03:00
[root@zfs /]#
2024-04-03 15:41:08 +03:00
```
2024-04-03 16:38:22 +03:00
Теперь давайте добавим к пулу новый диск. Если пул не был зеркальным, то он им станет после добавления нового диска.
2024-04-03 15:41:08 +03:00
2024-04-03 16:38:22 +03:00
```bash
[root@zfs /]# zpool attach myzfs /disk1 /disk3
[root@zfs /]# zpool status
2024-04-03 15:41:08 +03:00
pool: myzfs
state: ONLINE
2024-04-03 16:38:22 +03:00
scan: resilvered 152K in 00:00:00 with 0 errors on Wed Apr 3 16:10:22 2024
2024-04-03 15:41:08 +03:00
config:
NAME STATE READ WRITE CKSUM
myzfs ONLINE 0 0 0
2024-04-03 16:38:22 +03:00
mirror-0 ONLINE 0 0 0
2024-04-03 15:41:08 +03:00
/disk1 ONLINE 0 0 0
/disk2 ONLINE 0 0 0
/disk3 ONLINE 0 0 0
errors: No known data errors
2024-04-03 16:38:22 +03:00
[root@zfs /]#
2024-04-03 15:41:08 +03:00
```
2024-04-03 16:38:22 +03:00
А что будет, если попытаемся *удалить*, а не исключить устройство из пула? Zpool сообщит нам о том, что устройство не может быть удалено. Для начала его нужно отключить.
2024-04-03 15:41:08 +03:00
2024-04-03 16:38:22 +03:00
```bash
[root@zfs /]# zpool remove myzfs /disk3
cannot remove /disk3: operation not supported on this type of pool
[root@zfs /]# zpool detach myzfs /disk3
[root@zfs /]#
2024-04-03 15:41:08 +03:00
```
2024-04-03 16:38:22 +03:00
Теперь давайте попробуем добавить диск горячей замены `hot spare` к нашему пулу.
2024-04-03 15:41:08 +03:00
2024-04-03 16:38:22 +03:00
```bash
2024-04-03 15:41:08 +03:00
zpool add myzfs spare /disk3
2024-04-03 16:38:22 +03:00
zpool status
2024-04-03 15:41:08 +03:00
pool: myzfs
state: ONLINE
scrub: none requested
config:
NAME STATE READ WRITE CKSUM
myzfs ONLINE 0 0 0
mirror ONLINE 0 0 0
/disk1 ONLINE 0 0 0
/disk2 ONLINE 0 0 0
spares
/disk3 AVAIL
errors: No known data errors
```
А теперь удалим его из пула.
2024-04-03 16:38:22 +03:00
```bash
[root@zfs /]# zpool remove myzfs /disk3
[root@zfs /]# zpool status
2024-04-03 15:41:08 +03:00
pool: myzfs
state: ONLINE
config:
NAME STATE READ WRITE CKSUM
myzfs ONLINE 0 0 0
2024-04-03 16:38:22 +03:00
mirror-0 ONLINE 0 0 0
2024-04-03 15:41:08 +03:00
/disk1 ONLINE 0 0 0
/disk2 ONLINE 0 0 0
errors: No known data errors
2024-04-03 16:38:22 +03:00
[root@zfs /]#
2024-04-03 15:41:08 +03:00
```
2024-04-03 16:38:22 +03:00
Теперь попробуем отключить один из дисков. Пока диск отключен, на него не будет производиться запись и с него не будет производиться чтение. Если использовать параметр `-t`, то при перезагрузке сервера диск вернется в состояние онлайн автоматически.
2024-04-03 15:41:08 +03:00
2024-04-03 16:38:22 +03:00
```bash
[root@zfs /]# zpool offline myzfs /disk1
[root@zfs /]# zpool status
2024-04-03 15:41:08 +03:00
pool: myzfs
state: DEGRADED
status: One or more devices has been taken offline by the administrator.
2024-04-03 16:38:22 +03:00
Sufficient replicas exist for the pool to continue functioning in a
degraded state.
action: Online the device using 'zpool online' or replace the device with
'zpool replace'.
2024-04-03 15:41:08 +03:00
config:
NAME STATE READ WRITE CKSUM
myzfs DEGRADED 0 0 0
2024-04-03 16:38:22 +03:00
mirror-0 DEGRADED 0 0 0
2024-04-03 15:41:08 +03:00
/disk1 OFFLINE 0 0 0
/disk2 ONLINE 0 0 0
errors: No known data errors
2024-04-03 16:38:22 +03:00
[root@zfs /]#
2024-04-03 15:41:08 +03:00
```
Обратите внимание на состояние пула: **DEGRADED**
Теперь включим этот диск.
2024-04-03 16:38:22 +03:00
```bash
[root@zfs /]# zpool online myzfs /disk1
[root@zfs /]# zpool status
2024-04-03 15:41:08 +03:00
pool: myzfs
state: ONLINE
2024-04-03 16:38:22 +03:00
scan: resilvered 36K in 00:00:00 with 0 errors on Wed Apr 3 16:24:12 2024
2024-04-03 15:41:08 +03:00
config:
NAME STATE READ WRITE CKSUM
myzfs ONLINE 0 0 0
2024-04-03 16:38:22 +03:00
mirror-0 ONLINE 0 0 0
2024-04-03 15:41:08 +03:00
/disk1 ONLINE 0 0 0
/disk2 ONLINE 0 0 0
errors: No known data errors
2024-04-03 16:38:22 +03:00
[root@zfs /]#
2024-04-03 15:41:08 +03:00
```
Состояние пула снова **ONLINE**.
2024-04-03 16:38:22 +03:00
В данный момент в нашем пуле два диска: disk1 и disk2. Также в системе имеется диск disk3, но он не подключен к пулу. Предположим, что disk1 вышел из строя и его нужно заменить на disk3.
2024-04-03 15:41:08 +03:00
2024-04-03 16:38:22 +03:00
```bash
[root@zfs /]# zpool replace myzfs /disk1 /disk3
[root@zfs /]# zpool status
2024-04-03 15:41:08 +03:00
pool: myzfs
state: ONLINE
2024-04-03 16:38:22 +03:00
scan: resilvered 264K in 00:00:00 with 0 errors on Wed Apr 3 16:26:44 2024
2024-04-03 15:41:08 +03:00
config:
NAME STATE READ WRITE CKSUM
myzfs ONLINE 0 0 0
2024-04-03 16:38:22 +03:00
mirror-0 ONLINE 0 0 0
2024-04-03 15:41:08 +03:00
/disk3 ONLINE 0 0 0
/disk2 ONLINE 0 0 0
errors: No known data errors
2024-04-03 16:38:22 +03:00
[root@zfs /]#
2024-04-03 15:41:08 +03:00
```
2024-04-03 16:38:22 +03:00
Периодически для исправления ошибок необходимо выполнять процедуру чистки (scrubbing) для пулов типа *MIRROR* или *RAID-Z*. Данная процедура находит ошибки в контрольных суммах и исправляет их. Также восстанавливаются сбойные блоки.
2024-04-03 15:41:08 +03:00
2024-04-03 16:38:22 +03:00
**Данная операция слишком ресурсоемка! Следует выполнять ее только во время наименьшей нагрузки на пул.**
2024-04-03 15:41:08 +03:00
2024-04-03 16:38:22 +03:00
```bash
[root@zfs /]# zpool scrub myzfs
[root@zfs /]#
2024-04-03 15:41:08 +03:00
```
2024-04-03 16:38:22 +03:00
Если необходимо перенести пул в другую систему, то его необходимо сначала экспортировать.
2024-04-03 15:41:08 +03:00
2024-04-03 16:38:22 +03:00
```bash
[root@zfs /]# zpool export myzfs
[root@zfs /]# zpool list
2024-04-03 15:41:08 +03:00
no pools available
2024-04-03 16:38:22 +03:00
[root@zfs /]#
2024-04-03 15:41:08 +03:00
```
А затем импортировать в новой системе.
2024-04-03 16:38:22 +03:00
Если ключ `-d` не указать, то команда ищет `/dev/dsk`. Так как в данном примере мы используем файлы, необходимо указать директорию с файлами используемыми хранилищем.
2024-04-03 15:41:08 +03:00
2024-04-03 16:38:22 +03:00
```bash
[root@zfs /]# zpool import -d / myzfs
[root@zfs /]# zpool list
NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
myzfs 960M 166K 960M - - 0% 0% 1.00x ONLINE -
[root@zfs /]#
2024-04-03 15:41:08 +03:00
```
2024-04-03 16:38:22 +03:00
Обновление версии пула. Показать версию используемого пула. Флаг `-v` показывает возможности, поддерживаемые данным пулом. Используйте флаг `-a`, чтобы обновить все доступные пулы до новейшей из них версии. Обновленные пулы больше не будут доступны из систем, на которых работают более старые версии.
2024-04-03 15:41:08 +03:00
2024-04-03 16:38:22 +03:00
```bash
[root@zfs /]# zpool upgrade
This system supports ZFS pool feature flags.
All pools are formatted using feature flags.
Every feature flags pool has all supported and requested features enabled.
[root@zfs /]#
[root@zfs /]# zpool upgrade -v
This system supports ZFS pool feature flags.
The following features are supported:
FEAT DESCRIPTION
-------------------------------------------------------------
async_destroy (read-only compatible)
Destroy filesystems asynchronously.
empty_bpobj (read-only compatible)
Snapshots use less space.
lz4_compress
LZ4 compression algorithm support.
multi_vdev_crash_dump
Crash dumps to multiple vdev pools.
spacemap_histogram (read-only compatible)
Spacemaps maintain space histograms.
enabled_txg (read-only compatible)
Record txg at which a feature is enabled
hole_birth
Retain hole birth txg for more precise zfs send
extensible_dataset
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
zstd_compress
zstd compression algorithm support.
draid
Support for distributed spare RAID
The following legacy versions are also supported:
2024-04-03 15:41:08 +03:00
VER DESCRIPTION
--- --------------------------------------------------------
1 Initial ZFS version
2 Ditto blocks (replicated metadata)
3 Hot spares and double parity RAID-Z
4 zpool history
5 Compression using the gzip algorithm
2024-04-03 16:38:22 +03:00
6 bootfs pool property
2024-04-03 15:41:08 +03:00
7 Separate intent log devices
8 Delegated administration
2024-04-03 16:38:22 +03:00
9 refquota and refreservation properties
10 Cache devices
11 Improved scrub performance
12 Snapshot properties
13 snapused property
14 passthrough-x aclinherit
15 user/group space accounting
16 stmf property support
17 Triple-parity RAID-Z
18 Snapshot user holds
19 Log device removal
20 Compression using zle (zero-length encoding)
21 Deduplication
22 Received properties
23 Slim ZIL
24 System attributes
25 Improved scrub stats
26 Improved snapshot deletion performance
27 Improved snapshot creation performance
28 Multiple vdev replacements
For more information on a particular version, including supported releases,
see the ZFS Administration Guide.
[root@zfs /]#
```
Если нужно получить статистику по операциям ввода/вывода пулов, выполняем команду.
2024-04-03 15:41:08 +03:00
2024-04-03 16:38:22 +03:00
```bash
[root@zfs /]# zpool iostat 5
capacity operations bandwidth
pool alloc free read write read write
2024-04-03 15:41:08 +03:00
---------- ----- ----- ----- ----- ----- -----
2024-04-03 16:38:22 +03:00
myzfs 135K 960M 0 1 4.17K 8.67K
myzfs 135K 960M 0 0 0 0
myzfs 135K 960M 0 0 0 0
myzfs 135K 960M 0 0 0 0
myzfs 135K 960M 0 0 0 0
^C
[root@zfs /]#
2024-04-03 15:41:08 +03:00
```
2024-04-03 16:38:22 +03:00
## Работа с файловой и другими системами ZFS
2024-04-03 15:41:08 +03:00
2024-04-03 16:38:22 +03:00
### Файловая система
2024-04-03 15:41:08 +03:00
2024-04-03 16:38:22 +03:00
Создадим файловую систему в нашем пуле. Затем проверим автомонтирование новой файловой системы.
2024-04-03 15:41:08 +03:00
2024-04-03 16:38:22 +03:00
```bash
[root@zfs /]# zfs create myzfs/colin
2024-04-04 12:49:08 +03:00
[root@zfs ~]# df -Th | grep zfs
2024-04-03 16:38:22 +03:00
myzfs zfs 832M 128K 832M 1% /myzfs
myzfs/colin zfs 832M 128K 832M 1% /myzfs/colin
2024-04-04 12:49:08 +03:00
[root@zfs ~]#
2024-04-03 15:41:08 +03:00
```
Получить список файловых систем ZFS можно следующей командой.
2024-04-03 16:38:22 +03:00
```bash
[root@zfs /]# zfs list
NAME USED AVAIL REFER MOUNTPOINT
myzfs 171K 832M 24K /myzfs
myzfs/colin 24K 832M 24K /myzfs/colin
[root@zfs /]#
2024-04-03 15:41:08 +03:00
```
2024-04-04 12:49:08 +03:00
В данный момент в нашем пуле имеется одно зеркало, в которое входят два диска: disk2 и disk3.
2024-04-03 15:41:08 +03:00
2024-04-04 12:49:08 +03:00
Давайте попробуем расширить наш пул. Попытаемся добавить к нему disk1
2024-04-03 15:41:08 +03:00
2024-04-04 12:49:08 +03:00
```bash
[root@zfs ~]# zpool add myzfs /disk1
2024-04-03 15:41:08 +03:00
invalid vdev specification
use '-f' to override the following errors:
mismatched replication level: pool uses mirror and new vdev is file
2024-04-04 12:49:08 +03:00
[root@zfs ~]#
2024-04-03 15:41:08 +03:00
```
2024-04-04 12:49:08 +03:00
Попытка добавления не удалась, т.к. она неоднозначна и при добавлении диска к существующему зеркалу необходимо указать дополнительно один из
существующих в этом зеркале дисков, либо добавить минимум два диска для формирования нового зеркала, которое будет входить в данный пул.
2024-04-03 15:41:08 +03:00
2024-04-04 12:49:08 +03:00
Добавим к пулу новое зеркало, состоящее из дисков: disk1 и disk5
2024-04-03 15:41:08 +03:00
2024-04-04 12:49:08 +03:00
```bash
[root@zfs ~]# zpool add myzfs mirror /disk1 /disk5
[root@zfs ~]# zpool status
2024-04-03 15:41:08 +03:00
pool: myzfs
state: ONLINE
2024-04-04 12:49:08 +03:00
scan: scrub repaired 0B in 00:00:00 with 0 errors on Wed Apr 3 16:27:35 2024
2024-04-03 15:41:08 +03:00
config:
NAME STATE READ WRITE CKSUM
myzfs ONLINE 0 0 0
2024-04-04 12:49:08 +03:00
mirror-0 ONLINE 0 0 0
//disk3 ONLINE 0 0 0
//disk2 ONLINE 0 0 0
mirror-1 ONLINE 0 0 0
2024-04-03 15:41:08 +03:00
/disk1 ONLINE 0 0 0
/disk5 ONLINE 0 0 0
errors: No known data errors
2024-04-04 12:49:08 +03:00
[root@zfs ~]#
2024-04-03 15:41:08 +03:00
```
2024-04-04 12:49:08 +03:00
Добавим теперь к пулу еще одну файловую систему и посмотрим, как это отразится на размере файловых систем, входящих в пул.
2024-04-03 15:41:08 +03:00
2024-04-04 12:49:08 +03:00
```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 ~]#
2024-04-03 15:41:08 +03:00
```
2024-04-04 12:49:08 +03:00
Обе файловые системы, входящие в пул, по объему равны всему пулу. В этом заключается одно из преимуществ системы ZFS --- по-умолчанию нет никакого ограничения на файловые системы.
2024-04-03 15:41:08 +03:00
2024-04-04 12:49:08 +03:00
Чтобы явно управлять объемом файловых систем, можно прибегнуть к резервированию --- выделению гарантированного объема для файловой системы, либо квотированию --- ограничению файловой системы по максимальному объему.
2024-04-03 15:41:08 +03:00
2024-04-04 12:49:08 +03:00
Давайте зарезервируем для файловой системы `/myzfs/colin` место в пуле, равное 200 Мб. Остальные файловые системы, заполняя пул, в любом случае
оставят для этой файловой системы 200 Мб места.
2024-04-03 15:41:08 +03:00
2024-04-04 12:49:08 +03:00
```bash
[root@zfs ~]# zfs set reservation=200m myzfs/colin
[root@zfs ~]# zfs list -o reservation
2024-04-03 15:41:08 +03:00
RESERV
none
2024-04-04 12:49:08 +03:00
200M
2024-04-03 15:41:08 +03:00
none
2024-04-04 12:49:08 +03:00
[root@zfs ~]#
2024-04-03 15:41:08 +03:00
```
2024-04-04 12:49:08 +03:00
Теперь для файловой системы `/myzfs/colin2` установим квоту в 250 Мб. Это означает, что данная файловая система не сможет занять в пуле более 250
2024-04-03 15:41:08 +03:00
Мб, даже если пул будет полностью свободным.
2024-04-04 12:49:08 +03:00
```bash
[root@zfs ~]# zfs set quota=250m myzfs/colin2
[root@zfs ~]# zfs list -o quota myzfs/colin myzfs/colin2
2024-04-03 15:41:08 +03:00
QUOTA
none
2024-04-04 12:49:08 +03:00
250M
[root@zfs ~]#
2024-04-03 15:41:08 +03:00
```
2024-04-04 12:49:08 +03:00
Также для файловой системы `/myzfs/colin2` включим сжатие. Сжатие достаточно эффективно работает на уровне ZFS практически без потерь производительности (конечно же, при условии, что производительности сервера достаточно).
2024-04-03 15:41:08 +03:00
2024-04-04 12:49:08 +03:00
ZFS использует несколько различных алгоритмов сжатия, оптимизированных для различных типов данных:
- **LZ4** Алгоритм по-умолчанию, использующий сжатие LZ4. Предпочтение отдается скорости, а не степени сжатия.
- **LZJB** Устаревший формат с приемлемым сжатием и скоростью.
- **Gzip** Стандартное сжатие gzip. Несколько уровней сжатия от 1 до 9, чем выше, тем лучше, но медленнее.
- **ZLE** оптимизирован для нулевых блоков.
Алгоритмы адаптивно выбирают оптимальную стратегию сжатия для каждого типа данных.
При этом, вместо `compression=on` можно явно указать алгоритм сжатия `compression=gzip-9`, `compression=lzjb`, `compression=zle` и т.д.
```bash
2024-04-04 13:08:53 +03:00
[root@zfs ~]# zfs set compression=on myzfs/colin2
[root@zfs ~]# zfs list -o compression
2024-04-03 15:41:08 +03:00
COMPRESS
off
off
on
2024-04-04 13:08:53 +03:00
[root@zfs ~]#
2024-04-03 15:41:08 +03:00
```
2024-04-04 12:49:08 +03:00
Чтобы сделать файловую систему доступной по протоколу NFS, достаточно выполнить одну команду. Причем после перезагрузки сервера доступ к файловой системе утерян не будет. Никаких дополнительных настроек операционной системы производить не нужно.
2024-04-03 15:41:08 +03:00
2024-04-04 12:49:08 +03:00
```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 ~]#
2024-04-03 15:41:08 +03:00
```
2024-04-04 12:49:08 +03:00
Точно так же в одну команду ресурс можно сделать доступным по протоколу SMB. Что пользователям ОС Windows наверняка пригодится. В системе должен быть установлен пакет `samba-usershares`.
2024-04-03 15:41:08 +03:00
2024-04-04 12:49:08 +03:00
```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 ~]#
2024-04-03 15:41:08 +03:00
```
2024-04-04 12:49:08 +03:00
Для повышения надежности (если у вас обычный пул, без избыточности), можно использовать следующую опцию файловой системы.
2024-04-03 15:41:08 +03:00
2024-04-04 12:49:08 +03:00
```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 ~]#
2024-04-03 15:41:08 +03:00
```
2024-04-04 12:49:08 +03:00
Теперь в файловой системе будет храниться по две копии каждого блока. Это имеет смысл, если пул без избыточности (*mirror* / *raidz*).
2024-04-03 15:41:08 +03:00
2024-04-04 12:49:08 +03:00
### Snapshots (снапшоты или снимки состояния)
2024-04-03 15:41:08 +03:00
2024-04-04 12:49:08 +03:00
Создать снапшот файловой системы очень просто. Давайте создадим снапшот для файловой системы `myzfs/colin` и назовем его *test*.
2024-04-03 15:41:08 +03:00
2024-04-04 12:49:08 +03:00
```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 ~]#
2024-04-03 15:41:08 +03:00
```
2024-04-04 12:49:08 +03:00
Если появится необходимость отката к снапшоту, достаточно выполнить одну команду.
2024-04-03 15:41:08 +03:00
2024-04-04 12:49:08 +03:00
```bash
[root@zfs ~]# zfs rollback myzfs/colin@test
2024-04-03 15:41:08 +03:00
```
2024-04-04 12:49:08 +03:00
Снапшот можно подмониторовать, как обычно. Например так.
2024-04-03 15:41:08 +03:00
2024-04-04 12:49:08 +03:00
```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 ~]#
2024-04-03 15:41:08 +03:00
```
2024-04-04 12:49:08 +03:00
Даже можно клонировать файловую системы из снапшота в новую файловую систему.
2024-04-03 15:41:08 +03:00
2024-04-04 12:49:08 +03:00
```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 ~]#
2024-04-03 15:41:08 +03:00
```
2024-04-04 12:49:08 +03:00
Теперь давайте удалим наши файловые системы `/myzfs/colin` и `/myzfs/colin2`
2024-04-03 15:41:08 +03:00
Сперва удалим пустую файловую систему `/myzfs/colin2`
2024-04-04 12:49:08 +03:00
```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 ~]#
2024-04-03 15:41:08 +03:00
```
2024-04-04 12:49:08 +03:00
Файловая система удалилась без проблем. Теперь удалим файловую систему, для которой существует снапшот.
2024-04-03 15:41:08 +03:00
2024-04-04 12:49:08 +03:00
```bash
[root@zfs ~]# zfs destroy myzfs/colin
2024-04-03 15:41:08 +03:00
cannot destroy 'myzfs/colin': filesystem has children
use '-r' to destroy the following datasets:
myzfs/colin@test
2024-04-04 12:49:08 +03:00
[root@zfs ~]#
2024-04-03 15:41:08 +03:00
```
2024-04-04 12:49:08 +03:00
Удаление невозможно, т.к. у файловой системы имеется дочерний объект. Можно воспользоваться параметром `-r` чтобы удалить файловую систему
2024-04-03 15:41:08 +03:00
вместе со всеми дочерними объектами рекурсивно.
2024-04-04 12:49:08 +03:00
Мы можем отключить снапшот от `/myzfs/colin` и оставить его дочерним только для `/myzfs/colin3`
2024-04-03 15:41:08 +03:00
2024-04-04 12:49:08 +03:00
```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` больше нет дочерних объектов и ее можно без труда разобрать (удалить).
Если вдруг понадобиться переименовать ранее созданную файловую систему или снапшот, то можно воспользоваться следующими командами.
2024-04-03 15:41:08 +03:00
2024-04-04 12:49:08 +03:00
```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 ~]#
```
### Снова вернемся к пулам
2024-04-03 15:41:08 +03:00
Получить полную информацию о пулах можно следующим образом.
2024-04-04 12:49:08 +03:00
```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 -
2024-04-03 15:41:08 +03:00
[...]
```
2024-04-04 12:49:08 +03:00
Если пул нам более не нужен, можем его удалить. **(не выполняйте это сейчас. Пул нам еще понадобится далее)**
2024-04-03 15:41:08 +03:00
2024-04-04 12:49:08 +03:00
```bash
[root@zfs ~]# zpool destroy myzfs
[root@zfs ~]# zfs list
no datasets available
[root@zfs ~]# zpool status
no pools available
[root@zfs ~]#
2024-04-03 15:41:08 +03:00
```
2024-04-04 13:08:53 +03:00
Отключить файловую систему от пула можно командой `unmount` или `umount`.
2024-04-03 15:41:08 +03:00
2024-04-04 13:08:53 +03:00
```bash
[root@zfs ~]# df -Th | grep zfs
myzfs zfs 1,8G 128K 1,8G 1% /myzfs
myzfs/bob zfs 1,8G 128K 1,8G 1% /myzfs/bob
[root@zfs ~]#
[root@zfs ~]# zfs umount myzfs/bob
[root@zfs ~]#
[root@zfs ~]# df -Th | grep zfs
myzfs zfs 1,8G 128K 1,8G 1% /myzfs
[root@zfs ~]#
2024-04-03 15:41:08 +03:00
```
Подключить файловую систему к пулу вот так.
2024-04-04 13:08:53 +03:00
```bash
[root@zfs ~]# zfs mount myzfs/bob
[root@zfs ~]#
[root@zfs ~]# df -Th | grep zfs
myzfs zfs 1,8G 128K 1,8G 1% /myzfs
myzfs/bob zfs 1,8G 128K 1,8G 1% /myzfs/bob
[root@zfs ~]#
2024-04-03 15:41:08 +03:00
```
2024-04-04 13:08:53 +03:00
Снапшот можно сделать и на удаленный ресурс (или другое место в локальной системе).
2024-04-03 15:41:08 +03:00
2024-04-04 13:08:53 +03:00
```bash
[root@zfs ~]# zfs send myzfs/bob@newtest | ssh localhost zfs receive myzfs/backup
[root@zfs ~]#
[root@zfs ~]# zfs list
NAME USED AVAIL REFER MOUNTPOINT
myzfs 218K 1.75G 25K /myzfs
myzfs/backup 24K 1.75G 24K /myzfs/backup
myzfs/bob 24K 1.75G 24K /myzfs/bob
[root@zfs ~]#
[root@zfs ~]# zfs list -t snapshot
NAME USED AVAIL REFER MOUNTPOINT
myzfs/backup@newtest 0B - 24K -
myzfs/bob@newtest 0B - 24K -
[root@zfs ~]#
2024-04-03 15:41:08 +03:00
```
2024-04-04 13:08:53 +03:00
В данном случае снапшот передан `zfs receive` на локальном узле (в демонстрационных целях). В реальной ситуации таким образом можно сделать снапшот на другой узел сети.
2024-04-03 15:41:08 +03:00
2024-04-04 13:08:53 +03:00
Zpool ведет собственную историю всех команд. Посмотреть историю можно следующим образом.
2024-04-03 15:41:08 +03:00
2024-04-04 13:08:53 +03:00
```bash
[root@zfs ~]# zpool history
2024-04-03 15:41:08 +03:00
History for 'myzfs':
2024-04-04 13:08:53 +03:00
2024-04-04.12:47:12 zpool create -f myzfs mirror /disk1 /disk2
2024-04-04.12:50:17 zfs create myzfs/colin3
2024-04-04.12:51:01 zfs set compression=on myzfs/colin3
2024-04-04.12:53:42 zpool add myzfs mirror /disk3 /disk5
2024-04-04.12:55:27 zfs snapshot myzfs/colin3@test
2024-04-04.12:55:43 zfs rename myzfs/colin3 myzfs/bob
2024-04-04.12:55:50 zfs rename myzfs/bob@test myzfs/bob@newtest
2024-04-04.13:02:15 zfs receive myzfs/backup
[root@zfs ~]#
2024-04-03 15:41:08 +03:00
```
Ну вот. Основные команды для работы с пулами ZFS усвоены.
Теперь можно удалить сам пул и файлы. Они нам больше не пригодятся.
2024-04-04 13:08:53 +03:00
```bash
[root@zfs ~]# zpool destroy myzfs
[root@zfs ~]#
```