831 lines
35 KiB
Markdown
831 lines
35 KiB
Markdown
# ZFS. Справочник команд
|
||
|
||
- [ZFS. Справочник команд](#zfs-справочник-команд)
|
||
- [Работа с пулом ZFS](#работа-с-пулом-zfs)
|
||
- [Работа с файловой и другими системами ZFS](#работа-с-файловой-и-другими-системами-zfs)
|
||
- [Файловая система](#файловая-система)
|
||
- [Snapshots (снапшоты или снимки состояния)](#snapshots-снапшоты-или-снимки-состояния)
|
||
- [Снова вернемся к пулам](#снова-вернемся-к-пулам)
|
||
|
||
Данный справочник является переводом [данной статьи](http://lildude.co.uk/zfs-cheatsheet). Авторы перевода: Евгений Ратников и Сгибнев Михаил.
|
||
|
||
Не забывайте про страницы справки по командам работы с ZFS.
|
||
|
||
```bash
|
||
man zpool
|
||
man zfs
|
||
```
|
||
|
||
Документация доступна на странице проекта - <https://openzfs.github.io/openzfs-docs/index.html#></br>
|
||
Много примеров в документации FreeBSD - <https://docs.freebsd.org/en/books/handbook/zfs/>
|
||
|
||
Так как включить в пул (zpool) можно любые сущности файловой системы, автор приводит примеры построения пулов и работы с ними с использованием простых файлов. Итак, создадим несколько файлов, с которыми будем работать подобно дискам.
|
||
|
||
```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 /]#
|
||
```
|
||
|
||
Мы создали 5 «виртуальных дисков». Четыре имеют размер по 1000 Мб, а один - 500 Мб. Это пригодится для демонстрации работы с устройствами (разделами) разной ёмкости.
|
||
|
||
## Работа с пулом ZFS
|
||
|
||
Теперь создадим простой пул без избыточности, затем проверим его размер и использование.
|
||
|
||
```bash
|
||
[root@zfs /]# zpool create myzfs /disk1 /disk2
|
||
[root@zfs /]#
|
||
```
|
||
|
||
```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 /]#
|
||
```
|
||
|
||
Созданы пул автоматически монтируется в каталог `/myzfs`. Посмотрим более детальную информацию о нашем хранилище.
|
||
|
||
```bash
|
||
[root@zfs /]# zpool status
|
||
pool: myzfs
|
||
state: ONLINE
|
||
config:
|
||
|
||
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
|
||
[root@zfs /]#
|
||
```
|
||
|
||
Из вывода видно, что в пул включены два диска. Пул без избыточности (не mirror и не RAIDZ).
|
||
|
||
[вверх](#zfs-справочник-команд)
|
||
|
||
Теперь попробуем удалить только что созданный пул. Должны же мы это уметь.
|
||
|
||
```bash
|
||
[root@zfs /]# zpool destroy myzfs
|
||
[root@zfs /]# zpool list
|
||
no pools available
|
||
[root@zfs /]#
|
||
```
|
||
|
||
Попробуем снова создать пул типа `MIRROR` (зеркало), но на этот раз попытаемся включить в него диски разного размера. Zpool не даст нам этого сделать. Чтобы безоговорочно создать такой пул, используйте опцию `-f`, но в этом случае помните --- размер зеркала будет равен объему наименьшего диска.
|
||
|
||
```bash
|
||
[root@zfs /]# zpool create myzfs mirror /disk1 /disk4
|
||
invalid vdev specification
|
||
use '-f' to override the following errors:
|
||
/disk1 is part of active pool 'myzfs'
|
||
[root@zfs /]#
|
||
```
|
||
|
||
Создать зеркалируемое (*MIRROR*) хранилище можно на двух и более устройствах. Сколько устройств в пуле типа `MIRROR` --- столько у нас есть одинаковых копий данных.
|
||
|
||
```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
|
||
pool: myzfs
|
||
state: ONLINE
|
||
config:
|
||
|
||
NAME STATE READ WRITE CKSUM
|
||
myzfs ONLINE 0 0 0
|
||
mirror-0 ONLINE 0 0 0
|
||
/disk1 ONLINE 0 0 0
|
||
/disk2 ONLINE 0 0 0
|
||
/disk3 ONLINE 0 0 0
|
||
|
||
errors: No known data errors
|
||
[root@zfs /]#
|
||
```
|
||
|
||
Вместо зеркалирования можно использовать массивы `RAID`. Для этого необходимо создавать пул типа `raidz` вместо `mirror`. Подробнее <https://docs.freebsd.org/en/books/handbook/zfs/>.
|
||
|
||
[вверх](#zfs-справочник-команд)
|
||
|
||
Давайте теперь исключим один из дисков из пула. Так как этот диск относится к зеркалу `MIRROR`, то при его исключении никаких проблем не возникает.
|
||
|
||
```bash
|
||
[root@zfs /]# zpool detach myzfs /disk3
|
||
[root@zfs /]# zpool status
|
||
pool: myzfs
|
||
state: ONLINE
|
||
config:
|
||
|
||
NAME STATE READ WRITE CKSUM
|
||
myzfs ONLINE 0 0 0
|
||
mirror-0 ONLINE 0 0 0
|
||
/disk1 ONLINE 0 0 0
|
||
/disk2 ONLINE 0 0 0
|
||
|
||
errors: No known data errors
|
||
[root@zfs /]#
|
||
```
|
||
|
||
Теперь давайте добавим к пулу новый диск. Если пул не был зеркальным, то он им станет после добавления нового диска.
|
||
|
||
```bash
|
||
[root@zfs /]# zpool attach myzfs /disk1 /disk3
|
||
[root@zfs /]# zpool status
|
||
pool: myzfs
|
||
state: ONLINE
|
||
scan: resilvered 152K in 00:00:00 with 0 errors on Wed Apr 3 16:10:22 2024
|
||
config:
|
||
|
||
NAME STATE READ WRITE CKSUM
|
||
myzfs ONLINE 0 0 0
|
||
mirror-0 ONLINE 0 0 0
|
||
/disk1 ONLINE 0 0 0
|
||
/disk2 ONLINE 0 0 0
|
||
/disk3 ONLINE 0 0 0
|
||
|
||
errors: No known data errors
|
||
[root@zfs /]#
|
||
```
|
||
|
||
А что будет, если попытаемся *удалить*, а не исключить устройство из пула? Zpool сообщит нам о том, что устройство не может быть удалено. Для начала его нужно отключить.
|
||
|
||
```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 /]#
|
||
```
|
||
|
||
Теперь давайте попробуем добавить диск горячей замены `hot spare` к нашему пулу.
|
||
|
||
```bash
|
||
zpool add myzfs spare /disk3
|
||
zpool status
|
||
|
||
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
|
||
```
|
||
|
||
А теперь удалим его из пула.
|
||
|
||
```bash
|
||
[root@zfs /]# zpool remove myzfs /disk3
|
||
[root@zfs /]# zpool status
|
||
pool: myzfs
|
||
state: ONLINE
|
||
config:
|
||
|
||
NAME STATE READ WRITE CKSUM
|
||
myzfs ONLINE 0 0 0
|
||
mirror-0 ONLINE 0 0 0
|
||
/disk1 ONLINE 0 0 0
|
||
/disk2 ONLINE 0 0 0
|
||
|
||
errors: No known data errors
|
||
[root@zfs /]#
|
||
```
|
||
|
||
[вверх](#zfs-справочник-команд)
|
||
|
||
Теперь попробуем отключить один из дисков. Пока диск отключен, на него не будет производиться запись и с него не будет производиться чтение. Если использовать параметр `-t`, то при перезагрузке сервера диск вернется в состояние онлайн автоматически.
|
||
|
||
```bash
|
||
[root@zfs /]# zpool offline myzfs /disk1
|
||
[root@zfs /]# zpool status
|
||
pool: myzfs
|
||
state: DEGRADED
|
||
status: One or more devices has been taken offline by the administrator.
|
||
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'.
|
||
config:
|
||
|
||
NAME STATE READ WRITE CKSUM
|
||
myzfs DEGRADED 0 0 0
|
||
mirror-0 DEGRADED 0 0 0
|
||
/disk1 OFFLINE 0 0 0
|
||
/disk2 ONLINE 0 0 0
|
||
|
||
errors: No known data errors
|
||
[root@zfs /]#
|
||
```
|
||
|
||
Обратите внимание на состояние пула: **DEGRADED**
|
||
|
||
Теперь включим этот диск.
|
||
|
||
```bash
|
||
[root@zfs /]# zpool online myzfs /disk1
|
||
[root@zfs /]# zpool status
|
||
pool: myzfs
|
||
state: ONLINE
|
||
scan: resilvered 36K in 00:00:00 with 0 errors on Wed Apr 3 16:24:12 2024
|
||
config:
|
||
|
||
NAME STATE READ WRITE CKSUM
|
||
myzfs ONLINE 0 0 0
|
||
mirror-0 ONLINE 0 0 0
|
||
/disk1 ONLINE 0 0 0
|
||
/disk2 ONLINE 0 0 0
|
||
|
||
errors: No known data errors
|
||
[root@zfs /]#
|
||
```
|
||
|
||
Состояние пула снова **ONLINE**.
|
||
|
||
В данный момент в нашем пуле два диска: disk1 и disk2. Также в системе имеется диск disk3, но он не подключен к пулу. Предположим, что disk1 вышел из строя и его нужно заменить на disk3.
|
||
|
||
```bash
|
||
[root@zfs /]# zpool replace myzfs /disk1 /disk3
|
||
[root@zfs /]# zpool status
|
||
pool: myzfs
|
||
state: ONLINE
|
||
scan: resilvered 264K in 00:00:00 with 0 errors on Wed Apr 3 16:26:44 2024
|
||
config:
|
||
|
||
NAME STATE READ WRITE CKSUM
|
||
myzfs ONLINE 0 0 0
|
||
mirror-0 ONLINE 0 0 0
|
||
/disk3 ONLINE 0 0 0
|
||
/disk2 ONLINE 0 0 0
|
||
|
||
errors: No known data errors
|
||
[root@zfs /]#
|
||
```
|
||
|
||
Периодически для исправления ошибок необходимо выполнять процедуру чистки (scrubbing) для пулов типа *MIRROR* или *RAID-Z*. Данная процедура находит ошибки в контрольных суммах и исправляет их. Также восстанавливаются сбойные блоки.
|
||
|
||
**Данная операция слишком ресурсоемка! Следует выполнять ее только во время наименьшей нагрузки на пул.**
|
||
|
||
```bash
|
||
[root@zfs /]# zpool scrub myzfs
|
||
[root@zfs /]#
|
||
```
|
||
|
||
Если необходимо перенести пул в другую систему, то его необходимо сначала экспортировать.
|
||
|
||
```bash
|
||
[root@zfs /]# zpool export myzfs
|
||
[root@zfs /]# zpool list
|
||
no pools available
|
||
[root@zfs /]#
|
||
```
|
||
|
||
[вверх](#zfs-справочник-команд)
|
||
|
||
А затем импортировать в новой системе.
|
||
|
||
Если ключ `-d` не указать, то команда ищет `/dev/dsk`. Так как в данном примере мы используем файлы, необходимо указать директорию с файлами используемыми хранилищем.
|
||
|
||
```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 /]#
|
||
```
|
||
|
||
Обновление версии пула. Показать версию используемого пула. Флаг `-v` показывает возможности, поддерживаемые данным пулом. Используйте флаг `-a`, чтобы обновить все доступные пулы до новейшей из них версии. Обновленные пулы больше не будут доступны из систем, на которых работают более старые версии.
|
||
|
||
```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:
|
||
|
||
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
|
||
6 bootfs pool property
|
||
7 Separate intent log devices
|
||
8 Delegated administration
|
||
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 /]#
|
||
```
|
||
|
||
Если нужно получить статистику по операциям ввода/вывода пулов, выполняем команду.
|
||
|
||
```bash
|
||
[root@zfs /]# zpool iostat 5
|
||
capacity operations bandwidth
|
||
pool alloc free read write read write
|
||
---------- ----- ----- ----- ----- ----- -----
|
||
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 /]#
|
||
```
|
||
|
||
[вверх](#zfs-справочник-команд)
|
||
|
||
## Работа с файловой и другими системами ZFS
|
||
|
||
### Файловая система
|
||
|
||
Создадим файловую систему в нашем пуле. Затем проверим автомонтирование новой файловой системы.
|
||
|
||
```bash
|
||
[root@zfs /]# zfs create myzfs/colin
|
||
[root@zfs ~]# df -Th | grep zfs
|
||
myzfs zfs 832M 128K 832M 1% /myzfs
|
||
myzfs/colin zfs 832M 128K 832M 1% /myzfs/colin
|
||
[root@zfs ~]#
|
||
```
|
||
|
||
Получить список файловых систем ZFS можно следующей командой.
|
||
|
||
```bash
|
||
[root@zfs /]# zfs list
|
||
NAME USED AVAIL REFER MOUNTPOINT
|
||
myzfs 171K 832M 24K /myzfs
|
||
myzfs/colin 24K 832M 24K /myzfs/colin
|
||
[root@zfs /]#
|
||
```
|
||
|
||
В данный момент в нашем пуле имеется одно зеркало, в которое входят два диска: disk2 и disk3.
|
||
|
||
Давайте попробуем расширить наш пул. Попытаемся добавить к нему 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 ~]#
|
||
```
|
||
|
||
Попытка добавления не удалась, т.к. она неоднозначна и при добавлении диска к существующему зеркалу необходимо указать дополнительно один из
|
||
существующих в этом зеркале дисков, либо добавить минимум два диска для формирования нового зеркала, которое будет входить в данный пул.
|
||
|
||
Добавим к пулу новое зеркало, состоящее из дисков: disk1 и disk5
|
||
|
||
```bash
|
||
[root@zfs ~]# zpool add myzfs mirror /disk1 /disk5
|
||
[root@zfs ~]# zpool status
|
||
pool: myzfs
|
||
state: ONLINE
|
||
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-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 ~]#
|
||
```
|
||
|
||
Добавим теперь к пулу еще одну файловую систему и посмотрим, как это отразится на размере файловых систем, входящих в пул.
|
||
|
||
```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 --- по-умолчанию нет никакого ограничения на файловые системы.
|
||
|
||
Чтобы явно управлять объемом файловых систем, можно прибегнуть к резервированию --- выделению гарантированного объема для файловой системы, либо квотированию --- ограничению файловой системы по максимальному объему.
|
||
|
||
Давайте зарезервируем для файловой системы `/myzfs/colin` место в пуле, равное 200 Мб. Остальные файловые системы, заполняя пул, в любом случае
|
||
оставят для этой файловой системы 200 Мб места.
|
||
|
||
```bash
|
||
[root@zfs ~]# zfs set reservation=200m myzfs/colin
|
||
[root@zfs ~]# zfs list -o reservation
|
||
RESERV
|
||
none
|
||
200M
|
||
none
|
||
[root@zfs ~]#
|
||
```
|
||
|
||
Теперь для файловой системы `/myzfs/colin2` установим квоту в 250 Мб. Это означает, что данная файловая система не сможет занять в пуле более 250
|
||
Мб, даже если пул будет полностью свободным.
|
||
|
||
```bash
|
||
[root@zfs ~]# zfs set quota=250m myzfs/colin2
|
||
[root@zfs ~]# zfs list -o quota myzfs/colin myzfs/colin2
|
||
QUOTA
|
||
none
|
||
250M
|
||
[root@zfs ~]#
|
||
```
|
||
|
||
[вверх](#zfs-справочник-команд)
|
||
|
||
Также для файловой системы `/myzfs/colin2` включим сжатие. Сжатие достаточно эффективно работает на уровне ZFS практически без потерь производительности (конечно же, при условии, что производительности сервера достаточно).
|
||
|
||
ZFS использует несколько различных алгоритмов сжатия, оптимизированных для различных типов данных:
|
||
|
||
- **LZ4** – Алгоритм по-умолчанию, использующий сжатие LZ4. Предпочтение отдается скорости, а не степени сжатия.
|
||
- **LZJB** – Устаревший формат с приемлемым сжатием и скоростью.
|
||
- **Gzip** – Стандартное сжатие gzip. Несколько уровней сжатия от 1 до 9, чем выше, тем лучше, но медленнее.
|
||
- **ZLE** оптимизирован для нулевых блоков.
|
||
|
||
Алгоритмы адаптивно выбирают оптимальную стратегию сжатия для каждого типа данных.
|
||
|
||
При этом, вместо `compression=on` можно явно указать алгоритм сжатия `compression=gzip-9`, `compression=lzjb`, `compression=zle` и т.д.
|
||
|
||
```bash
|
||
[root@zfs ~]# zfs set compression=on myzfs/colin2
|
||
[root@zfs ~]# zfs list -o compression
|
||
COMPRESS
|
||
off
|
||
off
|
||
on
|
||
[root@zfs ~]#
|
||
```
|
||
|
||
Чтобы сделать файловую систему доступной по протоколу NFS, достаточно выполнить одну команду. Причем после перезагрузки сервера доступ к файловой системе утерян не будет. Никаких дополнительных настроек операционной системы производить не нужно.
|
||
|
||
```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 наверняка пригодится. В системе должен быть установлен пакет `samba-usershares`.
|
||
|
||
```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 ~]#
|
||
```
|
||
|
||
Для повышения надежности (если у вас обычный пул, без избыточности), можно использовать следующую опцию файловой системы.
|
||
|
||
```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*).
|
||
|
||
[вверх](#zfs-справочник-команд)
|
||
|
||
### Snapshots (снапшоты или снимки состояния)
|
||
|
||
Создать снапшот файловой системы очень просто. Давайте создадим снапшот для файловой системы `myzfs/colin` и назовем его *test*.
|
||
|
||
```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 ~]#
|
||
```
|
||
|
||
Если появится необходимость отката к снапшоту, достаточно выполнить одну команду.
|
||
|
||
```bash
|
||
[root@zfs ~]# zfs rollback myzfs/colin@test
|
||
```
|
||
|
||
Снапшот можно подмониторовать, как обычно. Например так.
|
||
|
||
```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 ~]#
|
||
```
|
||
|
||
Даже можно клонировать файловую системы из снапшота в новую файловую систему.
|
||
|
||
```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/colin2`
|
||
|
||
```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 ~]#
|
||
```
|
||
|
||
[вверх](#zfs-справочник-команд)
|
||
|
||
Файловая система удалилась без проблем. Теперь удалим файловую систему, для которой существует снапшот.
|
||
|
||
```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` чтобы удалить файловую систему
|
||
вместе со всеми дочерними объектами рекурсивно.
|
||
|
||
Мы можем отключить снапшот от `/myzfs/colin` и оставить его дочерним только для `/myzfs/colin3`
|
||
|
||
```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` больше нет дочерних объектов и ее можно без труда разобрать (удалить).
|
||
|
||
Если вдруг понадобиться переименовать ранее созданную файловую систему или снапшот, то можно воспользоваться следующими командами.
|
||
|
||
```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 ~]#
|
||
```
|
||
|
||
[вверх](#zfs-справочник-команд)
|
||
|
||
### Снова вернемся к пулам
|
||
|
||
Получить полную информацию о пулах можно следующим образом.
|
||
|
||
```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 -
|
||
[...]
|
||
```
|
||
|
||
Если пул нам более не нужен, можем его удалить. **(не выполняйте это сейчас. Пул нам еще понадобится далее)**
|
||
|
||
```bash
|
||
[root@zfs ~]# zpool destroy myzfs
|
||
[root@zfs ~]# zfs list
|
||
no datasets available
|
||
[root@zfs ~]# zpool status
|
||
no pools available
|
||
[root@zfs ~]#
|
||
```
|
||
|
||
Отключить файловую систему от пула можно командой `unmount` или `umount`.
|
||
|
||
```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 ~]#
|
||
```
|
||
|
||
Подключить файловую систему к пулу вот так.
|
||
|
||
```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 ~]#
|
||
```
|
||
|
||
Снапшот можно сделать и на удаленный ресурс (или другое место в локальной системе).
|
||
|
||
```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 ~]#
|
||
```
|
||
|
||
В данном случае снапшот передан `zfs receive` на локальном узле (в демонстрационных целях). В реальной ситуации таким образом можно сделать снапшот на другой узел сети.
|
||
|
||
Zpool ведет собственную историю всех команд. Посмотреть историю можно следующим образом.
|
||
|
||
```bash
|
||
[root@zfs ~]# zpool history
|
||
History for 'myzfs':
|
||
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 ~]#
|
||
```
|
||
|
||
Ну вот. Основные команды для работы с пулами ZFS усвоены.
|
||
|
||
Теперь можно удалить сам пул и файлы. Они нам больше не пригодятся.
|
||
|
||
```bash
|
||
[root@zfs ~]# zpool destroy myzfs
|
||
[root@zfs ~]#
|
||
```
|
||
|
||
[вверх](#zfs-справочник-команд)
|