В этой статье продемонстрировано: установка 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:
Выше мы из 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 функций.