Zfs
Полезные команды
Затюнить основные моменты на 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>