Найти в Дзене

При снятии NVME накопителя слетает загрузчик, почему это происходит?

Добрый день дорогой читатель, данное повествование не является истиной в последней инстанции, намедни случился казус о котором хочу поделиться, так как не часто встречаюсь с NVME накопителями. Об этом решил написать вдруг кто-то столкнется в подобным. И так, при снятии NVME накопителя и последующей установки (потребовалось проверить другой NVME накопитель на ошибки) в ту же конфигурацию и слетает загрузчик Arch Linux(как я изначально думал). Arch Linux установлен с использованием UEFI в чем же может быть проблема? А проблема заключается в том, как работают стандарты UEFI и реализация прошивок (BIOS) на многих материнских платах. Основная причина в том что загрузочные записи UEFI (boot entries) хранятся в NVRAM, а NVRAM это энергонезависимая память на материнской плате, а не на самом диске. Исходя из этого, когда физически извлекаем NVME-накопитель и включаем компьютер (или он проходит проверку оборудования при загрузке), прошивка UEFI обнаруживает, что путь к файлу загрузчика, указанн

Добрый день дорогой читатель, данное повествование не является истиной в последней инстанции, намедни случился казус о котором хочу поделиться, так как не часто встречаюсь с NVME накопителями. Об этом решил написать вдруг кто-то столкнется с подобным.

И так, при снятии NVME накопителя и последующей установки (потребовалось проверить другой NVME накопитель на ошибки) в ту же конфигурацию и слетает загрузчик Arch Linux(как я изначально думал). Arch Linux установлен с использованием UEFI в чем же может быть проблема?

А проблема заключается в том, как работают стандарты UEFI и реализация прошивок (BIOS) на многих материнских платах.

Основная причина в том что загрузочные записи UEFI (boot entries) хранятся в NVRAM, а NVRAM это энергонезависимая память на материнской плате, а не на самом диске.

Исходя из этого, когда физически извлекаем NVME-накопитель и включаем компьютер (или он проходит проверку оборудования при загрузке), прошивка UEFI обнаруживает, что путь к файлу загрузчика, указанный в NVRAM, больше не существует. Многие материнские платы в целях «очистки» автоматически удаляют невалидные записи из списка загрузки. В следствии чего в BIOS (то бишь UEFI) в разделе boot не возможно выбрать загрузочную запись (да само устройство можно, но записи нет). После возвращения диска запись сама не восстанавливается.

Как предотвратить это в будущем?

Чтобы загрузка сохранялась даже после извлечения диска, в теории можно использовать «запасной» путь загрузки (fallback boot path).

  1. Суть метода такова: UEFI всегда ищет файл по пути /EFI/BOOT/BOOTX64.EFI на EFI-разделе, если в NVRAM нет конкретных записей.
  2. Как настроить (на примере GRUB): При установке загрузчика добавьте флаг --removable то бишь команда примерно будет такой:
    grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=grub --removable

Это скопирует загрузчик в папку «по умолчанию», и материнская плата увидит диск как загрузочное устройство, даже если запись в NVRAM была стерта.

Как же восстановить сейчас?

Нужно заново прописать запись в NVRAM через efibootmgr или переустановить загрузчик (это самое простое решение):

  1. Загрузитесь с установочной флешки Arch Linux.
  2. Смонтируйте разделы (/ и /boot/efi) и зайдите в arch-chroot.
  3. Переустановите загрузчик (команда выше с флагом --removable лучший вариант) или просто выполните grub-install без флага, чтобы обновить запись в NVRAM.
  4. Проверьте результат командой efibootmgr -v.

некоторые читатели могут задаться вопросом, но почему же проделывав ту же самую операцию с ssd на sata-интерфейсе такое не происходит, может быть быть проблемы с NVME накопителем?

Нет, с самим NVME-накопителем проблем, скорее всего, нет. Разница в
поведении между SATA и NVME при их временном извлечении обусловлена
архитектурными различиями в том, как прошивка материнской платы (UEFI)
инициализирует эти устройства.

Почему это происходит с NVME, но не с SATA?

  • Разные контроллеры и драйверы: SATA-накопители используют стандартный AHCI-контроллер, который инициализируется на очень ранних этапах загрузки как базовое устройство хранения. NVME работает через шину PCIe и требует специфической инициализации в UEFI.
  • Агрессивная очистка NVRAM для PCIe-устройств: Прошивки многих материнских плат запрограммированы на мгновенную очистку переменных загрузки (Boot Entries), если устройство на шине PCIe (каким является NVME) не обнаружено при опросе оборудования. Для SATA-дисков BIOS часто проявляет «терпимость», сохраняя запись, так как это устройство считается более «стационарным» в архитектурном плане.
  • Динамическое распределение линий: Порты M.2 часто делят линии PCIe с другими компонентами или даже SATA-портами(встречалось на китайских материнских платах). При извлечении NVME прошивка перераспределяет ресурсы, что может приводить к сбросу привязанных к этому слоту конфигураций загрузки.

Подведя итог, проблема не в «железе» накопителя, а в логике работы UEFI материнской платы. Для неё отсутствие NVME-устройства на шине критическое изменение конфигурации, требующее удаления «мертвых» ссылок из NVRAM.

Как и упоминалось ранее, решением является использовать при установке загрузчика с флагом --removable. Это создаст файл по пути /EFI/BOOT/BOOTX64.EFI, который UEFI будет находить автоматически при подключении любого диска, даже если специфическая запись Arch Linux была удалена из памяти платы.

За основу взято информация по данной тематике из форумов и статей всемирной паутины на основе этой информации сделаны выводы, но при этом всего лишь от части мои предположения, прошу не принимать за аксиому.

За сим откланиваюсь...