Как загрузчик GRUB2 UEFI узнает, где искать файл конфигурации (или где находятся файлы 2-го этапа)?

Если я использую GRUB2 в разделе с поддержкой GPT, как загрузчик "узнает", где найти его файл конфигурации и другие файлы второго этапа?

Примечание. Я обнаружил некоторые упоминания о файле конфигурации, который находится в той же папке, что и загрузчик EFI GRUB, и содержит цепную загрузку "первичного" файла конфигурации из указанного раздела, но это определенно не соответствует действительности - существует только одно "что-то". Эфи "файл.

1 ответ

Решение

Существует несколько способов, которыми это может произойти:

  • Загрузите встроенный файл конфигурации.
  • Загрузите файл конфигурации в тот же каталог, что и двоичный файл GRUB.
  • Загрузите файл конфигурации по пути, указанному в grub-mkimage (вызывается grub-install) время исполнения.

Последнее, вероятно, является функциональностью, которую вы действительно запрашиваете - и это сочетание имени файла конфигурации по умолчанию (grub.cfg), префикс (по умолчанию /boot/grub, но может быть явно указано grub-mkimage) и имя раздела grub для раздела, в котором расположен префикс.

Если я бегу strings /boot/efi/EFI/debian/grubx64.efi | tail -1 на моей текущей рабочей станции выводится сохраненное значение: (,gpt2)/boot/grub, рассказывая grubx64.efi искать его файл конфигурации в /boot/grub на GPT-разделе 2. Бит перед запятой (имя дискового устройства GRUB) заполняется во время выполнения в зависимости от того, на каком диске grubx64.efi само изображение было загружено с.

Динамически загружаемые модули также будут искать в этом месте, но в каталоге для конкретной архитектуры / платформы - в этом случае /boot/grub/x86_64-efi,

Для изображения EFI я обнаружил, что grub-install или grub-mkimageвсегда будет вставлятьearly config в результирующий двоичный файл EFI, независимо от того, указали вы или нет --config FILEвариант. Если вы не укажете--config FILE вариант, он попытается встроить /boot/grub/x86-64_efi/load.cfg, Этот ранний файл конфигурации выглядит так:

    search.fs_uuid 8ef704aa-041d-443c-8ce6-71ac7e7f30da root hd0,gpt1
    set prefix=($root)'/boot/grub'
    configfile $prefix/grub.cfg  # this line seems can be omitted, because it seems to be the default next action
  • В uuid означает uuid файловой системы, а не раздела, вы можете использовать blkid для его вывода.
  • В hd0,gpt1 это просто намек.
  • Вы можете изменить первую строку на set root=hd0,gpt1

Это поведение по умолчанию автоматического внедрения отличается от режима BIOS, последний по умолчанию только вставляет строку префикса, например (,gpt3)/boot не заморачиваясь search.uuid.

Я также обнаружил, что в бионический EFI-образ Ubuntu встроена ранняя конфигурация, подобная этой https://source.puri.sm/pureos/core/grub2/blob/master/debian/build-efi-images

if [ -z "\$prefix" -o ! -e "\$prefix" ]; then
    if ! search --file --set=root /.disk/info; then
        search --file --set=root /.disk/mini-info
    fi
    set prefix=(\$root)/boot/grub
fi
if [ -e \$prefix/$platform/grub.cfg ]; then
    source \$prefix/$platform/grub.cfg
elif [ -e \$prefix/grub.cfg ]; then
    source \$prefix/grub.cfg
else
    source \$cmdpath/grub.cfg
fi

В cmdpath - это DIR двоичного файла efi, поэтому он вернется к grub.cfg в том же каталоге двоичного файла efi, который вы нашли.

Другие вопросы по тегам