====== ZFS ====== [[:linux:zfs:deep_info|ZFS Deep Info]]\\ ===== Установка =====
:!: Подробнее # репозиторий 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...]
===== Конфигурация ===== [[https://docs.oracle.com/cd/E19253-01/820-0836/gazss/index.html|Docs]]\\ [[https://openzfs.github.io/openzfs-docs/Performance%20and%20Tuning/Module%20Parameters.html#zfs-arc-meta-limit|Здесь много параметров и описания к ним]]\\ Текущее состояние отображено в файлах "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
===== ARC =====
:!: Подробнее [[https://www.cyberciti.biz/faq/how-to-set-up-zfs-arc-size-on-ubuntu-debian-linux/|Есть инфа]]\\ 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 ===== 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 * Повышение производительности в результате использования отдельного уст-ва зависит от типа устр-ва, состава оборудования пула и рабочей нагрузке (ссылка на перечень битая) * Эти устр-ва могут быть без репликации или с зеркалом, но RaidZ не поддеживается * Если на отдельном устр-ве не использвется зеркало то в случае выхода из строя, протоколирование автоматически перейдет в основной пулл хранения данных * С уст-вам протоколирования можно делать все кроме удаления * Минимальный размер как и для общих пулов (64Мб) максимальный рекоммендуется в половину от имеющейся ОЗУ т.к. это максимальный объем потенциально активных данных которые могут хранится на устр-ве
===== Снимки ===== Создаются моментально, место занимает только разность изменяемых впоследствии данных.\\ Хранятся в **/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
===== Тюнинг =====
:!: Подробнее [[https://www.high-availability.com/docs/ZFS-Tuning-Guide/|site]]\\ **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
:!: Про размеры секторов [[https://wiki.archlinux.org/title/Advanced_Format_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9)|Advansed_format]]\\ Для проверки фактического размера сектора есть утилиты выше, SSD обычно не показывают свой реальный размер, почему то, везде указано 512, хз что то\\ mkfs.ext4 по умолчанию использует размер 4096 для 512 и выше секторов\\ Тут неясный момент, если в ZFS укажу 16Кб, а в ОС используется 4Кб или 512, не будет ли переконвертации постоянно ? хотя файл ведь на диске хранится, если переносится то переносится, типа этот размер ведь к диску относится а не к программе какой то\\ В общем немного неясно, почему SSD не пишут, очевидно из за другой технологии, там что то со страницами связано. В общем соглащусь что как минимум 4Кб стоит указывать, а то и 8Кб, вот а когда 8 ?\\ кстати говоря, кластер это объединение секторов, связано с ограничениями того же FAT\\ Переход на размер 4096 называется расширенным форматом, произошел давненьеко, лет 15 назад уже конкретно, позволил сильно оптимизировать производство и повысить эффективность использования дисков\\ Собна 512 это наследие первых поколений ЖД, которое уже фктически изжилось\\ (с форума) Это логический размер, физический размер имеет значение для ZFS, и вот уже почти десять лет он составляет 4K. Ваш диск имеет формат 512e, который внутри использует 4K, но представляет 512 для ОС по соображениям совместимости