Работа с ZFS

Работа с ZFS

Я всё чаще стал использовать файловую систему #ZFS и для себя составил шпаргалку по работе с ней. Может быть, кому то ещё пригодится.

Вводные данные

В работе с #ZFS я использую ОС #Debian и пути к дискам (by-path). Если кто-то захочет использовать идентификаторы (by-id) дисков, то просто замените в командах пути на идентификаторы.

В командах этой статьи я работаю в пулом под названием data. Все вводные переменные я выношу за пределы команды и объявляю отдельно. Не знаю откуда у меня возникла такая привычка. 😄

Список дисков и их расположение

Вывести список дисков и их расположение (путь) в системе:

1
ls -l '/dev/disk/by-path/'

Список дисков и их идентификаторы

Вывести список дисков и их идентификаторы в системе:

1
ls -l '/dev/disk/by-id/'

Пулы

Рассмотрим различные варианты работы с пулами #ZFS.

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

Создание обычного пула data из одного диска pci-0000:01:00.0-scsi-0:1:0:0:

1
p='data'; zpool create -o 'ashift=12' -O 'atime=off' "${p}" 'pci-0000:01:00.0-scsi-0:1:0:0'

Расширение пула

Расширение пула происходит путём добавления дополнительного диска или увеличением размера виртуального диска.

Добавление диска в пул

Добавление диска pci-0000:01:00.0-scsi-0:1:1:0 в пул data:

1
p='data'; zpool add "${p}" 'pci-0000:01:00.0-scsi-0:1:1:0'

Расширение диска в пуле

Расширение существующего диска pci-0000:03:00.0-scsi-0:1:0:0 в пуле data:

1
p='data'; zpool online -e "${p}" 'pci-0000:03:00.0-scsi-0:1:0:0'

Включение автоматического расширения пула data:

1
p='data'; zpool set 'autoexpand=on' "${p}"

Подключение и отключение дисков

Подключение и отключение дисков осуществляются командами attach и detach, соответственно.

Подключение второго диска (для создания зеркала)

Подключение нового диска pci-0000:03:00.0-scsi-0:1:1:0 к существующему диску pci-0000:03:00.0-scsi-0:1:0:0 в пуле data для создания зеркала:

1
p='data'; zpool attach "${p}" 'pci-0000:03:00.0-scsi-0:1:0:0' 'pci-0000:03:00.0-scsi-0:1:1:0'

Отключение второго диска

Отключение нового диска pci-0000:03:00.0-scsi-0:1:1:0 в пуле data:

1
p='data'; zpool detach "${p}" 'pci-0000:03:00.0-scsi-0:1:1:0'

Импортирование пула

Импортировать пул data, состоящий из дисков pci-0000:01:00.0-scsi-0:1:0:0 и pci-0000:01:00.0-scsi-0:1:1:0:

1
p='data'; zpool import -d 'pci-0000:01:00.0-scsi-0:1:0:0' -d 'pci-0000:01:00.0-scsi-0:1:1:0' "${p}"

Или можно разрешить #ZFS автоматически поискать диски пула data:

1
p='data'; zpool import -d '/dev/disk/by-path/' "${p}"

Переименования пула

Для переименования пула, необходимо сначала его экспортировать:

1
p='data'; zpool export "${p}"

И импортировать с новым именем:

1
p='data_old'; n='data_new'; zpool import "${p}" "${n}"

Обновление пула

Проверим необходимость обновления пула:

1
zpool status -v

Если появится надпись status: Some supported features are not enabled on the pool..., то можно начать обновление пула data:

1
p='data'; zpool upgrade "${p}"

Или обновить сразу все пулы:

1
zpool upgrade -a

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

Если пул data стал не нужен, его можно удалить:

1
p='data'; zpool destroy "${p}"

Список пулов

Вывести список всех пулов в системе:

1
zpool list

Статус пула

Проверить статус пула data:

1
p='data'; zpool status -v "${p}"

Работа с RAID

Рассмотрим команды создания пула #ZFS из нескольких дисков.

Stripe (RAID0)

Создать RAID-0 из дисков pci-0000:01:00.0-scsi-0:1:0:0 и pci-0000:01:00.0-scsi-0:1:1:0:

1
p='data'; zpool create -o 'ashift=12' -O 'atime=off' "${p}" 'pci-0000:01:00.0-scsi-0:1:0:0' 'pci-0000:01:00.0-scsi-0:1:1:0'

Mirror (RAID1)

Создать зеркало (RAID-1) из дисков pci-0000:01:00.0-scsi-0:1:0:0 и pci-0000:01:00.0-scsi-0:1:1:0:

1
p='data'; zpool create -o 'ashift=12' -O 'atime=off' "${p}" mirror 'pci-0000:01:00.0-scsi-0:1:0:0' 'pci-0000:01:00.0-scsi-0:1:1:0'

RAID10

Создать RAID-10 из дисков pci-0000:01:00.0-scsi-0:1:0:0, pci-0000:01:00.0-scsi-0:1:1:0, pci-0000:01:00.0-scsi-0:1:2:0 и pci-0000:01:00.0-scsi-0:1:3:0:

1
p='data'; zpool create -o 'ashift=12' -O 'atime=off' "${p}" mirror 'pci-0000:01:00.0-scsi-0:1:0:0' 'pci-0000:01:00.0-scsi-0:1:1:0' mirror 'pci-0000:01:00.0-scsi-0:1:2:0' 'pci-0000:01:00.0-scsi-0:1:3:0'

RAIDZ-1 (RAID5)

Создать RAID-5 из дисков pci-0000:01:00.0-scsi-0:1:0:0, pci-0000:01:00.0-scsi-0:1:1:0 и pci-0000:01:00.0-scsi-0:1:2:0:

1
p='data'; zpool create -o 'ashift=12' -O 'atime=off' "${p}" raidz 'pci-0000:01:00.0-scsi-0:1:0:0' 'pci-0000:01:00.0-scsi-0:1:1:0' 'pci-0000:01:00.0-scsi-0:1:2:0'

RAIDZ-2 (RAID6)

Создать RAID-6 из дисков pci-0000:01:00.0-scsi-0:1:0:0, pci-0000:01:00.0-scsi-0:1:1:0, pci-0000:01:00.0-scsi-0:1:2:0 и pci-0000:01:00.0-scsi-0:1:3:0

1
p='data'; zpool create -o 'ashift=12' -O 'atime=off' "${p}" raidz2 'pci-0000:01:00.0-scsi-0:1:0:0' 'pci-0000:01:00.0-scsi-0:1:1:0' 'pci-0000:01:00.0-scsi-0:1:2:0' 'pci-0000:01:00.0-scsi-0:1:3:0'

RAIDZ-3

Создать RAIDZ-3 из дисков pci-0000:01:00.0-scsi-0:1:0:0 pci-0000:01:00.0-scsi-0:1:1:0 pci-0000:01:00.0-scsi-0:1:2:0 pci-0000:01:00.0-scsi-0:1:3:0 и pci-0000:01:00.0-scsi-0:1:4:0:

1
p='data'; zpool create -o 'ashift=12' -O 'atime=off' "${p}" raidz3 'pci-0000:01:00.0-scsi-0:1:0:0' 'pci-0000:01:00.0-scsi-0:1:1:0' 'pci-0000:01:00.0-scsi-0:1:2:0' 'pci-0000:01:00.0-scsi-0:1:3:0' 'pci-0000:01:00.0-scsi-0:1:4:0'

Работа с ARC и ZIL

Добавляем отдельные устройства для работы с ARC и ZIL.

ARC

Добавить отдельный диск (L2ARC) pci-0000:01:00.0-scsi-0:1:4:0 для работы с ARC в пул data:

1
p='data'; zpool add "${p}" cache 'pci-0000:01:00.0-scsi-0:1:4:0'

ZIL

Добавить отдельный диск (SLOG) pci-0000:01:00.0-scsi-0:1:5:0 для работы с ZIL в пул data:

1
p='data'; zpool add "${p}" log 'pci-0000:01:00.0-scsi-0:1:5:0'

Тома

Создание тома

Создать том cloud в пуле data:

1
p='data'; v='cloud'; zfs create "${p}/${v}"

Создать том cloud в пуле data и с точкой монтирования /opt/cloud:

1
p='data'; v='cloud'; zfs create -o "mountpoint=/opt/${v}" "${p}/${v}"

Создать том cloud в пуле data и с алгоритмом компрессии zstd:

1
p='data'; v='cloud'; zfs create -o 'compression=zstd' "${p}/${v}"

Создать том cloud в пуле data с алгоритмом компрессии zstd и точкой монтирования /opt/cloud:

1
p='data'; v='cloud'; zfs create -o 'compression=zstd' -o "mountpoint=/opt/${v}" "${p}/${v}"

Удаление тома

Удалить том cloud в пуле data:

1
p='data'; v='cloud'; zfs destroy "${p}/${v}"

Создание зашифрованного тома

Создать том secret в пуле data и зашифровать его парольной фразой:

1
p='data'; v='secret'; zfs create -o 'encryption=on' -o 'keyformat=passphrase' "${p}/${v}"

Где:

  • encryption=on - включение шифрования.
  • keyformat=passphrase - тип шифрования “парольная фраза”.

При создании тома secret, #ZFS попросит ввести парольную фразу для шифрования данных.

Снимки

Список снимков

Показать список всех снимков:

1
zfs list -t 'snapshot'

Показать список снимков тома cloud в пуле data:

1
p='data'; v='cloud'; zfs list -r -t 'snapshot' -o 'name,creation' "${p}/${v}"

Создание снимков

Создать снимок 2024-08-21.19-32-02 тома cloud в пуле data:

1
p='data'; v='cloud'; s=$( date '+%F.%H-%M-%S' ); zfs snapshot "${p}/${v}@${s}"

Создать снимок 2024-08-21.19-32-02 тома cloud и всех его дочерних томов в пуле data:

1
p='data'; v='cloud'; s=$( date '+%F.%H-%M-%S' ); zfs snapshot -r "${p}/${v}@${s}"

Переименование снимков

Переименовать снимок name_OLD тома cloud в пуле data:

1
p='data'; v='cloud'; zfs rename "${p}/${v}@name_OLD" 'name_NEW'

Переименовать снимок name_OLD тома cloud и во всех его дочерних томов в пуле data:

1
p='data'; v='cloud'; zfs rename -r "${p}/${v}@name_OLD" 'name_NEW'

Откат данных к снимку

Выполнить откат данных к снимку 2024-08-21.19-32-02 тома cloud в пуле data:

1
p='data'; v='cloud'; zfs rollback "${p}/${v}@2024-08-21.19-32-02"

Удаление снимков

Удалить снимок 2024-08-21.19-32-02 тома cloud в пуле data:

1
p='data'; v='cloud'; zfs destroy "${p}/${v}@2024-08-21.19-32-02"

Оптимизации

Специализированные настройки #ZFS под конкретные задачи.

PostgreSQL

Создать основной том pgsql с алгоритмом компрессии zstd:

1
p='data'; v='pgsql'; zfs create -o 'compression=zstd' "${p}/${v}"

Создать специальный том pgsql/main с алгоритмом компрессии zstd и размером блока 32K для баз данных:

1
p='data'; v='pgsql/main'; zfs create -o 'recordsize=32K' "${p}/${v}" && chmod 700 "/${p}/${v}"

Создать специальный том pgsql/wal с алгоритмом компрессии zstd и размером блока 32K для WAL:

1
p='data'; v='pgsql/wal'; zfs create -o 'recordsize=32K' "${p}/${v}"

Откорректировать настройки #PostgreSQL:

1
2
3
4
data_directory = '/data/pgsql/main'
full_page_writes = off
wal_init_zero = off
wal_recycle = off

MySQL

Создать основной том mysql с алгоритмом компрессии zstd:

1
p='data'; v='mysql'; zfs create -o 'compression=zstd' "${p}/${v}"

Создать специальный том mysql/main с алгоритмом компрессии zstd и размером блока 16K для баз данных:

1
p='data'; v='mysql/main'; zfs create -o 'recordsize=16K' "${p}/${v}"

Создать специальный том mysql/log с алгоритмом компрессии zstd для логирования:

1
p='data'; v='mysql/log'; zfs create "${p}/${v}"

Откорректировать настройки #MySQL:

1
2
3
4
datadir = 'data/mysql/main'
innodb_doublewrite = 0
innodb_use_native_aio = 0
innodb_use_atomic_writes = 0
Авторы
Мета
Лицензия
ID файла
UUID
Системный путь
Тип
Статистика
Количество слов
Время чтения
мин.