FreeBSD - zfs


zpool

zpool [действие] [ключи]

Ключ Описание
-f, --force
-d Отключить все фичи по умолчанию
-o property=value включить фичу
-O file-system-property=value Настройки файловой системы
-m

точка монторования

Если ее нет, то нужно выбрать legacy или none

  1. none - без монтирования
  2. legacy - как я понимаю это наследование уровневых путей. например /export/stuff, то pool/home/user путем наследования получает значение /export/stuff/user

    Старые точки монтирования. Управление файловыми системами ZFS можно осуществлять при помощи старых средств. Для этого свойство mountpoint должно иметь значение legacy. Управление старыми файловыми системами должно осуществляться с помощью команд mount и umount и файла /etc/vfstab. ZFS не выполняет автоматическое монтирование старых файловых систем при начальной загрузке, и для наборов данных этого типа команды ZFS mount и umount не используются. В следующих примерах демонстрируется настройка и администрирование набора данных ZFS в режиме "legacy":

Шпаргалка по командам

Справка по командам

man zpool
man zfs
zpool create

Создать пул и посмотреть информацию о нём.

Интересная особенность в *nix системах - Все является файлом. В том числе и диски. Поэтому, пул дисков можно эмулировать с помощью создания файлов

Единственное ограничение, диск (или файл) должен быть не менее 64m для самого zfs

При создании пула, создается фс от корня по названию пула


# cd /
# mkfile 100m disk1 disk2 disk3
# ls -l disk*
-rw-------  1 root  wheel  104857600 Jan 27 14:42 disk1
-rw-------  1 root  wheel  104857600 Jan 27 14:42 disk2
-rw-------  1 root  wheel  104857600 Jan 27 14:42 disk3
-rw-------  1 root  wheel   73400320 Jan 20 19:58 disk4
# zpool create test01 /disk1 /disk2
# zpool list
NAME     SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
test01   160M    62K   160M         -     1%     0%  1.00x  ONLINE  -
zpool status

Подробная информация о пуле

Пока не увидел разницу от ключа -v


# zpool status -v
  pool: test01
 state: ONLINE
  scan: none requested
config:

    NAME        STATE     READ WRITE CKSUM
    test01      ONLINE       0     0     0
      /disk1    ONLINE       0     0     0
      /disk2    ONLINE       0     0     0

errors: No known data errors
zpool destroy

Уничтожить пул

При уничтожении пула, уничтожается и фс!


# zpool destroy test01
zpool create mirror

Создать зеркалированный пул


# zpool create test02 mirror /disk1 /disk2 
# zpool list
NAME     SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
test02    80M   242K  79.8M         -     1%     0%  1.00x  ONLINE  -

# mkfile 70m disk4
# zpool create test03 mirror /disk3 /disk4 
invalid vdev specification
use '-f' to override the following errors:
mirror contains devices of different sizes

При создании зеркала разного размера, выдется ошибка

В этом случае можно указать ключ -f для принудительного создания. Тогда размер пула будет наименьшим из дисков


# zpool create -f test03 mirror /disk3 /disk4 
# zpool list
NAME     SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
test03    64M    62K  63.9M         -     1%     0%  1.00x  ONLINE  -
zpool detach

Отключить диск от зеркала


# zpool status
  pool: test02
 state: ONLINE
  scan: resilvered 70K in 0h0m with 0 errors on Sat Jan 20 18:18:35 2018
config:

    NAME        STATE     READ WRITE CKSUM
    test02      ONLINE       0     0     0
      mirror-0  ONLINE       0     0     0
        /disk2  ONLINE       0     0     0
        /disk1  ONLINE       0     0     0

errors: No known data errors
# zpool detach test02 /disk1
# zpool list
NAME     SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
test02    80M   124K  79.9M         -     1%     0%  1.00x  ONLINE  -
# zpool status
  pool: test02
 state: ONLINE
  scan: none requested
config:

    NAME        STATE     READ WRITE CKSUM
    test02      ONLINE       0     0     0
      /disk2    ONLINE       0     0     0

errors: No known data errors
zpool attach

Добавить диск к зеркалу

Нужно передовать 2 диска, с какого на какой скопируются данные для дальнейшего зеркалирования


# zpool attach test02 /disk2 /disk1
# zpool status
  pool: test02
 state: ONLINE
  scan: resilvered 70K in 0h0m with 0 errors on Sat Jan 20 18:18:35 2018
config:

    NAME        STATE     READ WRITE CKSUM
    test02      ONLINE       0     0     0
      mirror-0  ONLINE       0     0     0
        /disk2  ONLINE       0     0     0
        /disk1  ONLINE       0     0     0

errors: No known data errors
zpool replace

Заменить диск


        # zpool list
NAME     SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
test01   160M   256K   160M         -     1%     0%  1.00x  ONLINE  -
# zpool status
  pool: test01
 state: ONLINE
  scan: none requested
config:

    NAME        STATE     READ WRITE CKSUM
    test01      ONLINE       0     0     0
      /disk1    ONLINE       0     0     0
      /disk2    ONLINE       0     0     0

errors: No known data errors
# zpool replace test01 /disk1 /disk3 
# zpool status
  pool: test01
 state: ONLINE
  scan: resilvered 27K in 0h0m with 0 errors on Sat Jan 27 16:15:06 2018
config:

    NAME        STATE     READ WRITE CKSUM
    test01      ONLINE       0     0     0
      /disk3    ONLINE       0     0     0
      /disk2    ONLINE       0     0     0

errors: No known data errors
        
zpool add spare

Добавить запасное устройство

Автоматическая замена вышедшего из строя устройства. TODO: проверить

zpool add test01 spare /disk3 
# zpool status
  pool: test01
 state: ONLINE
  scan: none requested
config:

    NAME        STATE     READ WRITE CKSUM
    test01      ONLINE       0     0     0
      mirror-0  ONLINE       0     0     0
        /disk1  ONLINE       0     0     0
        /disk2  ONLINE       0     0     0
    spares
      /disk3    AVAIL   

errors: No known data errors

Заменить диск на запасной

zpool replace test01 /disk1 /disk3 
# zpool status
  pool: test01
 state: ONLINE
  scan: resilvered 71.5K in 0h0m with 0 errors on Sat Jan 27 18:03:57 2018
config:

    NAME                   STATE     READ WRITE CKSUM
    test01                 ONLINE       0     0     0
      mirror-0             ONLINE       0     0     0
        spare-0            ONLINE       0     0     0
          /disk1           ONLINE       0     0     0
          /disk3           ONLINE       0     0     0
        /disk2             ONLINE       0     0     0
    spares
      9988242779740387816  INUSE     was /disk3

errors: No known data errors
# zpool detach test01 /disk1
# zpool status
  pool: test01
 state: ONLINE
  scan: resilvered 74.5K in 0h0m with 0 errors on Sat Jan 27 18:07:32 2018
config:

    NAME        STATE     READ WRITE CKSUM
    test01      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
zpool remove

Удалить запасное устройство


# zpool remove test01 /disk4
zpool offline

Вывести указанное устройство из эксплуатации

После этого попыток писать и читать это устройство не будет до тех пор, пока оно не будет переведено в online. Если использовать ключ -t, устройство будет переведено в offline временно. После перезагрузки устройство опять будет в работе (online).


      # zpool status
pool: test01
 state: ONLINE
  scan: none requested
config:

    NAME        STATE     READ WRITE CKSUM
    test01      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
# zpool offline test01 /disk2
# zpool status
  pool: test01
 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'.
  scan: none requested
config:

    NAME                      STATE     READ WRITE CKSUM
    test01                    DEGRADED     0     0     0
      mirror-0                DEGRADED     0     0     0
        /disk1                ONLINE       0     0     0
        14576361860791797662  OFFLINE      0     0     0  was /disk2

errors: No known data errors
zpool online

Включить диск


# zpool online test01 /disk1
# zpool status
  pool: test01
 state: ONLINE
  scan: resilvered 4.50K in 0h0m with 0 errors on Sat Jan 20 18:49:21 2018
config:

    NAME        STATE     READ WRITE CKSUM
    test01      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
zpool scrub

Выполнить скраббинг «чистку» хранилища.

Для того чтобы знать, что там все контрольные суммы верны. Если используется зеркало или RAIDZ автоматически восстанавливаются сбойные блоки.

/test01 # zpool scrub test01
zpool export

Экспортировать пул для импорта в другую систему


# zpool export test01
# zpool list
NAME     SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
test02   160M   128M  31.9M         -    60%    80%  1.00x  ONLINE  -
zpool import

Импортировать пул

Если ключ -d не указан, команда ищет /dev/dsk.

Поскольку в примере используются файлы нужно указать каталог где они лежат


# zpool import -d / test01
# zpool list
NAME     SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
test01    80M  48.1M  31.9M         -    45%    60%  1.00x  ONLINE  -
test02   160M   128M  31.9M         -    60%    80%  1.00x  ONLINE  -
zpool upgrade

Показать версию формата пулов

У меня не работает :(


# zpool upgrade
This system supports ZFS pool feature flags.

All pools are formatted using feature flags.

Every feature flags pool has all supported features enabled.

Ключ -v говорит, что нужно показать какие функции поддерживаются текущей версией.


# zpool upgrade -v
This system supports ZFS pool feature flags.

The following features are supported:

FEAT DESCRIPTION
-------------------------------------------------------------
async_destroy                         (read-only compatible)
...
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
 ...

Ключ -a говорит, что нужно обновить до последней версии.


zpool iostat

Посмотреть статистику ввода/вывода


# zpool iostat 1
               capacity     operations    bandwidth
pool        alloc   free   read  write   read  write
----------  -----  -----  -----  -----  -----  -----
test01       234K  79.8M      0      0     85    336
test01       234K  79.8M      0      0      0      0
zfs create

Создать файловую систему

Проверить её с помощью df -h. Файловая система автоматически монтируется в /test01.


# zfs list
NAME     USED  AVAIL  REFER  MOUNTPOINT
test01  68.5K   128M    19K  /test01
# zfs create test01/test02
# zfs list
NAME            USED  AVAIL  REFER  MOUNTPOINT
test01           92K   128M    19K  /test01
test01/test02    19K   128M    19K  /test01/test02
/ # df -h
Filesystem       Size    Used   Avail Capacity  Mounted on
/dev/ada0p2      9.0G    4.5G    3.8G    55%    /
devfs            1.0K    1.0K      0B   100%    /dev
test01           128M     19K    128M     0%    /test01
test01/test02    128M     19K    128M     0%    /test01/test02

Создание ещё одной файловой системы. Обратите внимание, что обе файловые системы как будто бы имеют 128M свободных, ибо квоты не установлены. Каждая может расти до тех пор, пока не заполнит пул:


# zfs list
NAME            USED  AVAIL  REFER  MOUNTPOINT
test01          112K   128M    19K  /test01
test01/test02    19K   128M    19K  /test01/test02
test01/test03    19K   128M    19K  /test01/test03
zfs list

Список zfs файловых систем


# zfs list
NAME            USED  AVAIL  REFER  MOUNTPOINT
test01         48.1M      0    19K  /test01
test01/test02  47.9M      0  47.9M  /test01/test02
test02          128M      0   128M  /test02

Также можно посмотреть командой df


# df -h
Filesystem       Size    Used   Avail Capacity  Mounted on
/dev/ada0p2      9.0G    4.5G    3.7G    55%    /
devfs            1.0K    1.0K      0B   100%    /dev
test02           128M    128M      0B   100%    /test02
test01            19K     19K      0B   100%    /test01
test01/test02     48M     48M      0B   100%    /test01/test02
zfs set reservation

Установка резервирования фс

Проверка

# zfs set reservation=20m test01/test02
# zfs list -o reservation
RESERV
  none
   20M
  none
zfs set quota

Установить и показать квоты.

Максимальное занимаемое место


# zfs set quota=20m test02/test03
root@freebsd2:~ # zfs list -o quota
QUOTA
 none
  20M
# cat /dev/urandom > /test02/test03/file2
cat: stdout: Disc quota exceeded
root@freebsd2:/test02/test03 # ls -lh
total 20499
-rw-r--r--  1 root  wheel    20M Jan 27 20:09 file2
# touch /test02/test03/file3
touch: /test02/test03/file3: Disc quota exceeded

Но ее можно увеличить


# zfs set quota=30m test02/test03
# cat /dev/urandom > /test02/test03/file3
cat: stdout: Disc quota exceeded
# ls -lh /test02/test03/
total 30747
-rw-r--r--  1 root  wheel    20M Jan 27 20:09 file2
-rw-r--r--  1 root  wheel    10M Jan 27 20:13 file3
zfs set compression

Включить сжатие

Проверка

# zfs set compression=on test02/test03
root@freebsd2:~ # cat /dev/urandom > /test02/test03/file1
cat: stdout: No space left on device
root@freebsd2:~ # ls -lh /test02/test03/
total 130914
-rw-r--r--  1 root  wheel   128M Jan 27 20:18 file1
zfs snapshot

Создать snapshot под названием test-27-01-2018


# zfs snapshot test01/test02@test-27-01-2018

Для вывода снапшотов нужно либо:

использовать ключ -t snapshot


# zfs list -t snapshot
NAME                            USED  AVAIL  REFER  MOUNTPOINT
test01/test02@test-27-01-2018      0      -  50.1M  -

Либо установить у пула параметр listsnapshot=on


# zpool get listsnapshots test01
NAME    PROPERTY       VALUE      SOURCE
test01  listsnapshots  off        default
# zpool set listsnapshots=on test01
# zfs list
NAME                            USED  AVAIL  REFER  MOUNTPOINT
test01                         50.1M  77.9M    19K  /test01
test01/test02                  50.1M  77.9M  50.1M  /test01/test02
test01/test02@test-27-01-2018      0      -  50.1M  -
zfs rollback

Откатиться на снапшот


# ls -lh /test01/test02/
total 51240
-rw-r--r--  1 root  wheel    50M Jan 27 21:02 file1
# echo "hi" > /test01/test02/test
# ls -lh /test01/test02/
total 51240
-rw-r--r--  1 root  wheel    50M Jan 27 21:02 file1
-rw-r--r--  1 root  wheel     3B Jan 27 21:21 test
# zfs list
NAME                            USED  AVAIL  REFER  MOUNTPOINT
test01                         50.2M  77.8M    19K  /test01
test01/test02                  50.1M  77.8M  50.1M  /test01/test02
test01/test02@test-27-01-2018     9K      -  50.1M  -
# zfs rollback test01/test02@test-27-01-2018
# ls -lh /test01/test02/
total 51240
-rw-r--r--  1 root  wheel    50M Jan 27 21:02 file1
zfs clone

Клонирование фс.

Также используется для просмотра содержимого снапшота


# rm /test01/test02/file1 
# echo "hi" >> /test01/test02/file2
# zfs list
NAME                            USED  AVAIL  REFER  MOUNTPOINT
test01                         50.2M  77.8M    19K  /test01
test01/test02                  50.1M  77.8M  19.5K  /test01/test02
test01/test02@test-27-01-2018  50.0M      -  50.1M  -
# zfs clone test01/test02@test-27-01-2018 test01/test03 
# ls -lhR /test01/*
/test01/test02:
total 1
-rw-r--r--  1 root  wheel     3B Jan 27 21:30 file2

/test01/test03:
total 51240
-rw-r--r--  1 root  wheel    50M Jan 27 21:02 file1
zfs destroy

Уничтожение фс


# zfs list    
NAME                            USED  AVAIL  REFER  MOUNTPOINT
test01                         50.2M  77.8M    19K  /test01
test01/test02                  50.1M  77.8M  50.1M  /test01/test02
test01/test02@test-27-01-2018     9K      -  50.1M  -
test01/test03                     9K  77.8M  50.1M  /test01/test03
[root@freebsd2 ~]# zfs destroy test01/test03

Если в фс есть вложенные фс, то будет предложенно удалить рекурсивно


# zfs destroy test01/test02
cannot destroy 'test01/test02': filesystem has children
use '-r' to destroy the following datasets:
test01/test02@test-27-01-2018
# zfs destroy -r test01/test02
# zfs list
NAME     USED  AVAIL  REFER  MOUNTPOINT
test01   103K   128M    19K  /test01

Также будут удалены связанные снапшоты

zfs promote

Вынисение клонированной фс

Переключение всех снапшотов с оригинальной фс, на копию


# zfs list
NAME                       USED  AVAIL  REFER  MOUNTPOINT
test01                     123M  4.61M    19K  /test01
test01/test02              123M  4.61M   123M  /test01/test02
test01/test02@27-01-2018      0      -   123M  -
# zfs clone test01/test02@27-01-2018 test01/test03
# zfs destroy test01/test02@27-01-2018
cannot destroy 'test01/test02@27-01-2018': snapshot has dependent clones
use '-R' to destroy the following datasets:
test01/test03@27-01-2018
test01/test03


test

test


Эксперименты

№ 1

4 файла по 100мб

cd /
# mkfile 100m disk1 disk2 disk3 disk4
# ls -lh /disk*
-rw-------  1 root  wheel   100M Jan 27 18:27 /disk1
-rw-------  1 root  wheel   100M Jan 27 18:27 /disk2
-rw-------  1 root  wheel   100M Jan 27 18:27 /disk3
-rw-------  1 root  wheel   100M Jan 27 18:27 /disk4

Первый зеркальный пул - size 80мб


# zpool create test01 mirror /disk1 /disk2 
# zpool list
NAME     SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
test01    80M    62K  79.9M         -     1%     0%  1.00x  ONLINE  -

Помещается 48мб, еще свободно 32мб но создать уже ничего не получается!


# cd /test01/
root@freebsd2:/test01 # cat /dev/urandom > test
cat: stdout: No space left on device
root@freebsd2:/test01 # ls -lh 
total 49065
-rw-r--r--  1 root  wheel    48M Jan 27 18:31 test
root@freebsd2:/test01 # zpool list
NAME     SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
test01    80M  48.0M  32.0M         -    44%    60%  1.00x  ONLINE  -
# touch test1
touch: test1: No space left on device

Вопрос почему?

№ 2

Пул из 2 обьединенных дисков по 100мб, size - 160мб


# zpool create test02 /disk3 /disk4 
root@freebsd2:/test01 # zpool list
NAME     SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
test02   160M   257K   160M         -     1%     0%  1.00x  ONLINE  -

Помещается 128мб, свободно опять осталось 32мб


# cd /test02/
# cat /dev/urandom > test
cat: stdout: No space left on device
root@freebsd2:/test02 # ls -lh
total 131041
-rw-r--r--  1 root  wheel   128M Jan 27 18:37 test
# zpool list
NAME     SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
test02   160M   128M  31.9M         -    60%    80%  1.00x  ONLINE  -
№ 3

Пул из примера 2, размер 160мб, реально вмещается 128мб

Зарезервируем 30мб и посмотрим сколько вместиться


# zfs set reservation=30m test02
root@freebsd2:~ # cd /test02
root@freebsd2:/test02 # cat /dev/urandom > test
cat: stdout: No space left on device
root@freebsd2:/test02 # ls -lh
total 131041
-rw-r--r--  1 root  wheel   128M Jan 27 19:42 test
root@freebsd2:/test02 # zfs list -o reservation
RESERV
   30M

Хоть и зарезервировали но сожрали все место

Попробуем добавить вложенную фс и установить для нее резервирование


# zfs create test02/test03
# zfs set reservation=30m test02/test03
# cat /dev/urandom > /test02/file
cat: stdout: No space left on device
# ls -lh /test02/
total 100174
-rw-r--r--  1 root  wheel    98M Jan 27 19:55 file
drwxr-xr-x  2 root  wheel     2B Jan 27 19:55 test03

Урааа получилось! но почему-то использовать мы можем не все 30мб


# zfs list
NAME            USED  AVAIL  REFER  MOUNTPOINT
test02          128M  41.5K  97.8M  /test02
test02/test03    19K  30.0M    19K  /test02/test03
# cat /dev/urandom > /test02/test03/file2
cat: stdout: No space left on device
# ls -lh /test02/test03
total 7943
-rw-r--r--  1 root  wheel   7.8M Jan 27 19:56 file2

Даже df говорит что у меня есть еще 22мб, но даже временную метку не получается создать


# df -h
Filesystem       Size    Used   Avail Capacity  Mounted on
/dev/ada0p2      9.0G    4.5G    3.7G    55%    /
devfs            1.0K    1.0K      0B   100%    /dev
test02            98M     98M      0B   100%    /test02
test02/test03     30M    7.8M     22M    26%    /test02/test03
# touch /test02/test03/hello
touch: /test02/test03/hello: No space left on device
№ 4

Создаем 2 фс


# dd if=/dev/urandom of=big_file bs=10M count=5
5+0 records in
5+0 records out
52428800 bytes transferred in 1.894308 secs (27677022 bytes/sec)
root@freebsd2:~ # cp big_file /test01/test04/ /test02/test03/
root@freebsd2:~ # ls -lh /test01/test04/ /test02/test03/
/test01/test04/:
total 51240
-rw-r--r--  1 root  wheel    50M Jan 27 20:36 big_file

/test02/test03/:
total 51240
-rw-r--r--  1 root  wheel    50M Jan 27 20:36 big_file
root@freebsd2:~ # df -h 
Filesystem       Size    Used   Avail Capacity  Mounted on
/dev/ada0p2      9.0G    4.6G    3.7G    55%    /
devfs            1.0K    1.0K      0B   100%    /dev
test01            78M     19K     78M     0%    /test01
test02            78M     19K     78M     0%    /test02
test02/test03    128M     50M     78M    39%    /test02/test03
test01/test04    128M     50M     78M    39%    /test01/test04

Чет без разницы