Zfs

Материал из wiki.nntc.nnov.ru
Перейти к навигации Перейти к поиску

Полезные команды

Затюнить основные моменты на PVE

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

zfs set compression=off rpool/data

Отключить sync

zfs set sync=disabled rpool/data

Просмотр параметров volume (внимание! - отсутствие слэша в начале - это важно)

zfs get all rpool/data/vm-100-disk-1

Аналогично - просмотр параметров пула (внимание! - слэш в начале - это важно)

zfs get all /rpool/data/

Создать volume с нужным размером блока (например, с размером блока равным размеру блока в ext4 гостевой машины по умолчанию)

zfs create -o volblocksize=4K -V 100g rpool/data/vm-100-disk-1

Проверить за собой

zfs get all rpool/data/vm-100-disk-1 | grep volblocksize

Создание дисков средствами вебинтерфейса проксмокс происходит с volblocksize=8K. Это не всегда удобно. Поэтому после создания виртмашины можно пересоздать так:

Удаляем диск

zfs destroy rpool/data/vm-100-disk-1

И создаём заново (как уже выше приводилась команда) - выключенная виртмашина ничего не заметит :-)

zfs create -o volblocksize=4K -V 100g rpool/data/vm-100-disk-1


Копирование данных через снапшоты

Просмотр списка

zfs list

Копирование

ssh root@192.168.10.123 "zfs send rpool/data/vm-106-disk-0@backup-01" | pv --size 469457889480 | zfs receive -o compress=zle storage-zfs/backup/vm-106-disk-0--DO-NOT-DELETE


создать снапшот

zfs snapshot storage-zfs/vm-206-disk-0@backup

список снапшотов

zfs list -t snapshot

посмотреть размер снапшота

zfs send -nvP storage-zfs/vm-206-disk-0@backup

должно быть на выходе что-то тпа того:

full	storage-zfs/vm-206-disk-0@backup	654563209344
size	654563209344

установить размер для диска (обычно после копирования из снапшота)

set volsize=999G rpool/data/vm-206-disk-0

Работа с томами

Изменить размер (помни о файловой системе внутри!)

zfs set volsize=1000G rpool/data/vm-201-disk-1

Эксперимент

Задача

Быстро передавать состояние диска виртмашины между двумя узлами PVE.

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

A -- виртмашина, на которой работает пользователь. Она расположена на узле PVE_A
B -- виртмашина, на которую нужно оперативно получать состояние диска машины A (изначально у нее диск или отсутствует или пустой). Она расположена на узле PVE_B


Между узлами PVE_A и PVE_B гигабитная сеть и доступ по ssh по ключам (условно можно считать что эти оба узла являются узлами одного кластера, но не обязательно. Т.е. могут быть и отдельными PVE-узлами, вне кластера).

Полностью передавать диски по сети -- ёмкая по времени задача. Чтобы минимизировать временнЫе затраты, в общем виде набор действий будет следующим:

Решение

1. Создаём снапшот на A. Пусть будет снапшот с названием

ok

2. Перемещаем снапшот в новый (пока ещё не существующий на первом этапе) диск машины B Для этого на машине PVE_B выполняем команду, вид которой в общем виде следующий:

ssh root@PVE_A "zfs send -R zfspool2/vm-401-disk-0@dfl" | pv --size 125413212048 | zfs receive -o compress=zle zfspool2/vm-402-disk-0 -F

3. Создаём второй снапшот на A. Пусть будет снпашот с названием

ok1

команда

zfs snapshot zfspool2/vm-401-disk-0@ok1

4. Перемещаем снапшот в снапшот созданного в п.2 диска на машине B

ssh root@PVE_A "zfs send -i zfspool2/vm-401-disk-0@ok1" | pv --size 125413212048 | zfs receive -o compress=zle -A zfspool2/vm-402-disk-0

Управление RAID массивами (zfs)

Создать аналог RAID 1+0

Собираем пулл zfs (аналог RAID 1+0) с именем zfspool из дисков /dev/sda2 /dev/sdb2 /dev/sdc2 /dev/sdd2

Первый шаг - создаём зеркало из первых двух

zpool create -f -o ashift=12 zfspool mirror /dev/sda2 /dev/sdb2

Второй шаг - в уже созданный пулл добавляем ещё одно зеркало

zpool add zfspool mirror /dev/sdc2 /dev/sdd2

Получаем как бы пулл из двух зеркал. Пул в этом случае является страйпом (RAID0) из двух зеркал (RAID1)

Далее тюним для PVE. Отключаем сжатие и синхронизацию (экспериментально подобрано при эксплуатации PVE).

zfs set compression=off zfspool
zfs set sync=disabled zfspool

Проверить состояние пулла

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

zpool status zfspool

В ответ придёт что-то типа этого:

  pool: zfspool
 state: ONLINE
config:

	NAME        STATE     READ WRITE CKSUM
	zfspool     ONLINE       0     0     0
	  mirror-0  ONLINE       0     0     0
	    sda2    ONLINE       0     0     0
	    sdb2    ONLINE       0     0     0
	  mirror-1  ONLINE       0     0     0
	    sdc2    ONLINE       0     0     0
	    sdd2    ONLINE       0     0     0

Выбросить раздел из пулла

Например, нужно выбросить раздел sda2.

Тогда сначала делаем этот раздел OFFLINE

zpool offline zfspool sda2

Затем вынимаем из пулла

zpool detach zfspool sda2

Если это пулл STRIPE то можно выбросить из него разлел, однако нужно иметь в виду что занятого места в пуле должно быть столько, сколько останется после отсоединения раздела от него. Т.е. пулл уменьшится.

Чтобы убрать раздел sda2 из страйпового пулла zfspool команда

zpool remove zfspool sda2

Заменить раздел в пулле

Допустим

zpool status zfspool

Показывает такой результат

  pool: zfspool
 state: ONLINE
remove: Removal of vdev 0 copied 94.9G in 0h35m, completed on Sat Nov 18 22:43:44 2023
	131K memory used for removed device mappings
config:

	NAME          STATE     READ WRITE CKSUM
	zfspool       ONLINE       0     0     0
	  mirror-1    ONLINE       0     0     0
	    sdc2      ONLINE       0     0     0
	    sdd2      ONLINE       0     0     0
	  mirror-3    ONLINE       0     0     0
	    sda2      ONLINE       0     0     0
	    sdb2      ONLINE       0     0     0

и требуется заменить диск sdc2 на диск sde2 в mirror-1 пулла под названием zfspool

Тогда сначала делаем sdc2 OFFLINE командой

zpool offline zfspool /dev/sdc2

При этом статус

zpool status zfspool

должен быть примерно такой

pool: zfspool
 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'.
remove: Removal of vdev 0 copied 94.9G in 0h35m, completed on Sat Nov 18 22:43:44 2023
	131K memory used for removed device mappings
config:

	NAME          STATE     READ WRITE CKSUM
	zfspool       DEGRADED     0     0     0
	  mirror-1    DEGRADED     0     0     0
	    sdc2      OFFLINE      0     0     0
	    sdd2      ONLINE       0     0     0
	  mirror-3    ONLINE       0     0     0
	    sda2      ONLINE       0     0     0
	    sdb2      ONLINE       0     0     0

Далее даём команду на замену диска sdc2 на диск /dev/sde2

zpool replace zfspool sdc2 /dev/sde2

В результате команда проверки статуса

zpool status zfspool

Должна вернуть что-то похожее на это

  pool: zfspool
 state: DEGRADED
status: One or more devices is currently being resilvered.  The pool will
	continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
  scan: resilver in progress since Sun Nov 19 12:32:58 2023
	208G scanned at 4.16G/s, 8.32G issued at 170M/s, 208G total
	7.75G resilvered, 4.00% done, 00:19:59 to go
remove: Removal of vdev 0 copied 94.9G in 0h35m, completed on Sat Nov 18 22:43:44 2023
	131K memory used for removed device mappings
config:

	NAME             STATE     READ WRITE CKSUM
	zfspool          DEGRADED     0     0     0
	  mirror-1       DEGRADED     0     0     0
	    replacing-0  DEGRADED     0     0     0
	      sdc2       OFFLINE      0     0     0
	      sde2       ONLINE       0     0     0  (resilvering)
	    sdd2         ONLINE       0     0     0
	  mirror-3       ONLINE       0     0     0
	    sda2         ONLINE       0     0     0
	    sdb2         ONLINE       0     0     0

Повторяя команду проверки статуса ждём окончания процесса замены диска.

Управление RAID массивами (mdadm)

Удалить диск из действующего RAID1

Пусть есть RAID1

cat /proc/mdstat 
Personalities : [raid1] 
md127 : active raid1 sda1[0] sdb1[1] sdd1[3] sdc1[2]
      41942976 blocks [4/4] [UUUU]

Задача - удалить из него диски sda1 и sdb1

Для этого сначала помечаем диски сбойными

mdadm --fail /dev/md127 sda1
mdadm --fail /dev/md127 sdb1

Затем удаляем их из массива

mdadm --remove /dev/md127 sda1
mdadm --remove /dev/md127 sdb1

Проверяем результат

cat /proc/mdstat 
Personalities : [raid1] 
md127 : active raid1 sdd1[3] sdc1[2]
      41942976 blocks [4/2] [__UU]

Как видим, информация о двух отсутствующих дисках не исчезла. Если на место этих дисков не планируется добавление замены, то можно указать другое кличество дисков для зеркала.

Для этого выполнить команду

mdadm --grow /dev/md127 --raid-devices=2

Проверяем результат

cat /proc/mdstat 
Personalities : [raid1] 
md127 : active raid1 sdd1[1] sdc1[0]
      41942976 blocks [2/2] [UU]


Добавить диски в действующий RAID1

Если есть массив

cat /proc/mdstat 
Personalities : [raid1] 
md127 : active raid1 sdd1[1] sdc1[0]
      41942976 blocks [2/2] [UU]

и в него планируется добавить ещё диски /dev/sda1 и /dev/sdb1, то сначала нужно увеличить количество девайсов в массиве

mdadm --grow /dev/md127 --raid-devices=4

Затем по очереди ввести диски командами

mdadm --add /dev/md127 /dev/sda1
mdadm --add /dev/md127 /dev/sdb1

Далее можно наблюдать процесс синхронизации массива командой

cat /proc/mdstat

По завершению синхронизации результат проверки массива должен быть примерно такой

cat /proc/mdstat 
Personalities : [raid1] 
md127 : active raid1 sde1[0] sda1[2] sdb1[3] sdd1[1]
      41942976 blocks [4/4] [UUUU]
      
unused devices: <none>