Proxmox VE. Восстановление загрузчика host системы на ZFS после zpool upgrade -a

gost-grub-recovery-main Роутеры

Доброго времени, читателям блога!

Немного предыстории.
Столкнулся с рядом проблем на базе файловой системы 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 прошёл без ошибок. Пока наблюдаю …

Благодарю за ваше время!

Всего хорошего на просторах Интернета 😉

Хочешь получать уведомления о выходе новых статей?
Loading
GregoryGost

Мир интересен, если вы достаточно любопытны!!!

Оцените автора
GREGORY GOST
Добавить комментарий

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

  1. Alex Murphy

    Григорий, а как обстоит с ошибками дело сейчас? Они уже вновь проявились или их больше нет?

    Ответить
    1. GregoryGost автор

      Ошибок больше не было, полёт нормальный!