Установка Arch Linux на ZFS всегда была не очень тривиальным делом: нужно знать много тонкостей, прочитать кучу статей и различные вики, разобраться с флагами создания датасетов и пула, с конфигурацией initramfs и с тем, какие systemd сервисы стоит включать, с параметрами командной строки ядра и правильными конфигами. Если ставить вручную, то установка занимает целый вечер, с вдумчивым раскуриванием мануалов перед черной консолью. (Небольшой лайфхак: если у вас есть второй компьютер, гораздо приятнее ставить арч с него, подключившись к таргету по ssh, именно из‑за возможности копипастинга команд).

Несколько лет назад я начал работать над автоматизацией этого процесса: написал несколько скриптов на bash, которые делают всё за меня. Это было не очень стабильно: они периодически ломались, гибкостью настройки там и не пахло: скрипт был жёстко прибит к моей конфигурации, и когда кто‑то из друзей просил помочь с установкой Arch Linux на ZFS, обычно я просто делал новую ветку репозитория, подстраивая скрипт под нужную конфигурацию. Всё изменилось зимой прошлого года, когда мне захотелось в очередной раз поставить чистую систему для экспериментов на новый SSD. Я всерьез задумался о новом установщике, который предоставлял бы гибкое меню с конфигурацией в виде TUI. У меня была идея написать инструмент с нуля на Rust, используя ratatui, но масштаб работы для написания гибкого и надёжного проекта, сравнимого по функционалу с archinstall, начал меня немного пугать. Следующей мыслью было попробовать форкнуть archinstall. В процессе чтения его исходного кода и документации я понял: мне не нужно его форкать, я могу использовать его как библиотеку.

Так и родился archinstall_zfs — установщик, который использует archinstall как библиотеку, но при этом переопределяет ключевые компоненты. Я взял от archinstall то, что работает хорошо: TUI компоненты (SelectMenu, EditMenu), систему конфигурации, установку пакетов. Но разметку диска пришлось делать с нуля — archinstall просто не умеет работать с ZFS. Поэтому я написал свой DiskManager, который через sgdisk создаёт нужные разделы, а также GlobalConfigMenu — полностью кастомное меню вместо стандартного. А для самой установки создал ZFSInstaller, который наследует от archinstall.Installer, но умеет работать с ZFS‑специфичными пакетами и конфигурацией.

Workflow установки
Workflow установки

Получилось именно то, что я хотел: гибкий TUI‑интерфейс, где можно выбрать нужные параметры, а всю грязную работу инструмент сделает сам. Теперь установка Arch на ZFS занимает не вечер с мануалами, а 15–20 минут с чашкой чая.

Но прежде чем рассказывать о возможностях установщика, давайте разберёмся, почему вообще стоит заморачиваться с ZFS.

Почему ZFS?

ZFS — это не просто файловая система, это целая философия управления данными. Представьте, что вы обновили систему, что‑то сломалось, и теперь не загружается графическая оболочка. С обычной файловой системой вы бы лезли за LiveUSB, arch‑chroot, диагностика, исправление неполадок. Либо, если вы новичок, то дело может дойти до переустановки. С ZFS, снэпшотами и ZFSBootMenu вы просто перезагружаетесь, выбираете предыдущее состояние системы из меню и продолжаете работать. А потом спокойно разбираетесь, что пошло не так.

Или другой пример: хотите попробовать Wayland вместо X11? Создаёте клон текущего датасета, загружаетесь в него, экспериментируете. Не понравилось — откатились за секунду. Никаких «ой, а как же вернуть как было».

Кроме того, если у вас есть домашний сервер с ZFS, вы можете отправлять туда инкрементальные снепшоты время от времени

Три режима установки

Я долго думал, какие сценарии установки нужно поддержать. В итоге получилось три основных режима:

1. Full Disk — для тех, кто хочет отдать весь диск под ZFS. Тут я реализовал полную автоматизацию разметки через sgdisk. Установщик сначала очищает GPT и MBR сигнатуры (привет, проблемы с остатками старых разделов!), затем создаёт свежую GPT таблицу и нарезает разделы: EFI‑раздел на 500MB, опционально swap‑раздел в конце диска, а всё остальное — под ZFS.

2. New Pool — для dual‑boot сценариев. У вас уже есть Windows на первой половине диска? Не проблема! Укажите свободный раздел, установщик создаст на нём ZFS pool и установит туда систему. EFI‑раздел можно использовать существующий или создать новый.

3. Existing Pool — моя любимая фича! У вас уже есть ZFS pool с данными или другими системами? Установщик создаст новый boot environment и установит туда свежий Arch, не трогая существующие данные. Идеально для экспериментов и мультибута разных дистрибутивов.

Вид меню в последней версии на момент публикации статьи v0.3.4
Вид меню в последней версии на момент публикации статьи v0.3.4

Кто такие эти ваши Boot Environments?

Boot Environments (BE) — это способ держать несколько независимых систем на одном ZFS‑пуле. Каждая система размещается в своём корневом датасете и выбирается при загрузке через ZFSBootMenu. Для мультибута вы можете поставить несколько дистрибутивов в один пул — каждый станет отдельным BE.

Реальный пример с моего ноутбука (с комментариями):

❯ zfs list
NAME                       USED  AVAIL  REFER  MOUNTPOINT
novafs                    1.09T   361G   192K  none

# Текущий активный BE "arch0" (контейнер, сам не монтируется)
novafs/arch0               609G   361G   192K  none
novafs/arch0/data          421G   361G   192K  none
novafs/arch0/data/home     421G   361G   344G  /home    # /home датасет для arch0
novafs/arch0/data/root     120M   361G  45.3M  /root    # данные пользователя root текущего BE
novafs/arch0/root          170G   361G   142G  /        # корневая ФС активного BE
novafs/arch0/vm           18.8G   361G  18.8G  /vm      # отдельный датасет для VM

# Предыдущий BE "archold" (не активен, но готов к загрузке)
novafs/archold             227G   361G   192K  none
novafs/archold/data        143G   361G   192K  none
novafs/archold/data/home   141G   361G   119G  /home    # /home датасет для archold
novafs/archold/data/root  1.81G   361G  1.81G  /root    # данные root второго BE
novafs/archold/root       83.7G   361G  83.7G  /        # корень второго BE

# Глобальные датасеты (вне BE, монтируются всеми boot environments)
novafs/tmp_zfs            7.08G   361G  7.08G  /tmp_zfs        # временные данные

ZFSBootMenu — загрузчик, который понимает ZFS

Забудьте про GRUB с его костылями для ZFS. ZFSBootMenu — это загрузчик, созданный специально для ZFS. В отличие от традиционных загрузчиков, он нативно понимает структуру ZFS и может показывать список boot environments в красивом ncurses‑меню, делать снапшоты и клонировать boot environments прямо при загрузке. Нужно откатиться на снапшот недельной давности? Просто выбираете его из меню, и система загружается именно в том состоянии. Хотите поэкспериментировать, не ломая текущую систему? Клонируете boot environment прямо из загрузчика и загружаетесь в копию. Интересный факт: на самом деле этот загрузчик — это полноценный Linux, который при загрузке загружает вашу систему использую системный вызов kexec.

Нативное шифрование ZFS

Поддерживается нативное шифрование ZFS без необходимости в LUKS‑контейнерах — ZFS шифрует данные сам. При этом доступны следующие варианты:

  • Без шифрования.

  • Шифрование всего пула (зашифрованы все датасеты включая корневую систему)

  • Шифрование отдельного boot environment

В текущей версии поддерживаются только plain text ключи (пароли), без более сложных схем аутентификации. За расшифровку отвечает хук zfs в initramfs, который запрашивает пароль на ранней стадии загрузки.

Dracut vs mkinitcpio — выбор за вами

Arch традиционно использует mkinitcpio для создания initramfs. Но я предпочитаю dracut — его хук zfs лучше работает с нативным шифрованием ZFS. Установщик поддерживает оба варианта, и тут есть интересные технические детали.

Для mkinitcpio я добавляю хук zfs в нужное место (после keyboard, но до filesystems), прописываю правильные модули. А вот с dracut пришлось повозиться больше: нужно было написать собственные pacman хуки, которые автоматически пересобирают initramfs при обновлении ядра. Стандартные хуки пакмана не подходят — они не знают про dracut.

Загрузка и boot environments: ZFSBootMenu, zfs‑mount‑generator и кастомный ZED‑хук

Коротко о том, как устроена загрузка:

  • В качестве загрузчика используется ZFSBootMenu: при выборе boot environment он запускает ядро Linux через системный вызов kexec и передаёт параметры командной строки ядра.

  • Корневая ФС монтируется хуком zfs в initramfs, согласно параметру командной строки: с dracut это root=ZFS=..., с mkinitcpio — через zfs=...

  • Остальные датасеты монтируются уже systemd»ом через zfs-mount-generator, который читает /etc/zfs/zfs-list.cache/<pool> и на лету генерирует unit‑файлы. Примечание: использование zpool.cache считается устаревшим и не рекомендуется Arch Wiki, поэтому был выбран подход с zfs-mount-generator

Проблема BE в том, что «по умолчанию» ZFS видит все датасеты пула, из‑за чего systemd может попытаться примонтировать чужие файловые системы (например, /home из соседнего boot environment). Это решает мой кастомный ZED‑хук history_event-zfs-list-cacher.sh: он отслеживает события ZFS, определяет активный boot environment, фильтрует датасеты (оставляя только датасеты, принадлежащие текущему BE и общие вроде pool/tmp_zfs) и атомарно обновляет кеш. Скрипт сделан иммутабельным (chattr +i), чтобы обновления не затирали его.

Swap, ZRAM и ZSWAP

Можно вовсе обойтись без swap, можно включить ZRAM — это сжатый swap в RAM через systemd-zram-generator, и в этом режиме я специально отключаю zswap. По умолчанию используется zram-size = min(ram / 2, 4096) в /etc/systemd/zram-generator.conf.

Если нужен классический swap на диске — выбирайте режим «ZSWAP + swap‑раздел»: zswap включается, а сам swap живёт на отдельном разделе. При полном стирании диска задаёте размер раздела под swap; в остальных сценариях просто выбираете существующий раздел в TUI. Для незашифрованного варианта установщик делает mkswap и явно добавляет строку с UUID= в /etc/fstab (genfstab не включает неактивный swap). Для шифрованного — прописывает cryptswap через PARTUUID в /etc/crypttab и монтирует /dev/mapper/cryptswap в fstab.

Примечание: swap на ZFS (zvol/swapfile) не поддерживается — см. раздел ArchWiki «ZFS → Swap volume». Гибернация в текущем релизе тоже не поддерживается.

Валидация совместимости ядра и ZFS

Одна из ключевых проблем при работе с ZFS на Arch — совместимость версий ядра и модулей ZFS. Precompiled модули ZFS в репозитории archzfs часто отстают от последних версий ядра, а DKMS может не компилироваться с bleeding‑edge ядрами.

Для решения этой проблемы я написал систему валидации, которая определяет диапазон совместимых ядер для текущей версии ZFS. Система работает следующим образом:

  • Парсит release notes на https://github.com/openzfs/zfs/releases для определения поддерживаемых версий ядра

  • Сопоставляет эти данные с актуальными версиями ядер (linux, linux‑lts, linux‑zen) в репозиториях Arch

  • Проверяет доступность precompiled ZFS модулей для каждого ядра

  • Анализирует возможность DKMS‑сборки с конкретными версиями ядра

  • Предупреждает о потенциальных проблемах и предлагает альтернативы

Эта валидация используется в двух местах:

1. В установщике — при выборе ядра показываются только совместимые варианты

2. При сборке ISO — скрипт iso_builder.py автоматически проверяет совместимость перед созданием образов

Как это выглядит на практике?

Процесс установки сводится к нескольким простым шагам — выберите удобный способ запуска установщика:

Вариант A: готовый ISO (рекомендуется)

  1. Скачать последний ISO из релизов проекта, ( https://github.com/okhsunrog/archinstall_zfs/releases ) загрузиться в режиме UEFI. Примечание: если вы используете Ventoy, при выборе образа нужно выбрать GRUB2 режим загрузки.

  2. Подключить сеть.

  3. Запустить установщик:

./installer
# или
cd /root/archinstall_zfs && python -m archinstall_zfs

Вариант B: официальный Arch ISO (Этот вариант занимает больше времени из‑за установки ZFS модулей в ISO.)

# 1) Загрузитесь с официального Arch ISO и подключите сеть
pacman -Sy git

# 2) Получите установщик
git clone --depth 1 https://github.com/okhsunrog/archinstall_zfs
cd archinstall_zfs
python -m archinstall_zfs

Далее в TUI пройдите короткий визард: выберите режим установки → диски → имя пула → параметры системы. После подтверждения установщик автоматически настроит ZFSBootMenu, подберёт совместимую связку ядро/ZFS, соберёт initramfs (dracut или mkinitcpio) и включит необходимые сервисы ZFS. В конце — предложение зайти в chroot и перезагрузка в свежий Arch на ZFS.

Подробнее о коде

Всё написано на Python 3.13+ с использованием archinstall как библиотеки, но архитектуру пришлось делать с нуля. Стандартные меню archinstall не подошли — сделал своё, чтобы контролировать весь процесс установки. Для разметки диска тоже реализовал отдельный класс, потому что archinstall не умеет работать с ZFS.

Установка ZFS идёт через собственный класс (наследник archinstall.Installer): он добавляет нужные пакеты, правильно собирает initramfs (dracut или mkinitcpio) и учитывает все нюансы ZFS. Валидация совместимости ядра и ZFS вынесена в отдельный модуль — он парсит репозитории, релизы ZFS и проверяет, что всё совместимо. Для конфигов используется Pydantic, чтобы не было магии с dict'ами.

Профиль для ISO собирается через шаблоны Jinja2 — так проще поддерживать разные варианты (DKMS или precompiled модули, разные хуки и сервисы, разные наборы пакетов включаются условно). Всё максимально типизировано, чтобы не ловить баги на ровном месте.

Сборка ISO: just, Justfile и Jinja2

Сборочные сценарии полностью оркестрируются через just (рецепты описаны в justfile). Это позволяет быстро собирать разные варианты ISO и управлять параметрами сборки.

# Посмотреть доступные команды:
just --list

# Релизные ISO (полный набор пакетов)
just build-main pre              # Precompiled ZFS + linux-lts (рекомендуется)
just build-main dkms linux       # DKMS + linux
just build-main dkms linux-lts   # DKMS + linux+lts (самый надёжный вариант, если версии пакетов zfs и ядер рассинхронизированы)

# Ускоренные сборки для разработки (минимальный набор пакетов)
just build-test pre              # Минимальный пакетный набор + precompiled ZFS
just build-test dkms linux-zen   # Минимальный пакетный набор + DKMS + linux-zen

just list-isos                   # Показать собранные ISO

Ключевые различия между build-main и build-test:

  • build-main — создаёт релизные ISO с полным набором пакетов (включая диагностические инструменты, сетевые утилиты, редакторы и т. д.). Использует squashfs для сжатия, что даёт меньший размер ISO.

  • build-test — создаёт тестовые ISO с минимальным набором пакетов (только базовые утилиты и установщик). Использует erofs для более быстрого сжатия, отключает таймауты загрузки и включает вывов в serial console для удобства загрузки в qemu, автоматически поднимает ssh и разрешает логин от рута. Идеально подходит для быстрого тестирования изменений в установщике в qemu.

Профиль archiso генерируется из шаблонов на Jinja2, что даёт гибкую конфигурацию без копипасты:

  • Переменные шаблонов:

    • kernel — целевой вариант ядра

    • use_precompiled_zfs / use_dkms — способ установки ZFS

    • include_headers — включать ли headers для ядра

    • fast_build — минимальный пакетный набор для быстрых тестов

  • Ключевые шаблоны:

    • packages.x86_64.j2 — список пакетов

    • profiledef.sh.j2 — метаданные ISO, флаги сборки, разрешения файлов

    • pacman.conf.j2 — конфигурация репозиториев

Скрипт iso_builder.py формирует профиль ISO на основе этих шаблонов и параметров, а результаты складываются в gen_iso/out/. Сами профильные файлы, сервисы и хуки лежат в gen_iso/profile/.

Дополнительные возможности установщика

  • Сжатие ZFS (настраиваемо): выбор алгоритма в TUI — off, lz4 (по умолчанию), zstd, zstd-5, zstd-10. Выбранное значение применяется на уровне пула/датасетов и наследуется, а в initramfs отключается лишняя компрессия, чтобы избежать двойного сжатия.

  • zrepl: генерация /etc/zrepl/zrepl.yml с снапшотами каждые 15 минут и ретеншеном 4×15m (keep=all) | 24×1h | 3×1d.

  • AUR‑интеграция: установка пакетов из AUR через временного пользователя (aurinstall), установка хелпераyay-bin. В меню доступен пункт, где можно указать список своих AUR‑пакетов, которые будут автоматически установлены.

Что ожидать в следующем релизе?

  • Поддержка Secure Boot (подпись ZFSBootMenu, управление ключами)

  • Локальная сборка ZFSBootMenu, используя системное ядро и dracut / mkinitcpio, вместо готовых EFI‑файлов, для большей кастомизации

  • Более умная генерация hostid (на основе имени хоста)

  • Возможно, добавлю русскую локализацию, если будет интерес

Пара слов о CI

За сборку отвечает GitHub Actions: раз в месяц он автоматически собирает свежие образы, а ещё он запускается при пуше нового тега и формирует релиз с ISO‑образами в качестве артифактов. Перед сборкой пайплайн проверяет совместимость: сначала пробует предсобранные ZFS‑модули, и если версии не совпадают, автоматически переключается на DKMS. Благодаря этому образ с linux-lts получается практически всегда, а linux в редких случаях, если текущая версия ядра ещё не поддерживается проектом OpenZFS, просто пропускается.


ZFS — это мощный инструмент, но сложность её настройки отпугивает многих. Я надеюсь, что archinstall_zfs сделает эту файловую систему доступнее для обычных пользователей Arch Linux. Больше не нужно быть гуру, чтобы получить все преимущества ZFS — снапшоты, boot environments, компрессию и надёжность.

Проект активно развивается, поэтому баги возможны. Но я сам использую его для всех своих установок и пока полёт нормальный:)

Если у вас есть идеи по улучшению или вы нашли баг — welcome в issues на GitHub! А если проект оказался полезным — поставьте звёздочку, это мотивирует развивать его дальше.

Ссылка на репозиторий

Так же приглашаю заглянуть в мой телеграм‑канал Okhsunrog's Logs: никакой рекламы, только технические заметки про Rust, Linux, Embedded, отчёты про прогресс моих текущих опенсорсных проектов, и конечно же, мемы.

Комментарии (23)


  1. Zavod96
    30.08.2025 20:21

    Мне стали нравится статьи, в которых нихрена не понятно)
    В данном случае, вероятно, патамуш я линукс никогда (пока ещё) не юзал.

    Если речь о каком-то самписном мега ускорителе/упростителе, типа как я делал гуи на питоне для семерки, чтоб ваще забыть о консоли и не вводить там ничего - то круть) Удачи, чо.

    Завтра попробую перечитать и погуглить.

    Зы.
    Похоже, все айтишники начинают с поделок для себя.
    Потом приходит время, когда начинаешь делится направо и налево)


    1. MountainGoat
      30.08.2025 20:21

      Поясняю: народ хочет устанавливать системный раздел ОС на файловую систему, которую ни ядро ни загрузчик читать не умеют. Поэтому начинается цырк с подкидыванием ядру дров и запаковки их в формат, который загрузчик сможет взять с диска и дать ядру и т.д. Короче, пердолинг ради искусства.


      1. okhsunrog Автор
        30.08.2025 20:21

        Нет, немного не так.
        ZFSBootMenu расшифровывает пул, если включено шифрование, отображает список boot environments (если оно единственное, можно и напрямую его грузить, без меню), там по именам файлов ищёт в root датасете по пути /boot два файла: ядро и initramfs. В этом initramfs по сути находится миниатюрная файловая система, с каталогами, рутом, утилитами базовыми. И там же, в initramfs лежат различные хуки, скрипты, и драйвер zfs. ZFSBootMenu ничего не знает ни про какой драйвер zfs и не даёт его ядру, всё что делает загрузчик - распаковывает initramfs и загружает по адресу в памяти, загружает в память ядро, и отдаёт управление ядру, при этом передавая ему параметры командной строки и указатель на область памяти, где лежит initramfs. Соответсвенно, ядро загружается, монтирует initramfs, срабатывает хук и подгружается модуль ZFS. Далее этот модуль смотрит в параметры командной строки ядра, находит, какой датасет нужно смонтировать как root, замещает initramfs уже реальным рутом, с помощью switch_root / pivot_root, и уже оттуда загружается systemd, который, в свою очередь, монтирует оставшиеся датасеты по соответствующим путям


  1. aakptz
    30.08.2025 20:21

    Отличная статья, спасибо. Сам гружусь с ZFSBootMenu. Ещё есть хорошая подборка статей по ZFS тут. https://github.com/ankek/awesome-zfs


    1. okhsunrog Автор
      30.08.2025 20:21

      Спасибо, сохранил себе


  1. andreymal
    30.08.2025 20:21

    это целая философия управления данными

    Справедливости ради стоит отметить, что аналогичная философия применима и к btrfs, в который archinstall умеет из коробки


    1. okhsunrog Автор
      30.08.2025 20:21

      Тут справедливо, конечно, но снэпшоты - не единственное преимущество ZFS. Можно упомянуть нативное шифрование, RAID, удобнейшие консольные инструменты, продвинутый кэш ARC. Не знаю, насколько сейчас надёжна btrfs в плане хранения информации, у меня в 2020 как-то посыпалась btrfs из-за принудительного выключения ноута, никакой CoW, который там, по идее, должен был быть, не помог. Я пробовал по гайдам различным восстанавливать файловую систему, так и не смог восстановить. После того случая ушёл на ZFS


    1. aakptz
      30.08.2025 20:21

      У btrfs есть ряд функциональных ограничений. Возможно они для вас не принципиальны, но важны для других. Тут кстати хорошее сравнение ZFS с другими ФС. https://github.com/ankek/awesome-zfs/blob/main/comparison_table_2.md

      IMHO для себя я сделал выбор в пользу ZFS. Это спасало меня и мои данные не один раз.


  1. Mr-Arceni
    30.08.2025 20:21

    Спасибо за установщик, попробую его. Давно мечтал уменьшить количество геморроя при установке Arch на ZFS.

    Однако для меня главной проблемой оставалось обновление ядра и zfs. Может это я где-то намудрил фигни... Но у меня получалось так, что ZFS пакеты зависели от ядра, а ядро от ZFS пакетов, и я не мог обновить ни то ни другое из-за этого нормальным способом. Один раз только из Live среды, я тупо сносил ядро с zfs и ставил заново. Может что-то упускаю, и так делать ненормально?


    1. okhsunrog Автор
      30.08.2025 20:21

      Я не сталкивался с таким, ядро обычно никак не зависит от zfs-пакетов, только zfs пакеты зависят от ядра. Но на всякий случай подскажу: если нужно удалить пакеты, которые циклически друг от друга зависят, можно в команду pacman -Rns указать весь список пакетов, а не по одному удалять, так они все удалятся разом. Второй лайфхак (но так лучше не делать, не рекомендую) - добавить флаг -dd , тогда он не будет проверять, кто завит от этого пакета, и удалит его принудительно.
      Сам я сижу на linux-lts ядре и zfs-dkms пакете (можно из AUR, можно из archzfs репозитория, как я делаю), не знаю никаких проблем при одновлениях, это самая стабильная комбинация.
      Если есть желание - можем в личке подробно пообщаться на эту тему, у меня в профиле есть контактная информация


      1. uvelichitel
        30.08.2025 20:21

        "Сам я сижу на linux-lts ядре и zfs-dkms пакете (можно из AUR, можно из archzfs репозитория"


        Да ядро то накатывается, ему то че)) Вы совершенно правы, ядро обновляется вне зависимости от сторонних модулей. Только вы остаетесь без файловой системы))
        stable lts ядро убивает весь вкус arch) Сторонние репо (AUR, archzfs) избавляют от всяких гарантий. Ну вот какой смысл опаздывать за ядром и при этом не иметь гарантий сборки?) ZFS по лицензионным соображениям не поддерживается разработчиками ядра и драйверы openzfs опаздывают за свежими релизами ядра. В текущем году запаздывание усугубилось и на моей машине мне пришлось откатить назад даже linux-lts в ожидании драйверов.(zfs-dkms не компилировалось пару месяцев в этом году даже с lts. Причем откатываться то пришлось как раз Live флешкой, я оставался без файловой системы. А live флешка что бы сделать arch-chroot в zfs тоже должна была быть zfs capable, ее еще нужно было поискать/сделать)
        Вывод -- на двух стульях не усидеть. Если хотите bleeding-edge от arch ставьте / root на родной ext4 (ну пусть xfs, чтобы не как у всех) А уж эксперименты разворачивайте на остальных физических дисках, да и подмонтируйте куда хочется(пусть даже и в /home)
        zfs мне понравилось, снепшоты на удаленный диск и инкрементально, виртуальные разделы, виртуальные рейды (хоть параллельно диски хоть последовательно), скорость, чистка. Не понравилось -- не работает команда df и вообще трудно понять сколько свободного диска)) Но, блин, на мой взгляд, модернистская стратегия arch не рифмуется с запаздыванием разрабов openzfs.
        TL.DR: Root лучше на классике) А то ой)


        1. okhsunrog Автор
          30.08.2025 20:21

          В этом году? Мне кажется, маловероятно. zfs-2.2.7, релизнувшийся в декабре, уже поддерживал 6.12, нынешний LTS.

          Доводы адекватные, конечно, но для меня плюсы перевешивают :)

          А вместо df можно использовать zpool list / zfs list

          И странно представить ситуацию, чтобы пришлось загружаться с LiveUSB для починки, там же будет видно при обновлении, что dkms модули не установились. Если уж проморгали как-то и перезагрузились – на этот случай есть снэпшоты и ZFSBootMenu. Прямо из ZFSBootMenu можно откатить и спокойно загрузиться.


          1. uvelichitel
            30.08.2025 20:21

            "Прямо из ZFSBootMenu"

            Я гружусь из uefi-boot материнки. Без grub, вообще без загрузчика. Весь диск форматирован zfs, без загрузочных секторов, просто раздел /boot. В ZFSBootMenu не заходил. Где это?)) Какие кнопицы зажать?))


            1. okhsunrog Автор
              30.08.2025 20:21

              Я советую сделать так: /boot сделать не отдельным разделом, а просто директорией в рутовом датасете, который монтируется в /

              А boot раздел превратить в EFI раздел и закинуть туда EFI файл ZFSBootMenu, который можно скачать здесь: docs.zfsbootmenu.org

              Таким образом, вся система лежит целиком на ZFS, включаю boot. Не стоит его делать отдельным разделом, пусть просто лежит директорией в рут. А чтобы в UEFI появилась опция ZFSBootMenu, нужно просто добавить в UEFI запись с помощью утилиты efibootmgr.

              ZFSBootMenu – это один EFI файлик, он будет грузиться напрямую из UEFI, сканировать ZFS пулы, импортировать, искать там ядро / initramfs и загружать. Подробнее советую прочитать в документации ZFSBootMenu, там очень хорошо написано :)


          1. uvelichitel
            30.08.2025 20:21

            Именно zfs-2.2.7 и 6.12 модулей dkms и пришлось подождать. Вы совершенно правы. Еще была ветка на AUR 2.2.5 с постфиксом dev Или что то вроде того)) Типа волонтеры development branche openzfs))


            1. okhsunrog Автор
              30.08.2025 20:21

              Да, бывает и такое) Но бывает и как сейчас: последняя версия ZFS поддерживает ядро 6.16.

              В целом, обычно разработчики ZFS не гонятся со всех ног выпускать новый релиз сразу после релиза нового ядра. Новый релиз выходит тогда, когда становится готов набор пул реквестов, которые они хотят видеть в этом релизе, там свой график.

              А вообще, да, есть энтузиасты, которые к последней стабильной версии ZFS добавляют cherry-pick патчи для поддержки наипоследнейшего и новейшего ядра, когда ZFS отстаёт. Тоже видел такие пакеты в AUR


        1. okhsunrog Автор
          30.08.2025 20:21

          Дополню на всякий случай про Live флешку с ZFS. ISO можно взять тут: https://github.com/stevleibelt/arch-linux-live-cd-iso-with-zfs/releases

          Либо в релизах моего репозитория, там тоже автоматическая сборка ISO с ZFS: https://github.com/okhsunrog/archinstall_zfs/releases

          Ещё можно собрать такой ISO самому, в README моего проекта есть инструкции.


          1. uvelichitel
            30.08.2025 20:21

            Ага) И причем лучше сделать эту флешку прямо сейчас) А то потом, перед черным экраном, будет скушновато) Или искать у приятелей -- у кого есть рабочая *nix система с командой dd (а такая система есть не у многих приятелей) чтобы live image таки сделать))) А в идеологии arch такая флешка может и понадобиться))


            1. okhsunrog Автор
              30.08.2025 20:21

              Ещё раз: если у вас есть ZFSBootMenu, никакой LiveUSB не понадобится. ZFSBootMenu это сам по себе маленький Линукс.

              Оттуда можно как откатить систему к прошлому снэпшоту, так и сделать chroot, поменять что нужно в системе. Есть ещё более жирный образ ZFSBootMenu Recovery, я предпочитаю им пользоваться вместо стандартного. Там богатый набор утилит, которые могут понадобиться при восстановлении системы.

              Но я так и не пользовался этим. Просто через zrepl настроил снэпшоты раз в час. Если что-то пошло вдруг не так – я всегда из ZFSBootMenu могу парой нажатий кнопок откатить корневой датасет к тому состоянию, в котором он был час, или два часа назад, к примеру.


  1. useribs
    30.08.2025 20:21

    Очень интересно, спасибо! Раз уж преисполнились zfs, не тестировали случайно работу direct io с nvme? В предыдущих версия несмотря на primarycache=metadata и secondarycache=metadata все всеравно проходило через code path для ARC. Сейчас нет доступа к свободному железу с nvme, в общем 2.3 не успел протестировать. При многопоточной нагрузке раньше все было печально с загрузкой CPU и iowait, никакие настройки async очередей для чтения записи не помогали (точнее помогали плохо). Обсуждение: https://github.com/openzfs/zfs/pull/10018


    1. aakptz
      30.08.2025 20:21

      Интересный кейс. Можно увидеть вашу конфигурацию? И ещё типовой сценарий работы с данными? ARC это виртуальный кэш в оперативке. Быстрее RAM ничего в вашем компьютере/сервере нет. Помогает с горячими данными на чтении. Secondary cache это самый быстрый из блочных устройств. Обычно nvme ssd. Туда вытесняют теплые данные, чтобы в тащить в ARC если нужно. Но это все помогает при интенсивном чтении. При интенсивной записи кэш на чтение прироста не даёт. Тут важнее конфигурация zpool. Raidz и dRAID это аналоги Raid5. Медленная запись, быстрое чтение. Для интенсивной записи лучше выбрать stripe или mirror. Сравнение различных конфигураций есть тут

      https://github.com/ankek/awesome-zfs/blob/main/zfs-raid-comparison.md


      1. useribs
        30.08.2025 20:21

        Уже там не работаю). Это был просто один nvme, без всяких raid{x}. Типовой сценарий виртуалки (zvol's), volblocksize 16k, при генерации нагрузки с fio были совершшенно неадекватные показатели l.avg, iowait, в реальном кейсе при одновременной миграции нескольких вм (4) на сетке даже в 10гбит io на уже работающих на пуле вм вставал колом. В общем-то это и подтвердилось в чистых тестах fio. btrfs на этом же железе c fio тестами показывал <10% io.wait, zfs - больше 60%. сжатие выключено, все ashift учтены ).

        Наркомания про directio: https://github.com/openzfs/zfs/issues/8381#issuecomment-529174195 , в конце треда параметры которые помогли на zfs 2.x somewhat (iowait 40%), но всеравно не как btrfs на том же чистом тесте с fio. (iowait <10%)


    1. okhsunrog Автор
      30.08.2025 20:21

      Я бы протестировал, но у меня на единственной системе с NVMe включено шифрование диска и сжатие, мне кажется, именно они будут узким местом, а не ARC. Хотя может я и ошибаюсь, попробовать потестировать на отдельном датасете