В этой статье продемонстрировано: установка ZFS на Debian 12, создание ZFS пулов (zpool) и получение информации о них.

Термины

Перед тем как приступить к созданию пулов (массивов) ZFS, нужно изучить некоторые понятия. Пул ZFS (zpool) состоит из виртуальных устройств (vdev). Vdev-ом могут быть: одиночный диск или массив дисков (mirror, raidz, raidz2, raidz3). И Vdev могут быть разными типами:

  • Storage vdev — служит для хранения данных, может быть одиночным диском или массивом.
  • Cache vdev — служит для ускорения произвольного чтения. Если в вашем пуле медленные Storage vdev, то желательно добавить в него Cache vdev на базе быстрого диска. Cache vdev может быть только одиночным диском и не может быть массивом. Но вы можете сделать его из нескольких дисков, как stripe массив.
  • Log vdev (Zill) — предоставляет возможность вести синхронную запись на отдельное устройство. ZFS синхронную запись ведёт через специальный журнал, который называется ZILL. Вот этот ZILL можно вынести на отдельные диски. Если не создавать отдельный Vdev для ZILL, то синхронная запись будет вестись на Storage vdev но всё равно через ZILL. То есть Log vdev немного облегчает работу Storage vdev, снимая с него нагрузку ZILL.
  • Special vdev — представляет возможность выделить отдельный Vdev, на базе быстрого диска. На этот Vdev будут сохраняться метаданные и маленькие файлы.

Например у вас 6 HDD и 6 SSD, тогда вы сможете собрать следующий Zpoll:

Zpool из 6 HDD и 6 SSD

Выше мы из 6 HDD дисков создали 3 mirror (3 vdev) и добавили их в пул. Также к пулу мы добавили 2 vdev из двух SSD для cache vdev. Объединили 2 SSD в mirror и добавили в пул как zill vdev. Точно также, объединили 2 SSD в mirror и добавили в пул как special vdev.

И так, про zpool и vdev я думаю вы поняли. Следующими двумя понятиями будут:

  • Dataset — разделы с файловой системой ZFS.
  • Zvol — разделы но без файловой системы. Вы можете такой раздел отформатировать как хотите, например в ext4, а затем примонтировать. Например, получите раздел ext4 с возможностями ZFS (снимки, клоны, сжатие).

Установка ZFS

Чтобы потренироваться в создании ZFS пулов (zpools), его нужно вначале установить в системе. ZFS on Linux на Debian предоставляется в виде исходного кода DKMS. Необходимо добавить раздел contrib в репозитории, чтобы иметь возможность получать пакеты. Кроме того, команда Debian ZFS on Linux рекомендует устанавливать пакеты, связанные с ZFS, из архива Backports.

Кратко, установка zfs на Debian 12 выглядит следующим образом:

# nano /etc/apt/sources.list
deb http://deb.debian.org/debian/ bookworm-backports main contrib non-free

# apt update
# apt dist-upgrade -y
# apt install -y linux-headers-`uname -r`
# apt install -y -t stable-backports zfsutils-linux zfs-dkms

Создание пулов

Создание zpool из 1 диска

Шаблон команды: zpool create -f -o ashift=12 <название пула> <диск>, пример:

# zpool create -f -o ashift=12 zfs-data /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi1

Создание zpool из 2 дисков (stripe)

Здесь мы каждый диск превращаем в vdev и добавляем в пул. При этом мы получаем своеобразный RAID-0 (stripe).

Шаблон для создания пула из 2 дисков (подобие RAID-0): zpool create -f -o ashift=12 <название пула> <диск_1> <диск_2>, например:

# zpool create -f -o ashift=12 zfs-data \
 /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi1 \
 /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi2

Создание zpool из 2 дисков (mirror)

Здесь мы оба диска объединяем в mirror, и этот mirror помещаем в пул. При этом мы получаем пул из одного vdev, а vdev из двух дисков. Получаем своеобразный RAID-1 (mirror).

Шаблон для создания zpool из 2 дисков (mirror): zpool create -f -o ashift=12 <название пула> mirror <диск_1> <диск_2>, например:

# zpool create -f -o ashift=12 zfs-data \
 mirror \
 /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi1 \
 /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi2

Создание zpool из 4 дисков (raid-10)

Если у вас 4 диска, вы можете создать своеобразный RAID-10. Шаблон команды: zpool create -f -o ashift=12 <название пула> mirror <диск_1> <диск_2> mirror <диск_3> <диск_4>, например:

# zpool create -f -o ashift=12 zfs-data \
 mirror \
 /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi1 \
 /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi2 \
 mirror \
 /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi3 \
 /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi4

Точно также вы можете объединить 3 mirror в zpool. Или создавать mirrors из 3 дисков. То-есть можете создавать mirrors из любого количества дисков, и объединять любое количество mirrors в zpool.

Создание zpool с log vdev (mirror + mirror zill)

Например создадим 1 mirror из 2 дисков, и добавим ещё 1 mirror в качестве log vdev. Шаблон этой команды: zpool create -f -o ashift=12 <название пула> mirror <диск_1> <диск_2> log mirror <диск_3> <диск_4>. Пример:

# zpool create -f -o ashift=12 zfs-data \
 mirror \
 /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi1 \
 /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi2 \
 log mirror \
 /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi3 \
 /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi4

Создание zpool с cache vdev (mirror + stripe cache)

Например создадим 1 mirror из 2 дисков, и добавим ещё 2 диска в качестве cache vdev. Шаблон этой команды: zpool create -f -o ashift=12 <название пула> mirror <диск_1> <диск_2> cache <диск_3> <диск_4>. Напомню что cache не может быть в mirror или raidz массивах. Пример:

# zpool create -f -o ashift=12 zfs-data \
 mirror \
 /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi1 \
 /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi2 \
 cache \
 /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi3 \
 /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi4

Создание zpool на массивах raidz, raidz2, raidz3

Raidz — это своеобразный RAID-5. Контрольные суммы размазываются на все диски, поэтому мы можем потерять любой один диск без потери массива.

Raidz2 — здесь мы можем потерять 2 диска, но уменьшаем полезный дисковый объём, который можем использовать.

Raidz3 — а здесь мы можем потерять 3 диска без потери массива. Но полезный дисковый объём будет ещё меньше.

Шаблон создания таких пулов:

  • zpool create -f -o ashift=12 <название пула> raidz <диск_1> <диск_2> <диск_3> <диск_4>;
  • zpool create -f -o ashift=12 <название пула> raidz2 <диск_1> <диск_2> <диск_3> <диск_4>;
  • zpool create -f -o ashift=12 <название пула> raidz3 <диск_1> <диск_2> <диск_3> <диск_4>.

Пример:

# zpool create -f -o ashift=12 zfs-data raidz \
 /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi1 \
 /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi2 \
 /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi3 \
 /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi4

Удаление пулов

Раз мы рассматриваем zpools, и уже рассмотрели их создание, то нужно научиться их удалять. Удаляются zpools с помощью следующей команды: zpool destroy <название пула>, например:

# zpool destroy zfs-data

Просмотр информации о zpool

Смотреть структуру и статус zpool вы можете с помощью команды zpool status <название пула>. При этом вы можете использовать следующие опции:

  • -g — Отобразить GUID vdev вместо имен. Эти GUID можно использовать для команд zpool detach/offline/remove/replace.
  • -P — Отобразить полные пути для vdev, а не только последний компонент пути.
  • -s — Отображение количества операций медленного ввода-вывода. Это количество операций ввода-вывода превышающих zio_slow_io_ms миллисекунд (по умолчанию 30000). Это может указывать на проблему с хранилищем.
# zpool status zfs-data
  pool: zfs-data
 state: ONLINE
config:

        NAME                                      STATE     READ WRITE CKSUM
        zfs-data                                  ONLINE       0     0     0
          mirror-0                                ONLINE       0     0     0
            scsi-0QEMU_QEMU_HARDDISK_drive-scsi1  ONLINE       0     0     0
            scsi-0QEMU_QEMU_HARDDISK_drive-scsi2  ONLINE       0     0     0
        cache
          scsi-0QEMU_QEMU_HARDDISK_drive-scsi3    ONLINE       0     0     0
          scsi-0QEMU_QEMU_HARDDISK_drive-scsi4    ONLINE       0     0     0

errors: No known data errors

Или с ключами -P и -s:

# zpool status zfs-data -Ps
  pool: zfs-data
 state: ONLINE
config:

        NAME                                                            STATE     READ WRITE CKSUM  SLOW
        zfs-data                                                        ONLINE       0     0     0     -
          mirror-0                                                      ONLINE       0     0     0     -
            /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi1-part1  ONLINE       0     0     0     0
            /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi2-part1  ONLINE       0     0     0     0
        cache
          /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi3-part1    ONLINE       0     0     0     0
          /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi4-part1    ONLINE       0     0     0     0

errors: No known data errors

Ещё вы можете посмотреть zpool в разрезе vdev с помощью команды: zpool list -v <название пула>:

# zpool list -v zfs-data
NAME                                       SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP    HEALTH  ALTROOT
zfs-data                                  15.5G  1.69M  15.5G        -         -     0%     0%  1.00x    ONLINE  -
  mirror-0                                15.5G  1.69M  15.5G        -         -     0%  0.01%      -    ONLINE
    scsi-0QEMU_QEMU_HARDDISK_drive-scsi1  16.0G      -      -        -         -      -      -      -    ONLINE
    scsi-0QEMU_QEMU_HARDDISK_drive-scsi2  16.0G      -      -        -         -      -      -      -    ONLINE
cache                                         -      -      -        -         -      -      -      -         -
  scsi-0QEMU_QEMU_HARDDISK_drive-scsi3    16.0G   404K  16.0G        -         -     0%  0.00%      -    ONLINE
  scsi-0QEMU_QEMU_HARDDISK_drive-scsi4    16.0G   404K  16.0G        -         -     0%  0.00%      -    ONLINE

Там, где вы видите свойства: ALLOC, FREE, FRAG — это и есть vdev. В нашем примере это: mirror-0, scsi-0QEMU_QEMU_HARDDISK_drive-scsi3 и scsi-0QEMU_QEMU_HARDDISK_drive-scsi4.

Просмотр свойств (property) пулов

Каждый zpool обладает свойствами (property). Некоторые из них мы можем изменять, другие просто показывают информацию о пуле.

Получить все свойства zpool мы может с помощью такой команды: zpool get all <название пула>. Например:

# zpool get all zfs-data
NAME      PROPERTY                       VALUE                          SOURCE
zfs-data  size                           15.5G                          -
zfs-data  capacity                       0%                             -
zfs-data  altroot                        -                              default
zfs-data  health                         ONLINE                         -
zfs-data  guid                           16580578403175327528           -
zfs-data  version                        -                              default
*** Сократил вывод, так как для статьи он слишком большой ***

Но мы можем получить значение и определённого свойства: zpool get <название свойства> <название пула>.

# zpool get free zfs-data
NAME      PROPERTY  VALUE  SOURCE
zfs-data  free      63.5G  -

Доступные property

  • allocated
    • Объем хранилища в пуле.
  • capacity
    • Процент используемого пространства пула.
  • fragmentation
    • Степень фрагментации в пуле. По мере увеличения может привести к снижению производительности.
  • free
    • Объем свободного пространства, доступного в пуле. Свойство не подходит для оценки свободного пространства. Это обусловлено некоторыми факторами, включая: raidz, резервирование, квоту и подобные вещи.
  • health
    • Текущее состояние пула. Может быть:
      • ONLINE — подключено и функционирует.
      • DEGRADED — одно или несколько устройств отключены, но пул в состоянии продолжить работу.
      • FAULTED — одно или несколько vdev в состоянии сбоя. Сбоем может быть ошибки ввода вывода, или содержимое не соответствует ожидаемым значениям.
      • OFFLINE — zpool было явно переведено в автономный режим командой zpool offline.
      • REMOVED — устройство (диск) было физически удалено во время работы системы.
      • UNAVAIL — устройство не удалось открыть. Например, zpool был импортирован, когда vdev был недоступен. Тогда vdev (или диск) будет идентифицирован по уникальному идентификатору вместо его пути.
  • size
    • Общий размер пула.
  • readonly (on/off)
    • Если установлено значение on, zpool будет импортирован в режиме только для чтения.
  • autoexpand (on/off)
    • Управляет автоматическим расширением пула при увеличении пространства. Например вы заменили маленькие диски на большие и zpool автоматически расширится. Если диск является частью mirror или raidz, то все устройства в этой группе должны быть заменены до того, как новое пространство станет доступным для пула.
  • autoreplace (on/off)
    • Управляет автоматической заменой устройства. Если установлено значение off, замена устройства должна быть инициирована администратором с помощью команды zpool replace. Если установлено значение on, любое новое устройство, найденное в том же физическом местоположении, что и устройство, которое ранее принадлежало zpool, автоматически форматируется и заменяется.
  • comment
    • Текстовый комментарий относящийся к пулу. Он будет доступен даже в случае сбоя в работе пула.
  • autotrim (on/off)
    • Автоматический TRIM для поддерживающих эту опцию дисков, например для SSD. Автоматически TRIM будет выполняться с задержкой, так как будет ожидать объединения маленьких диапазонов в более крупные, а затем их обрезать. Имейте в виду, что autotrim может создать значительную нагрузку на диски.
  • listsnapshots (on/off)
    • Управляет выводом информации о снапшотах. При запуске zfs list без параметра -t, если параметр в состоянии on, то вместе с разделами будут выводиться и снапшоты.

Создание датасетов (dataset)

Чтобы создать dataset, вы можете использовать команду: zfs create <название пула>/<название раздела>. Пример:

# zfs create zfs-data/test 

Мы создали раздел zfs-data/test, при этом он смонтировался в /zfs-data/test, а файловая система на нём zfs:

# df -hT /zfs-data/test/
Файловая система Тип  Размер Использовано  Дост Использовано% Cмонтировано в
zfs-data/test    zfs     10G         128K   10G            1% /zfs-data/test

Создание томов (zvol)

Zvol — это блочное устройство, на которое можно установить файловую систему и затем смонтировать.

По умолчанию zvol создаются здесь — /dev/zvol/.

Ниже я покажу как создать zvol размером 5G. Отформатировать его в ext4, а затем примонтировать:

# zfs create -V 5G zfs-data/myzvol

# zfs list
NAME              USED  AVAIL  REFER  MOUNTPOINT
zfs-data         5.08G  9.93G    96K  /zfs-data
zfs-data/myzvol  5.08G  15.0G   856K  -
zfs-data/test      96K  9.93G    96K  /zfs-data/test

# mkdir /tmp/myzvol
# mkfs.ext4 /dev/zvol/zfs-data/myzvol
# mount /dev/zvol/zfs-data/myzvol /tmp/myzvol/

# df -hT /tmp/myzvol/
Файловая система Тип  Размер Использовано  Дост Использовано% Cмонтировано в
/dev/zd0         ext4   4,9G          24K  4,6G            1% /tmp/myzvol

Мы получили раздел с файловой системой ext4, но с поддержкой ZFS функций.

Итог

Мы научились:

  • устанавливать ZFS на Debian 12;
  • создавать zpools и смотреть их свойства;
  • создавать zfs dataset и zvol.

Я планирую писать и друге статьи по ZFS. Например, более подробно опишу dataset и zvol. Опишу создание snapshots и архивов, а также передачу их по сети. И много другое по ZFS.

Сводка
Пулы ZFS (Zpool)
Имя статьи
Пулы ZFS (Zpool)
Описание
В этой статье продемонстрировано: установка ZFS на Debian 12, создание ZFS пулов (zpool) и получение информации о них

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *