Доброго времени, читателям блога!
Немного предыстории.
Столкнулся с рядом проблем на базе файловой системы ZFS. Сейчас в инсталляции она представлена в виде 4х дисков по 3Тб и одного SSD на 128Гб для ZIL и L2ARC.
Как ранее описывал https://gregory-gost.ru/domashnij-server-chast-2-ustanovka-sistemy-virtualizaczii-proxmox/
За время жизни сервера я сменил все существующие диски с Seagate на WD по причине их выхода из строя (большое кол-во битых секторов). Они стабильно отработали 3,5 года (согласно ресурсным записям по их времени наработки). В тот момент я прогонял их все через Victoria HDD и их состояние было ясным и понятным (пошли на магнитики).
После замены всех 4х дисков, неожиданно стали появляться аналогичные ошибки чтения и записи на диск. «Ну вот» подумал я, «неужели WD такие плохие и сыпятся почти сразу». Закупил другой диск, но уже в 4Тб (предварительно изучив возможность использования в одном пуле дисков разной ёмкости — и да это возможно)
Но и это не помогло. Новый диск стал также выпадать в FAULT.
Далее я подумал, что виноваты контроллеры на материнской плате, менял диски местами в корзине, но проблема следовала за диском.
Как итог 3 новых диска по 4Тб в дополнение к текущим 4м, но с одинаковой проблемой.
Далее последовала череда проверки всех дисков через Victoria HDD, но все диски были в целости. Ни намёка на проблемы.
Следом было принято решение обновить 7 версию до последней поддерживаемой.
Результата это не принесло.
Решил обновить систему дальше с 7 до 8 версии.
Обновление прошло штатно. Повозился с пулом ZFS под данные, увидел уведомление, что не все новые функции включены для пулов.
Решил обновить поддерживаемые возможности пулов (blake3 и др.)
После запуска команды ниже. Произошла досадная ситуация.
zpool upgrade -a
Перестала загружаться хост система т.к. у материнки стоит Legacy система boot загрузки, а не UEFI.
И т.к. Proxmox апгрейдится с 5 версии, а уже 8, то стоял загрузчик GRUB
По итогу система застряла в grub rescue>
оболочке
Немного информации, а в чем собственно дело
Grub имеет ограниченную реализацию чтения данных из ZFS
- ZFS меняет формат диска с помощью функций zpool (zpool-features)
- Функции добавляются только в незначительных обновлениях версий (например, с 0.7.x -> 0.8.x или 0.8.x -> 2.0.x) https://github.com/openzfs/zfs/blob/master/RELEASES.md
- Выполнение
zpool upgrade
в пуле позволяет в дальнейшем использовать эти функции. - Совместимые только для чтения функции не должны вызывать никаких проблем.
- Новая функция может вызвать проблемы только в том случае, если она активна (например, установка для набора данных сжатия zstd приведет к тому, что feature@zstd_compress функция станет активной)
- GRUB не может читать данные из пула, который имеет несовместимую (или не совместимую только для чтения) активную функцию
Хрупкость загрузки из ZFS с помощью GRUB является причиной того, что последние системы Proxmox считывают ядро и образ initrd из раздела vfat размером 512 МБ, который создается перед разделом ZFS (начиная с PVE 5.4).
Образы ядра и initrd копируются в раздел vfat с помощью proxmox-boot-tool
(до Proxmox VE 6.4 утилита называлась pve-efiboot-tool
)
Посмотреть совместимые с GRUB2 функции можно командой
cat /usr/share/zfs/compatibility.d/grub2
Получим примерно такой вывод
# Features which are supported by GRUB2
allocation_classes
async_destroy
block_cloning
bookmarks
device_rebuild
embedded_data
empty_bpobj
enabled_txg
extensible_dataset
filesystem_limits
hole_birth
large_blocks
livelist
log_spacemap
lz4_compress
project_quota
resilver_defer
spacemap_histogram
spacemap_v2
userobj_accounting
zilsaxattr
zpool_checkpoint
Если хотим обновить заранее
Можно запустить отдельно для системного хост пула обновление функций с учётом совместимости с GRUB2
zpool upgrade -o compatibility=grub2 rpool
Восстановление
1. Загружаемся с помощью ISO-образа Proxmox VE версии 6.4 или новее.
Я использую программу balenaEtcher для записи образа на флешку. Вы можете использовать то, что вам удобнее.
2. Запускаемся с флешки и выбираем Install Proxmox VE (Debug Mode)
3. Выходим из первой оболочки отладки, набрав Ctrl + D или exit
Вторая оболочка отладки содержит все необходимые двоичные файлы для следующих шагов.
4. Импортируем корневой пул (обычно называемый rpool) с альтернативной точкой монтирования /mnt
zpool import -f -R /mnt rpool
5. Находим разделы, которые будут использоваться для proxmox-boot-tool
lsblk -o +FSTYPE
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT FSTYPE
sda 8:0 0 12G 0 disk zfs_member
├─sda1 8:1 0 1007K 0 part zfs_member
├─sda2 8:2 0 512M 0 part
└─sda3 8:3 0 11.5G 0 part zfs_member
sdb 8:16 0 12G 0 disk zfs_member
├─sdb1 8:17 0 1007K 0 part zfs_member
├─sdb2 8:18 0 512M 0 part
└─sdb3 8:19 0 11.5G 0 part zfs_member
Два диска (sda, sdb) имеют второй раздел размером 512 МБ и без типа FS (sda2, sdb2).
Именно эти разделы (sda2, sdb2) нам и нужны.
6. Монтируем все виртуальные файловые системы, необходимые для запуска proxmox-boot-tool
mount -o rbind /proc /mnt/proc
mount -o rbind /sys /mnt/sys
mount -o rbind /dev /mnt/dev
mount -o rbind /run /mnt/run
Изменяем корневую директорию
chroot /mnt /bin/bash
7. Форматируем и инициализируем разделы в chroot
proxmox-boot-tool format /dev/sda2
proxmox-boot-tool format /dev/sdb2
proxmox-boot-tool init /dev/sda2
proxmox-boot-tool init /dev/sdb2
proxmox-boot-tool status
Re-executing '/usr/sbin/proxmox-boot-tool' in new private mount namespace..
373A-957C is configured with: grub
3961-474D is configured with: grub
8. Выходим из chroot оболочки (Ctrl+D или exit) и перезагружаемся (например, нажав CTRL + ALT + DEL)
9. Следующая загрузка может оказаться в initramfs оболочке из-за hostid несоответствия (из-за импорта пула ранее в установщике)
Просто импортируем его снова прям в initramfs, используя -f флаг:
zpool import -f rpool
Перезагружаемся и видим строку приглашения ввода логина, что свидетельствует об успешном восстановлении.
Далее идем в Web интерфейс и проверяем все.
Предистория продолжение
А по вопросу проблем ошибок чтения и записи в ZFS без видимых проблем с дисками — После перехода на 8 версию Proxmox resilvering прошёл без ошибок. Пока наблюдаю …
Благодарю за ваше время!
Всего хорошего на просторах Интернета 😉
Григорий, а как обстоит с ошибками дело сейчас? Они уже вновь проявились или их больше нет?
Ошибок больше не было, полёт нормальный!