# репозиторий ZFS для Almalinux sudo dnf install https://zfsonlinux.org/epel/zfs-release-2-3$(rpm --eval "%{dist}").noarch.rpm dnf repolist # перечень репозиториев # Установка пакетов ZFS dnf config-manager --disable zfs dnf config-manager --enable zfs-kmod dnf install zfs sudo /sbin/modprobe zfs # включить модуль ядра systemctl -a | grep zfs # загруженные модули list-unit-files | grep zfs # загруженные утилиты ls -l /dev/disk/by-id # список дисков с ID smartctl -a /dev/sda # информация по диску (в т.ч. размер секторов) lsblk -td hdparm -I /dev/sdb
zfs list # dataset list zpool list [-L] [-v] # pool list zpool status [exist-pool] [-x] zpool get all [exist-pool] # какой то моментный срез, имеет смысл только с интервалом, иначе херабору показывает # кстати с разрезом по дискам, так же показывает L2 zpool iostat [pool-name] [interval_sec] zpool iostat -v # в разрезе по Vdev arcstat # тут еще совсем небольшая статистика по ARC /proc/spl/kstat/zfs - ? zpool history
# Перечень пулов с инфой по ним zpool list -vL # создание пула zpool create [-o ashift=12] [pool-name] mirror [diskID1] [diskID2] [diskID3] # (можно перечислить пару раз mirror [disk] [disk], для создания нескольких зеркал) # для создания пула Raidz команда аналогична, вместо mirror указываем raidz # добавление дисков zpool add [-o ashift=12] [exist-pool] mirror [diskID4] # -f для изменения степени избыточности # -n пробный прогон (?)
Шифрование
# Параметр шифрования zfs get encryption tank/secure # Создание пула с шифрованием zfs create -o encryption=on -o keylocation=prompt -o keyformat=passphrase tank/secure # Отключение шифрованного пула zfs unload-key tank/secure zfs unmount tank/secure # Загрузка шифрованного пула zfs load-key tank/secure zfs mount tank/secure
При создании пула выполняются проверки дисков на использование, но только на них полагаться не стоит
Для зеркала можно и нечетное кол-во, в каждом пуле можно создавать по несколько зеркал
При создании двух зеркал в одном пуле, создается еще одно вирт устр-во верхнего уровня. Данные наносятся полосами на оба зеркала, данные являются избыточными на каждом диске
Можно добавлять набор дисков, присоединять доп диски, замена дисков и удаление дисков из конфигурации если сохраняется избыточность. Удалять напрямую уст-ва или разбить их нет возможности
команда zpool remove поддерживает только удаление уст-в горячего резерва и уст-в кеширования. Уст-ва часть основной конфигурации зеркального пула могут быть удалены zpool detach. Уст-ва без избыточности и устр-ва RaidZ удалить из пула невозможно
Изменение пар-ов для ФС рекурсивно применяется ко всем ее дочерним
Отдельным ФС можно задавать свойства такие как exec,devices,readonly и т.д.
При создании снимка, с указанием «-r» рекурсивно создаются снимки дочерних ФС
# вложенные ФС zfs create pool-name/fs-name zfs create pool-name/fs-name/folder/fs-second-name zfs destroy pool-name/fs-name/folder/fs-second-name # указание ДС с рекурсивным выводом zfs list [-r] [ds-name] # выбор полей для вывода zfs list [-o name,sharenfs...]
Docs
Здесь много параметров и описания к ним
Текущее состояние отображено в файлах «cat /sys/module/zfs/parameters/PARAMETER»
Для динамических св-в, можно изменить значение там же, но для многих нужна перезагрузка, для этого записываем в созданный файл: «/etc/modprobe.d/zfs.conf«
options zfs PARAMETER=VALUE options zfs zfs_arc_max=2147483648 options zfs zfs_arc_min=1073741824 # Затем обновление плагинов командой sudo update-initramfs -u -k all
Некоторые пар-ры прописаны в »/sys/module/icp/parameters», с-но и замена их будет в «/etc/modprobe.d/icp.conf»
# Текущее состояние zfs get [parameter || all] zfs list -o [parameter || all] [FS-name] # либо cat /sys/module/zfs/parameters/PARAMETER # Задать параметр ФС zfs set [parameter=newvalue] [FS-name] # Параметры пулу при создании (требуется проверить) zpool create -O compression=on pool mirror c0t1d0 c0t2d0 # Для сжатия можно указать тип и уровень zfs set compression=gzip-9 [FS-name] # Текущие параметры в файлах ls /sys/module/zfs/parameters # описание параметров modinfo zfs
Есть инфа
Cache (Зеркалирование уст-в кеширования невозможно и они не могут быть частью RaidZ)
## ## Так то это похоже про L2ARC говорится, ## чтобы его добавить просто команда "zpool add pool cache sdX" ## ну хотя да, основной ведь в памяти, не на каком диске же ## после создания, диск видно в "zpool status -Lv" # при создании пула zpool create tank mirror [disk1] cache [CacheDisk1] # после создания zpool add [exist-pool] cache [CacheDisk1] [CacheDisk2] zpool remove [exist-pool] [CacheDisk1] [CacheDisk2] zpool add -o ashift=12 tank cache nvme-INTEL_SSDPE2KX010T8_BTLJ904509X61P0FGN-part2
Настройка типа данных для кэширования
Применяется в рантайме
zfs get primarycache zfs set primarycache=metadata tank/datab
arcstat # небольшой срез статистики arc_summary | more arc_summary -d | more # пакет "zfs-stats" для линукса, самоделкин https://github.com/egidijus/zfs-tools/blob/master/README.md zfs-stats -A zfs-stats -E
Адаптивный кэш используется всегда, все читаемые данные будут попадать сначала туда. По умолчанию использует всю доступную ОЗУ (в каких то пределах, оставляет какое то кол-во системе), но при этом имеет низкий приоритет т.е. когда кому то требуется памяти, а ее нет, то ARC освобождает ее по первому запросу, но нюанс в том что это происходит не мгновенно и требует времени
Второй момент, исходит из первого, есть параметры задающие максимум для ARC, типа «arc_c_max» кажется, он носит рекомендательный характер, ARC скорее всего все равно будет его превышать
Он используется для задания очистки, которое выполняется периодически службой ZFS, это задание как раз и ориентируется на это рекомендательное значение принимая решение об очередной очистке кэша
Метрики _evictable отображают сколько данных ZFS готова освободить при очередной итерации очистки
Прим: раз эта метрика не сбрасывается, хотя сбрасывается
ZIL обеспечивает требования POSIX для синхронных транзакций, например транзакции БД
По умолчанию выделяется из блоков основного хранилища
# при создании пула zpool create tank mirror [disk1] log [mirror] [LodDisk1] # ps. "с зеркальными устр-ми протоколирования" видимо после log удет отдельное устр-во, не "пул-хранения + лог" zpool add [exist-pool] log mirror [LogDisk1] [LogDisk2] zpool add -o ashift=12 tank log nvme-INTEL_SSDPE2KX010T8_BTLJ904509X61P0FGN-part1
Создаются моментально, место занимает только разность изменяемых впоследствии данных.
Хранятся в /tank/.zfs/snapshot. В открытом варианте, имеется доступ к файлам
# Список снимков zfs list -t snapshot # Создание снимка (только весь пул), имя в единственном аргументе zfs snapshot tank@2022-11-11 # Откат, делается на последний снимок, чтобы откатить на определенный нужно уничтожить промежуточные (-r) zfs rollback tank@2022-11-11 # Удаление снимка zfs destroy tank@2022-11-11 # Отправка снимка zfs send tank@2022-11-11 | zfs recv newtank/data # По сети zfs send tank@2022-11-11 | ssh root@10.200.192.25 zfs recv newtank/data # Отправка по сети через mbuffer (при длительной процедуре можно использовать ПО "screen") # Принимающий mbuffer -s 128k -m 1G -I 192.168.1.11:9090 | zfs receive newtank/data # Отправитель zfs send tank@2022-11-11 | mbuffer -s 128k -m 1G -O 192.168.1.10:9090 # Отправка инкрементных данных zfs send -i tank@2022-11-11 tank@2022-11-12 | ssh host2 zfs recv newtank/data
ashift
Размер блока (секторов) диска, должен совпадать с физическим размером у диска
Указывается как степень двойки т.е. «ashift=12 - 2^12 = 4096»
По умолчанию zfs пытается узнать его в ОС при создании пула, но механизм не надежный, дефолтное значение 512Б, для поддержки самых старых, у современных 4Кб а то и 8Кб, поэтому важно правильно указать
В случае указания размера меньше фактического, производительность очень сильно падает в связи с резким возрастанием ко-ва чтения/записи
MRU - недавно используемые
MFU - часто используемые
# Рекомендации из конфы sudo zfs set recordsize=128K tank sudo zfs set compression=lz4 tank sudo zfs set logbias=throughput tank
Для проверки фактического размера сектора есть утилиты выше, SSD обычно не показывают свой реальный размер, почему то, везде указано 512, хз что то
mkfs.ext4 по умолчанию использует размер 4096 для 512 и выше секторов
Тут неясный момент, если в ZFS укажу 16Кб, а в ОС используется 4Кб или 512, не будет ли переконвертации постоянно ? хотя файл ведь на диске хранится, если переносится то переносится, типа этот размер ведь к диску относится а не к программе какой то
В общем немного неясно, почему SSD не пишут, очевидно из за другой технологии, там что то со страницами связано. В общем соглащусь что как минимум 4Кб стоит указывать, а то и 8Кб, вот а когда 8 ?
кстати говоря, кластер это объединение секторов, связано с ограничениями того же FAT
Переход на размер 4096 называется расширенным форматом, произошел давненьеко, лет 15 назад уже конкретно, позволил сильно оптимизировать производство и повысить эффективность использования дисков
Собна 512 это наследие первых поколений ЖД, которое уже фктически изжилось\\
(с форума) Это логический размер, физический размер имеет значение для ZFS, и вот уже почти десять лет он составляет 4K. Ваш диск имеет формат 512e, который внутри использует 4K, но представляет 512 для ОС по соображениям совместимости