Erstellen des EFISTUB

Erstellen des EFISTUB

Ich habe ein paar Tage lang überall gegoogelt, um zu sehen, ob jemand schon einmal dieselben Probleme hatte wie ich. Hier ist mein Linux-Kernel auf meinem Lenovo Z50-70 (vielleicht ist er wichtig)

 $ 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

Ich habe zwei Anleitungen zur Verwendung von efi-stub (dem Kernel-UEFI-Selbstbootlader) befolgt.

offizielles Debian-Wiki auf Efistub Und Bitbinary-Handbuch für Debian und Efistub

aber nichts davon hat funktioniert.

Fehler 1: Meine Firmware findet das nicht EFI/Debian/vmlinuz.efi(aber sie hat die rEFInd efi-App gefunden, sowie Grub, als ich Debian zum ersten Mal installiert habe)

Problem 2: beim Starten vmlinuz.efiwird rEFIndder Bootvorgang mit einer Initramfs-Eingabeaufforderung und Fehlermeldungen gestoppt, die mir mitteilen, dass das Mounten/Finden des Root-Zugriffs nicht möglich ist.

Auch

cat /proc/cmdline 

gibt nicht meins wieder /proc/cmdline, sondern ein generisches ohne angegebene Option für die Root-Montage

Problem 3: wie in der Anleitung, die ich verwendet habe efibootmgr, aber bei jedem Neustart wird mein neuer Eintrag gelöscht.

Ich bin ziemlich neu in der (U)EFI-Welt, aber ich wünschte wirklich, ich könnte das hinbekommen. Da mir momentan so ziemlich die Ideen ausgegangen sind, wenn Sie etwas wissen, das mir helfen könnte, schreien Sie es bitte heraus!

Danke schön.

Antwort1

Diese Frage ist alt, aber da es keine Antwort darauf gibt und ich mein Archlinux-System vor Kurzem mit der erwähnten Konfiguration gebootet habe, möchte ich hier beschreiben, wie ich es gemacht habe. Meine Spezifikation:

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

Außerdem habe ich versucht, Secure Boot mit meinen eigenen Schlüsseln einzurichten (was die Einrichtung noch komplizierter machte). Auf diesen Teil werde ich hier aber nicht näher eingehen.

Als Erstes müssen Sie Ihren so konfigurieren, initramfsdass er die richtige hat hooks. Das ist der Kern des gesamten Problems, das Sie haben (wahrscheinlich, und bei mir war es auch so). Ich habe nur Erfahrung damit, wie Arch Linux seine Ramdisk/Initramfs erstellt. Möglicherweise müssen Sie den Prozess für Debian (oder jede andere Distribution, die Sie möglicherweise verwenden) konvertieren.

Ich habe mit drei Hooks begonnen, die im Initramfs-Erstellungsprozess von makinitcpio verfügbar sind:

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 ).

Erstellen des EFISTUB

Verwenden Sie das Tool „Objcopy“ aus dem Binutils-Paket.

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 $!

Der obige Befehl nimmt grundsätzlich Ihren Kernel, iniramfs und die Kernel-Parameter und konvertiert sie in ein einzelnes EFISTUB, das Sie direkt von der Firmware (UEFI) booten können.

Dabei $cmdlinehandelt es sich grundsätzlich um Ihre Kernel-Parameter, und sie müssen mindestens den Stammpfad enthalten. In Ihrem Fall root=/dev/Debian/root $SPLASHsollte es sich beispielsweise um ein Bild handeln, das Sie beim Hochfahren als Begrüßungsbildschirm anzeigen möchten.

$EFISTUBist das generische Modell linuxx64.efi.stub, das mit geliefert wird systemd. Unter Arch Linuxwird es im Allgemeinen im /use/lib/systemd/efi/Verzeichnis abgelegt.

$outputist der Speicherort, an dem Sie die Datei ausgeben möchten (dieser sollte sich offensichtlich in der ```ESP (EFI-Systempartition) befinden, damit die Firmware ihn erkennen kann).

Anschließend können Sie mithilfe von efibootmgreinen Boot-Eintrag des neu erstellten erstellen EFISTUB:

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

Im obigen Beispiel:

  • -csteht für create (einen neuen Booteintrag erstellen)
  • -ddient zum Verweisen auf die Festplatte, auf der sich das ESP befindet.
  • -pzeigt auf die Partitionsnummer dieser Festplatte.
  • -Ldient dazu, dem Booteintrag ein passendes Label zu geben.
  • -lverweist auf den Loader (im Grunde den Efistub). Ich bin davon ausgegangen, dass dieser sich im ESP im Verzeichnis EFI/debian befindet und unter /efi gemountet ist.

Tipps: Beim Booten efistubfand ich es sehr praktisch, die Shell zu haben UEFI. Von dieser Shell aus können Sie viele Dinge ausprobieren, einschließlich des Bootens eines Kernels efistubmit benutzerdefinierten Kernelparametern usw.

Die obige Anleitung bootet EFISTUB OHNE DIE HILFE EINES BOOTLOADERS. Wenn Sie mehrere Betriebssysteme (Kernel) booten, können Sie einen Bootloader hinzufügen, um die verschiedenen zu verwalten efistubs.

Antwort2

Ich denke, Sie können dies tun, indem Sie die Debian-Installationsdiskette suchen und an den PC anschließen. Booten Sie dann von der Diskette und durchlaufen Sie das Menü zur Fehlerbehebung und stellen Sie die vmlinuz-Dateien und andere Bootdateien wieder her.

verwandte Informationen