Создание EFISTUB

Создание EFISTUB

в течение нескольких дней я гуглил везде, чтобы узнать, были ли у кого-то такие же проблемы, как у меня. вот мое ядро ​​Linux на моем Lenovo Z50-70 (возможно, это важно)

 $ uname -a
Linux Z50-Debian 4.7.0-1-amd64 #1 SMP Debian 4.7.8-1 (2016-10-19) x86_64 GNU/Linux

 $ lvdisplay  |grep -i path
  LV Path                /dev/Debian/Home
  LV Path                /dev/Debian/Root
  LV Path                /dev/Debian/Swap

# gdisk /dev/sda -l |grep 0
GPT fdisk (gdisk) version 1.0.1
Disk identifier (GUID): 4A75B640-D8A2-03A2-906D-9D9228B6E800
Partitions will be aligned on 2048-sector boundaries
Total free space is 3707 sectors (1.8 MiB)
   1            2048         3653631   1.7 GiB     2700  Basic data partition
   2         3653632         4601855   463.0 MiB   EF00  EFI system partition
   3         4601856         6752255   1.0 GiB     EF00  Basic data partition
   4         6752256         7014399   128.0 MiB   0C01  Microsoft reserved ...
   5         7014400       907063665   429.2 GiB   0700  Basic data partition
   6       907065344       908787711   841.0 MiB   2700  
   7       908787712       910155775   668.0 MiB   EF00  
   8       910155776       953745407   20.8 GiB    8E00  Linux
   9       953745408       976773119   11.0 GiB    2700  Basic data partition

Я следовал двум руководствам по использованию efi-stub (самозагрузчик ядра UEFI)

официальный Debian Wiki на efistub и руководство bitbinary по Debian и Efistub

но ни один из них не сработал.

проблема 1: Моя прошивка не находит EFI/Debian/vmlinuz.efi(но она нашла приложение rEFInd efi, а также grub, когда я впервые установил Debian)

проблема 2: при запуске vmlinuz.efiчерез rEFInd, он останавливает процесс загрузки с приглашением initramfs и ошибками, сообщающими мне, что не удалось смонтировать/найти root.

также

cat /proc/cmdline 

не отображает мой /proc/cmdline, а является общим без какой-либо указанной опции для монтирования root

проблема 3: как в руководстве, которое я использовал efibootmgr, но при каждой перезагрузке моя новая запись удаляется.

Я довольно новичок в мире (U)EFI, но мне бы очень хотелось, чтобы это сработало. Поскольку у меня сейчас почти нет идей, если вы знаете что-то, что может мне помочь, пожалуйста, кричите об этом!

Спасибо.

решение1

Этот вопрос старый, но поскольку на него нет ответа, и я недавно загрузил свою систему Archlinux с указанной конфигурацией, позвольте мне описать, как я это сделал. Моя спецификация:

OS : arch Linux (mainline kernel, Linux-zen kernel, linux-clear kernel).
System : HP laptop with UEFI 2.

Помимо этого я также пытался настроить безопасную загрузку с помощью собственных ключей (что еще больше усложнило настройку). Но я не буду касаться этой части здесь.

Первое, что вам нужно сделать, это настроить ваш, initramfsчтобы иметь правильный hooks. Это суть всей проблемы, с которой вы столкнулись (вероятно, и я тоже). Я имею опыт только в том, как Arch Linux собирает свой ramdisk/initramfs. Вам, возможно, придется преобразовать процесс для Debian (или любого другого дистрибутива, который вы можете использовать ).

Я начал с трех хуков, доступных в процессе сборки makinitcpio initramfs:

base hook ( this is the main and necessary hook )
udev hook ( it does the detection of the devices  of the system including the hard disk and root filesystem ).
LVM hook ( since you have LVM, this hooks would include the device mapper and set up the LVM volumes ).

Создание EFISTUB

Используйте инструмент objcopy из пакета binutils.

objcopy \
    --add-section .osrel="/etc/os-release"                          --change-section-vma .osrel=0x20000    \
    --add-section .cmdline=<(echo -n "${cmdline}")                  --change-section-vma .cmdline=0x30000  \
    --add-section .splash="${SPLASH}"                               --change-section-vma .splash=0x40000   \
    --add-section .linux="${linux}"                                 --change-section-vma .linux=0x2000000  \
    --add-section .initrd=<(cat "${INITRD_PREPEND[@]}" "${initrd}") --change-section-vma .initrd=0x3000000 \
    "${EFISTUB}" "${output}"
  wait $!

Приведенная выше команда по сути берет ваше ядро, iniramfs и параметры ядра и преобразует их в единый EFISTUB, который вы можете напрямую загрузить из прошивки (UEFI).

Здесь: $cmdline- это в основном параметры вашего ядра, и они должны, как минимум, содержать корневой путь, например, в вашем случае root=/dev/Debian/root $SPLASHэто должно быть изображение, которое вы хотите отображать в качестве заставки при загрузке.

$EFISTUBявляется общим linuxx64.efi.stub, который поставляется с systemd. На Arch Linux, он обычно размещается в /use/lib/systemd/efi/каталоге.

$output- это место, куда вы хотите вывести файл (которое, очевидно, должно находиться в ```ESP (системном разделе EFI), чтобы прошивка могла его обнаружить).

Затем с помощью efibootmgrможно сделать загрузочную запись вновь созданного EFISTUB:

# efibootmgr -c -d /dev/sda -p 2 -L "Debian EFISTUB" -l /efi/EFI/debian/linux-efi.efi 

В приведенном выше примере:

  • -cозначает создать (создать новую загрузочную запись)
  • -dпредназначен для указания на диск, где находится ESP.
  • -pуказывает на номер раздела этого диска.
  • -Lпредназначен для предоставления подходящей метки для загрузочной записи.
  • -lуказывает на загрузчик (в основном efistub). Я предположил, что он находится в каталоге EFI/debian в ESP и который смонтирован в /efi.

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

Руководство выше здесь загружает EFISTUB БЕЗ ПОМОЩИ КАКОГО-ЛИБО ЗАГРУЗЧИКА. Если вы загружаете несколько ОС (ядер), то вы можете добавить загрузчик для управления различными efistubs.

решение2

Я думаю, можно сделать так, что найдёшь установочный диск Debian и подключишь к ПК. Потом загрузишься с диска и пройдёшь меню устранения неполадок и восстановление файлов vmlinuz и других загрузочных файлов.

Связанный контент