Ошибка «cannot import 'rpool': no such pool available» после перезагрузки гипервизора почти всегда означает, что пул ZFS был создан с нестандартными параметрами или установщик Proxmox записал метаданные не на тот диск — и в обоих случаях настройку придётся переделывать с нуля. Чтобы не столкнуться с этим, важно с самого начала понимать, как Proxmox VE работает с ZFS: инсталлятор создаёт пул rpool на корневых дисках, а дополнительные массивы для виртуальных машин добавляются отдельно через веб-интерфейс или командную строку.
ZFS в Proxmox — это не просто файловая система, а полноценный менеджер томов со снапшотами, сжатием и проверкой целостности данных на лету. За это приходится платить повышенным расходом оперативной памяти и необходимостью грамотной начальной конфигурации: параметры, заданные при создании пула, изменить потом нельзя. Ниже разберём установку, выбор ключевых опций, оптимизацию под конкретные задачи и типичные ошибки.
Установка Proxmox VE на ZFS
При установке Proxmox VE с ISO-образа на экране выбора целевого диска нажмите кнопку Options — именно там скрываются все критичные настройки ZFS. По умолчанию предлагается вариант zfs (RAID0), но для одного диска это единственный вариант, а для нескольких доступны RAID1, RAID10, RAIDZ-1, RAIDZ-2 и RAIDZ-3.
Выбор уровня RAID определяет отказоустойчивость и полезный объём. Для домашнего сервера на двух дисках логичен RAID1 (зеркало), для четырёх и более дисков — RAIDZ-2, который переживает отказ двух накопителей одновременно. Учтите, что количество дисков в vdev нельзя изменить после создания пула — только добавлять новые vdev целиком.
В том же диалоге установщика обратите внимание на поля ashift, compress и hdsize. Параметр hdsize ограничивает объём, занимаемый системой, — полезно, если часть диска планируется под другие задачи. Сжатие lz4 включено по умолчанию, и отключать его нет причин: оно почти не нагружает процессор, но заметно экономит место.
☑️ Чек-лист перед установкой Proxmox на ZFS
Параметр ashift: почему это важнее всего
Ashift задаёт минимальный размер блока как степень двойки: ashift=9 соответствует секторам 512 байт, ashift=12 — 4096 байт. Современные диски, включая практически все SSD и большинство HDD объёмом от 1 ТБ, физически работают с секторами 4 КБ, даже если сообщают системе о 512-байтных. Если создать пул с ashift=9 на таком диске, каждая логическая запись превратится в несколько физических операций, и производительность упадёт в разы.
Ошибиться здесь особенно обидно, потому что ashift нельзя изменить после создания пула — только пересоздать vdev с переносом данных. Поэтому безопасная стратегия — ставить ashift=12 даже на дисках с честными 512-байтными секторами: небольшой проигрыш в эффективности хранения несопоставим с риском потери производительности.
Создание дополнительного пула для виртуальных машин
Системный пул rpool обычно занимает загрузочные диски, а под диски виртуальных машин принято выделять отдельный пул, например data. Создать его можно из веб-интерфейса: Datacenter → Storage → Add → ZFS, но предварительно сам пул должен существовать — веб-интерфейс лишь регистрирует его в конфигурации Proxmox.
Через терминал пул создаётся командой zpool create. Пример для зеркала из двух дисков:
zpool create -o ashift=12 -O compression=lz4 -O atime=off data mirror /dev/sdb /dev/sdc
Используйте постоянные идентификаторы дисков из /dev/disk/by-id/ вместо /dev/sdX — буквы устройств могут поменяться после перезагрузки или добавления нового накопителя, и пул импортируется некорректно. После создания проверьте состояние командой zpool status: все устройства должны быть в состоянии ONLINE.
- 🔹 mirror — зеркало, максимальная скорость случайного чтения, половина ёмкости;
- 🔹 raidz1/raidz2 — больше полезного объёма, но ниже IOPS на случайных операциях;
- 🔹 -O atime=off — отключает обновление времени доступа, снижает лишнюю запись;
- 🔹 -O compression=lz4 — быстрое сжатие, практически бесплатное по ресурсам.
Настройка recordsize и volblocksize под нагрузку
Параметр recordsize определяет максимальный размер блока для файлов (по умолчанию 128K), а volblocksize — размер блока для томов zvol, на которых лежат диски виртуальных машин. Для типовых ВМ с базами данных слишком крупный блок вызывает write amplification: запись 8 КБ из гостевой ОС превращается в перезапись блока 128 КБ.
Для дисков ВМ с MySQL или PostgreSQL часто рекомендуют volblocksize 16K или 8K в зависимости от размера страницы конкретной СУБД, а для файловых хранилищ и бэкапов оставлять 128K или увеличивать до 1M. Точное оптимальное значение зависит от вашей нагрузки — перед массовым развёртыванием имеет смысл провести тест с реальным профилем записи, например через fio.
| Тип нагрузки | Рекомендуемый блок | Комментарий |
|---|---|---|
| Диски ВМ общего назначения | 8K–16K | Баланс между IOPS и накладными расходами |
| Базы данных (MySQL, PostgreSQL) | 8K–16K | Совпадает с размером страницы СУБД |
| Файловое хранилище, ISO, бэкапы | 128K–1M | Последовательные операции, крупный блок эффективнее |
| Контейнеры LXC | по умолчанию | Обычно достаточно стандартных настроек |
Как изменить volblocksize для существующего тома
Напрямую изменить volblocksize у существующего zvol нельзя. Нужно создать новый том с нужным значением и перенести данные: либо через Move Disk в веб-интерфейсе Proxmox на хранилище с другими настройками, либо клонированием zvol в командной строке. Планируйте миграцию на время простоя ВМ.
Тюнинг ARC: ограничение потребления памяти
Кэш ARC (Adaptive Replacement Cache) по умолчанию может занимать до половины оперативной памяти хоста. На гипервизоре, где память нужна виртуальным машинам, это приводит к нехватке RAM и переключению на swap. Симптом — внезапные тормоза ВМ при активной работе с дисками и растущее значение ARC size в выводе arc_summary.
Ограничить ARC можно, задав максимальный размер в байтах. Создайте файл конфигурации модуля:
echo "options zfs zfs_arc_max=8589934592" > /etc/modprobe.d/zfs.conf
update-initramfs -u
Значение 8589934592 — это 8 ГБ; подставьте своё, исходя из объёма RAM и числа ВМ. Распространённое практическое правило — оставлять ARC 1–4 ГБ на небольших хостах и не более четверти памяти на крупных, но универсальной нормы нет: следите за фактическим потреблением через arc_summary и корректируйте. Изменение вступит в силу после перезагрузки.
⚠️ Внимание: слишком маленький ARC ухудшает производительность чтения, потому что ZFS полагается на кэш сильнее, чем традиционные файловые системы. Не обрезайте ARC до минимума «для экономии» — найдите баланс наблюдением за hit ratio в arc_summary.
Дополнительные оптимизации и мониторинг
После базовой настройки полезно включить регулярные проверки целостности. Скраббинг (scrub) читает все данные пула и сверяет контрольные суммы — в Proxmox для него уже предусмотрены задания, но проверьте расписание и убедитесь, что оно не попадает на часы пиковой нагрузки. Статус последнего скраббинга виден в выводе zpool status.
- ⚙️
zfs set sync=disabled— ускоряет запись, но рискованно при отключении питания; - ⚙️
zfs set logbias=throughput— вариант для нагрузок с крупными блоками; - ⚙️
zpool iostat -v 5— наблюдение за нагрузкой на устройства в реальном времени; - ⚙️
zfs get all rpool— просмотр всех текущих свойств датасета.
⚠️ Внимание: отключение sync делает запись асинхронной и при внезапном отключении питания может привести к потере последних транзакций — для баз данных это означает повреждение. Применяйте эту опцию только на хранилищах с некритичными данными или при наличии ИБП с корректным завершением работы.
Для серверов без ECC-памяти ZFS остаётся рабочим вариантом — миф о том, что без ECC ZFS «опаснее других ФС», не подтверждён: любая файловая система страдает от ошибок памяти одинаково. Но если планируется серьёзная нагрузка и длительное хранение данных, ECC-память и качественный блок питания снижают риск тихого повреждения данных.
Типичные проблемы и их диагностика
Если пул перешёл в состояние DEGRADED, первым делом выполните zpool status -x — команда покажет, какое устройство выпало и почему. Замена диска выполняется командой zpool replace с указанием старого и нового устройства; после этого начнётся ресильверинг, прогресс которого виден в том же zpool status.
Медленная работа ВМ при здоровом пуле чаще всего связана с тремя причинами: неправильный ashift, переполненный пул или исчерпание памяти под ARC. ZFS заметно деградирует при заполнении выше примерно 80% — из-за механизма copy-on-write системе становится сложно находить свободные блоки. Держите запас свободного места и настройте мониторинг заполнения через встроенные метрики Proxmox.
⚠️ Внимание: снапшоты ZFS занимают место по мере изменения данных после их создания. Старый снапшот заполненного пула может «съесть» весь свободный объём — регулярно удаляйте неактуальные снапшоты и проверяйте их реальный размер колонкой USED в выводе zfs list -t snapshot.
Часто задаваемые вопросы
Можно ли перенести существующую установку Proxmox с ext4/LVM на ZFS?
Штатного способа конвертации нет. Потребуется переустановка с выбором ZFS в установщике и последующее восстановление виртуальных машин из резервных копий (например, созданных через Proxmox Backup Server или встроенный vzdump).
Сколько оперативной памяти нужно для ZFS в Proxmox?
Жёсткого минимума нет — Proxmox с ZFS работает и на 8 ГБ, если ограничить ARC. Часто встречающаяся рекомендация «1 ГБ RAM на 1 ТБ хранилища» относится к дедупликации, которую в Proxmox практически никогда не включают. Без дедупликации требования к памяти существенно ниже.
Нужно ли включать дедупликацию ZFS?
Для типового гипервизора — нет. Дедупликация требует очень большого объёма RAM для хранения таблиц и при нехватке памяти резко снижает производительность. Сжатие lz4 даёт значительную часть выгоды практически бесплатно.
Как добавить диски в существующий пул?
Расширить существующий vdev добавлением дисков нельзя (функция расширения RAIDZ появилась в свежих версиях OpenZFS, но её поддержку и ограничения стоит проверять в документации вашей версии Proxmox). Классический способ — добавить новый vdev командой zpool add, после чего пул начнёт использовать оба массива.
Что делать, если пул не импортируется после сбоя?
Попробуйте zpool import без аргументов — команда покажет доступные для импорта пулы. Импорт выполняется через zpool import -f имя_пула. Если пул повреждён серьёзно, не предпринимайте разрушительных действий вроде zpool clear без резервной копии и обратитесь к документации OpenZFS по восстановлению.