Comments 12
Немного про то, как формируется grub64.efi, можно понять из моей древней статьи. Про встроенный конфиг там есть хороший комментарий.
Загрузчик действительно формируется grub-install динамически и включает в себя модули, которые ему нужны для того, чтобы найти ядро и собственные модули в дебрях LVM, RAID и прочих файловых систем. Причем, когда вы находитесь в целевой системе, grub-install сам выберет модули, необходимые для загрузки модулей grub и ядра, и не включит лишние модули. Это сломает загрузку если вы, например, перенесете root-раздел из раздела диска на LVM - модуля в GRUB не будет и свои модули и ядро он не найдет.
Часто, для установки загрузчика удобно загрузится в целевую систему с другого носителя с, например, SuperGRUB, примонтировать нужные /boot и /boot/efi и выполнить grub-install - он пересоберет GRUB с нужными модулями и станет возможна загрузка с основного диска. Этот же способ помогает перейти с legacy на UEFI.
Как я уже говорил, с EFI раздела по сути можно целиком загрузить ОС. Вероятно туда можно даже запихнуть ядро, но это не точно.
вот этой его странной и на мой взгляд не удобной особенностью, что файл содержит всё в себе
Ради безопасной загрузки. Загрузчик не имеет права загружать произвольный код, поэтому все модули вкомпилены в него.
Для пущей защиты может быть включён механизм lockdown, который ещё сильнее урезает возможности GRUB, блокируя возможные пути обхода Secure Boot, например, запрещает доступ к некоторым интерфейсам ACPI и MSR-регистрам CPU, ограничивает использование DMA для PCI-устройств, блокирует импорт кода ACPI из переменных EFI, не допускает манипуляции с портами ввода/вывода.
Я собирал ОС с ядром, базовыми приложениями и графикой в один файл. Ядро linux позволяет при сборке включить в себя корневую файловую систему.
На флешку в fat32 закидывается в каталог EFI этот единственный файл. После загрузки флешку можно вынуть. Всё очень шустро работает в ОЗУ. Жаль его объемы ограничены.
Пользуясь случаем, хочу напомнить о существовании в grub-install
флага --removable
. И настоятельно рекомендовать его к использованию. Как минимум, это избавляет от записи в NVRAM и от взаимодействия с убогим efibootmgr
, ну и переносимость установленной системы — бонусом.
Именно в этом была проблема не загрузки. В целом проблема простая, я не первый раз на неё натыкаюсь из-за того, что в системе ядро и "большой" grub лежит в /boot, но он находится по привычке на своём разделе, поэтому относительно него, grub и ядро лежит в корне этого раздела.
ЛОЛ, вот почему у меня (оказывается) файлы grub'а лежат в /boot/boot/grub*
Есть способ сделать grub загружаемым без записи в EFIVARS (NVRAM) Файл должен называться bootx64.efi Можно сделать такую установку передав grub-install параметр --removable. Можно существующий файл переименовать.
При обычной установке распространенный способ это передавать в grub. --efi-directory=... это путь куда смонтирован EFI раздел и --boot-directory=... это путь куда смонтирован загрузочный раздел, на котором будет конфиг граба и модули.
А пообще efi grub довольно просто устанавливать и легко кастомизировать, в свое время я писал скрипты для развертывания разных embedded сборок.
Можно посмотреть как убунта сделал efi с грабом. Если память не изменяет, в ефи мини граб запускает граб из целевой системы.
Немного про UEFI и GRUB