Как загрузчик 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, который вы нашли.