Zfs

Материал из wiki.nntc.nnov.ru
Версия от 12:11, 19 ноября 2023; Vovan (обсуждение | вклад) (Выбросить раздел из пулла)
Перейти к навигации Перейти к поиску

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

Затюнить основные моменты на 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

Управление 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]