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.efi
wird rEFInd
der 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, initramfs
dass 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
$cmdline
handelt es sich grundsätzlich um Ihre Kernel-Parameter, und sie müssen mindestens den Stammpfad enthalten. In Ihrem Fall root=/dev/Debian/root $SPLASH
sollte es sich beispielsweise um ein Bild handeln, das Sie beim Hochfahren als Begrüßungsbildschirm anzeigen möchten.
$EFISTUB
ist das generische Modell linuxx64.efi.stub
, das mit geliefert wird systemd
. Unter Arch Linux
wird es im Allgemeinen im /use/lib/systemd/efi/
Verzeichnis abgelegt.
$output
ist 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 efibootmgr
einen 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:
-c
steht für create (einen neuen Booteintrag erstellen)-d
dient zum Verweisen auf die Festplatte, auf der sich das ESP befindet.-p
zeigt auf die Partitionsnummer dieser Festplatte.-L
dient dazu, dem Booteintrag ein passendes Label zu geben.-l
verweist 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 efistub
fand 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 efistub
mit 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.