Рейтинг:0

Спасение grub на Ubuntu 18.04 с разделом btrfs

флаг uz

У меня есть небольшой сервер (HP ProLiant MicroServer Gen8) под управлением Ubuntu 18.04 64 бит с последнее универсальное ядро ​​HWE (5.4.0.74.83~18.04.67); у него есть два диска SATA, разделенные на разделы GPT, но загружающиеся в устаревшем режиме BIOS. Оба диска разделены следующим образом:

  • раздел 1 (1 МБ): «теневой» загрузочный раздел для кода GRUB;
  • раздел 2 (несколько ТБ): BtrFS, содержащий @ подтом для / и @дом подтом для /дом; /ботинок действительно находится под /@/ботинок
  • раздел 3 (4 ГБ): подкачка

Разделы BtrFS на двух дисках связаны вместе в зеркальной конфигурации BtrFS.

Через несколько дней отключилось электричество, и NAS так и не восстановился. При загрузке я только что получил ужасное «спасение личинки», в котором говорилось, что он не может найти целевой раздел (я думаю, указанный с помощью GUID тома BtrFS). Пытаюсь сделать лс (hd0,gpt2) (или действительно, любой другой раздел) сказал мне «неизвестная файловая система» (хотя insmod btrfs вроде работает корректно).

Думая, что с GRUB что-то не так, я загрузился с установочным ключом сервера Ubuntu 18.04 и попытался восстановить GRUB следующим образом:

  • смонтировать /dev/sda2 /mnt (/dev/sda2 раздел BtrFS); Я вижу, что все данные все еще там;
  • mount --bind /dev /mnt/@/dev; то же самое для /dev/pts, /прок, /sys, /бег (иначе DNS, управляемый resolvconf как в действующей системе, так и в «сломанной» системе, не будет работать)
  • chroot/mnt/@
  • внутри chroot я сделал смонтировать /dev/sda2 / -o subvol=@ в противном случае личиночный зонд/установка grub запутался бы; вне chroot, переделал привязку, так как это было затенено перемонтированием;
  • гора -а

Затем (с нескольких попыток) я попробовал несколько вещей:

  • переустановил GRUB на /dev/sda (grub-установить /dev/sda); пытался с --перепроверить и без, пробовал grub-mkdevicemap (удаление вручную ключевого USB-устройства из сгенерированного карта устройства файл);
  • воссоздал конфигурацию GRUB (обновление-личность);
  • обновил ядро, на самом деле не думая, что это большая проблема с версией ядра, но чтобы убедиться, что (1) я пытаюсь загрузить что-то, что точно не повреждено, и (2) чтобы иметь только что созданный initrd
  • проверил, все ли файлы ядра/initrd доступны для чтения (например, с помощью sha1sum /загрузка/*), так как сообщения GRUB об этом были пугающими — см. позже;
  • понизил GRUB (последняя версия 2.02, доступная в репозиториях) до нескольких исправлений ранее, поскольку я подозревал, что потеря мощности не имеет к этому особого отношения, но вместо этого это было какое-то обновление, которое сломало его.
  • бег btrfs проверить /dev/sda2 и btrfs проверить /dev/sdb2; оба запускались без ошибок, единственная проблема (отмеченная для обоих) заключалась в кеше свободного места одного блока (позже я смонтировал /dev/sda2/ с очистить кэш вариант на всякий случай)

Результаты всей этой ерунды были далеко не обнадеживающими: когда все сделано правильно, эта ерунда всегда снова приводит меня к спасение личинки, но на этот раз с более интересным поворотом:

  • Это может читал немного том BtrFS, но, так сказать, еле-еле; делает лс (hd0,gpt2)/ показывает подобъемы, но оба лс (hd0,gpt2)/@ и ls (hd0,gpt2)/@дома показывать пустые каталоги (поэтому он не может найти (hd0,gpt2)/@/загрузка/ а затем все необходимое для перехода в нормальный режим);
  • самое интересное, что есть и другие подтома, а именно три снимка, сделанные сценарием обновления версии Ubuntu; те вместо этого подтомы может быть прочитан GRUB; мало того: если я приспособлю префикс, корень и Ко. чтобы указать внутри подтомов снапшота, я могу умудриться перейти в "обычный" режим GRUB и, снова подкорректировав пути в пунктах меню, загрузить старое ядро, которое было в снапшоте (единственная проблема в том, что оно не может найти модули, поскольку я загружаю более старую версию ядра, которая больше не установлена ​​в текущей корневой файловой системе, но, учитывая, что они на самом деле не используются, загружается очень хорошо).

Однажды (когда я, вероятно, что-то напортачил в вышеупомянутом устанавливать пляски в chroot) мне удалось перезагрузиться и получить сразу нормальный режим, но GRUB всегда находил что-то плохое для всех записей в меню загрузки: в частности, для каждой записи он не мог загрузить ни ядро, ни initrd, давая пугающее сообщение об ошибке «inode not found» (или, в другом случае, «не удалось найти дескриптор блока»; у обоих нет совпадений в Google, кроме самих исходников GRUB, что всегда является плохим признаком); обратите внимание, что, как я сказал выше, во время живого USB-сеанса все они были читаемы.

Дополнительные мысли:

  • на материнской плате сервера есть странная проблема с контроллером SATA - кажется, что перечисление дисков занимает много времени, что привело к этой ошибке при обновлении до 18.04. https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1752961; единственное (печальное) исправление состояло в том, чтобы добавить спать 5 в initrd перед сканирование btrfs; это также приводит к тому, что второй диск /dev/sdc в некоторый живых USB запускается, но это не имело значения (когда это произошло, я также изменил имя файла в /dev, что, похоже, не имело особого отношения к результату);
  • Я думал о плохом ОЗУ, хотя это казалось маловероятным, потому что (1) после загрузки система работает нормально и (2) это ОЗУ ECC, и я ожидал, по крайней мере, какое-то сообщение об ошибке в случае; во всяком случае, я запустил MemTest, и уже несколько часов он работает без ошибок;
  • iLO сообщает об ошибке самопроверки при загрузке, которая, однако, кажется не связанной. позже ошибка была устранена обновлением прошивки до последней версии и очисткой NVRAM; как и ожидалось, это не имело никакого значения, но, по крайней мере, экран POST стал немного чище.

Моя текущая догадка примерно такая: ядро ​​HWE использует версию BtrFS с некоторыми функциями, несовместимыми с «обычной» версией Ubuntu 18.04 GRUB, поэтому все файлы/каталоги, которые записываются «сейчас», потенциально проблематичны для чтения GRUB; действительно, я видел, что между GRUB 2.02 и текущей версией (2.06) была некоторая работа над материалом BtrFS, хотя для сжатия zstd это не включено на моих дисках. Может быть, попытка более свежего GRUB может решить проблему? Но есть ли упакованная сборка GRUB 2.06, которая работает для 18.04?

Короче говоря: есть идеи, в чем может быть проблема и как ее исправить?

Рейтинг:1
флаг cn

любая идея о том, что проблема может быть

Не совсем, хотя я разделяю ваше подозрение, что grub и btrfs могут не сработаться.

и как это исправить?

Вы думали о том, чтобы избавить себя от этой головной боли и переместить /ботинок вне бтрфс?

Вы можете вырезать немного места (уменьшить раздел подкачки на 1G - своп все равно переоценен) и купите себе новый /ботинок раздел этого дополнительного 1G.

Для резервирования дисков можно использовать программный raid1 — grub его вполне поддерживает.

Вы потеряете возможность моментального снимка для /ботинок, хоть /ботинок достаточно мал, чтобы иметь какой-либо другой способ восстановить его.

флаг uz
Это одно из решений, о которых я подумал, но в этом случае, вероятно, я бы просто переделал весь сервер с нуля, используя более скучные варианты для всего (вероятно, MDRaid + LVM + ext4), поскольку btrfs в основном просто доставлял мне головную боль и плохая производительность. Что меня больше всего беспокоит, так это то, что эта установка работала безупречно в течение 5 лет или около того, а затем внезапно GRUB решает, что ему больше не нравится раздел, хотя он отлично монтируется практически на каждом ядре, которое я пробовал - это то, что просто не должно случаться.
флаг cn
@MatteoItalia Сейчас это не по теме, но я был в вашей ситуации. Затем я преобразовал свои машины с btrfs на ZFS, когда понял, что с Ubuntu 20.04 ZFS в корне (и `/boot`) хорошо развита и полностью поддерживается.
флаг uz
Если это, наконец, работает нормально, я могу попробовать ... Вы используете его с его собственными возможностями зеркалирования или с MDRaid под ним? Как вы справляетесь с синхронизацией загрузчика на разных дисках массива?
флаг cn
Grub поддерживает zfs (зеркало), а пакет grub автоматически устанавливает загрузчик на несколько дисков. Я использую режим UEFI, хотя. https://openzfs.github.io/openzfs-docs/Getting%20Started/Ubuntu/Ubuntu%2020.04%20Root%20on%20ZFS.html

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.