Ubuntu über EFISTUB booten

FatManStanding

Lt. Junior Grade
Registriert
Aug. 2021
Beiträge
385
Hallo,

ich versuche gerade als Alternative zu Grub EFISTUB mit meinem Ubuntu hinzubekommen. Ein Bsp. um einen EFI-Eintrag zu stellen wäre das hier

Code:
efibootmgr --create --disk /dev/sdX --part Y --label "Ubuntu" --loader /vmlinuz-linux --unicode 'root=block_device_identifier resume=block_device_identifier rw initrd=\initramfs-linux.img'

Bei Unklar ist mir:

bei 'disk' wird z. B. /dev/sda (und als 'part' die Nummer der ESP-Partition) eingetragen. Aber /dev/sda ist doch eine Bezeichnung unter Linux, nicht EFI. Muss ich den Eintrag ändern, wenn er nicht mehr sda ist? Wenn ich efibootmgr -v aufrufe wird kein 'sda' angezeigt sondern z. B. 'HD(1,GPT,UUID,....)

Soweit ich das verstehe ist vmlinuz-linux ein Link zum aktuellen Kernel. Es wäre also auch i.O. hier den Pfad zum Kernel einzutragen? Ich müsste den nur nach einem Update immer ändern. In anderen Bsp. werden hier Backslashes verwendet und der Pfad ab 'EFI' eingetragen ('\EFI\Debian\vmlinuz'). Liegt das an Unterschieden zwischen den Distributionen? Bei Ubuntu liegt der Kernel in /boot, bei Debian in /boot/efi/EFI/Debian/vmlinuz? Auch habe ich Bsp. gefunden die auf eine *.efi verweisen (\EFI\ubuntu\vmlinuz.efi).

'unicode' (oder -u) gibt die Boot-Parameter mit. Würde es hier ausreichen die aktuellen Bootparameter mit denen mein System aktuell läuft einzutragen? Anrufen kann man die mit 'cat /proc/cmdline'

Code:
BOOT_IMAGE=/boot/vmlinuz-6.2.0-36-generic root=UUID=596387d5-959b-4158-90af-65171d766ada ro quiet splash vt.handoff=7

Das unterscheidet sich schon deutlich von dem Bsp. oben. Bei mir wird keine Swap eingebunden (im Bsp. resume=block_device_identifier) und es wird nur 'read-only' eingebunden?

Anmerkung:
Es gibt wohl ein paar Scripte, die vereinfachen aber nichts weil dort keine Informationen ausgelesen werden sondern man die halt im Script einträgt und daraus der efibootmgr-Aufruf gebaut wird. Es macht also keinen Unterschied ob mir etwas im in efibootmgr unklar ist oder im Script.
 
Ich würde dir ja gerne helfen, aber ich tue mich schwer damit, die Frage zu finden.
 
FatManStanding schrieb:
Aber /dev/sda ist doch eine Bezeichnung unter Linux, nicht EFI.
/dev/sda wird auch nicht im Klartext in den Booteintrag geschrieben. Das wird das Tool entsprechend "übersetzen".

FatManStanding schrieb:
Soweit ich das verstehe ist vmlinuz-linux ein Link zum aktuellen Kernel.
Das ist ein relativer Pfad, der auf das Boot-Image zeigen muss. Die Dateien müssen für das UEFI zugänglich sein, was üblicherweise bedeutet, dass sie in der ESP Partition liegen, folglich ist auch die Pfadangabe relativ zum Root der ESP Partition. Wichtig ist, dass das Image mit einem Key signiert ist, den das UEFI als valide einstuft. Deshalb werden dort ja häufig gewisse shims geladen. Aber direkt ein Kernel sollte auch gehen, wenn er valide signiert ist (oder du musst Secure Boot deaktivieren).

FatManStanding schrieb:
Ich müsste den nur nach einem Update immer ändern.
Du brauchst eh ein Script, dass dir die Dateien kopiert und die Einträge aktuell hält.

FatManStanding schrieb:
In anderen Bsp. werden hier Backslashes verwendet und der Pfad ab 'EFI' eingetragen ('\EFI\Debian\vmlinuz'). Liegt das an Unterschieden zwischen den Distributionen?
Nein, das liegt daran, dass Microsoft bei der Entwicklung von EFI eine entscheidende Rolle gespielt hat.

FatManStanding schrieb:
'unicode' (oder -u) gibt die Boot-Parameter mit.
Nein, das sagt lediglich, dass die Boot-Parameter als UCS-2 interpretiert werden, nicht als ASCII. Aber ja: Die Argumente aus der cmdline sollte man anfügen.
 
Das ist ein relativer Pfad, der auf das Boot-Image zeigen muss. Die Dateien müssen für das UEFI zugänglich sein, was üblicherweise bedeutet, dass sie in der ESP Partition liegen, folglich ist auch die Pfadangabe relativ zum Root der ESP Partition.

Das ganze liegt bei mir in /boot. Was müsste ich dann konkret eintragen? Die ESP-Partition ist in /boot/efi eingehangen. "relativ zum Root der ESP Partition" geht ja aber nicht, wenn das Boot-Image in /boot liegt. Lediglich wenn ich hier eine *.efi eintrage müsste ich vermutlich EFI\ubuntu\grubx64.efi eintragen. Korrekt?

Du brauchst eh ein Script, dass dir die Dateien kopiert und die Einträge aktuell hält.

Was meinst du mit "Eintrag"? Den Eintrag im EFI? Wenn vmlinuz-linux ein Link zum aktuellen Kernel ist und ein Kernelupdate gemacht wird, müsste doch der Link wieder passen? Zumindest habe ich seit 2016 noch nie etwas wegen einem Kernel-Update anpassen müssen. Wenn der EFI-Eintrag also auf vmlinuz-linux verweist müsste der eigentlich immer aktuell sein.
 
Zuletzt bearbeitet:
FatManStanding schrieb:
"relativ zum Root der ESP Partition" geht ja aber nicht, wenn das Boot-Image in /boot liegt.
Genau. Die Dateien müssen in die ESP Partition. Deshalb schrieb ich ja, ein Script muss dafür sorgen, dass die Dateien an die richtige Stelle kommen.

FatManStanding schrieb:
Lediglich wenn ich hier eine *.efi eintrage müsste ich vermutlich EFI\ubuntu\grubx64.efi eintragen. Korrekt?
Das hat aber nichts mit EFISTUB zu tun, sondern ist dann wieder grub.

FatManStanding schrieb:
Wenn vmlinuz-linux ein Link zum aktuellen Kernel ist und ein Kernelupdate gemacht wird, müsste doch der Link wieder passen?
Das Ergebnis eines Kernel-Updates heißt aber nicht vmlinuz-linux, sondern irgendwas mit vmlinuz-<version>-generic oder ähnlich, muss also für jede Kernelversion entsprechend angepasst werden. Ein Link ist nicht möglich, da die ESP Partition üblicherweise ein FAT Dateisystem hat, da gibt es keine Links. Also muss deine Script Datei entweder die Dateien entsprechend umbenennen oder die Einträge aktuell halten, denn üblicherweise behältst du ja einen Fallback Eintrag der vorherigen Version.

FatManStanding schrieb:
Zumindest habe ich seit 2016 noch nie etwas wegen einem Kernel-Update anpassen müssen.
Weil die Distributionen eben entsprechende Scripte mitbringen, die die Einträge entsprechend anpassen - üblicherweise halt im Grub Bootmenu.
 
riversource schrieb:
Genau. Die Dateien müssen in die ESP Partition.

Jetzt hab ich es verstanden. Ich hatte nicht bedacht, dass die Kernel ja in /boot und damit in der ext4-Partition liegen und nicht in der ESP. 🫤

Angenommen ich pack den Kernel (vmlinuz-6.2.0-36-generic) in /boot/efi/EFI/ubuntu müsste der Eingabe bei efibootmgr "\EFI\ubuntu\vmlinuz-6.2.0-36-generic" sein.

Komisch an dem Boot-Parameter aus /proc/cmdline erscheint mit aber, dass dort 'ro', also read-only, steht

Code:
BOOT_IMAGE=/boot/vmlinuz-6.2.0-36-generic root=UUID=596387d5-959b-4158-90af-65171d766ada ro quiet splash vt.handoff=7

Die Root-Partition wird dich nicht read-only eingebunden. Die ganzen Beispiele die ich im Netz gefunden habe beziehen sich auf andere Distributionen oder könnten sehr alt sein.
 
FatManStanding schrieb:
Angenommen ich pack den Kernel (vmlinuz-6.2.0-36-generic) in /boot/efi/EFI/ubuntu müsste der Eingabe bei efibootmgr "\EFI\ubuntu\vmlinuz-6.2.0-36-generic" sein.
Genau. Wobei du beim Kopiervorgang natürlich auch den Dateinamen ändern kannst - in "vmlinuz-generic" und "vmlinuz-generic-old" zum Beispiel (einen Fallback Eintrag der funktionierenden letzten Konfiguration kann nicht schaden, finde ich). Dann bräuchtest du die EFI Bootmenueinträge nicht immer neu machen - es sei denn, du möchtest die Versionsnummer des Kernels mit anzeigen, wie bei grub üblich. Dann müssen sie natürlich bei jedem Update erneuert werden. Mit ein bisschen Script Magic sicher möglich. Ich denke, mit ein bisschen Suchen findet man auch passende Anleitungen dafür.

FatManStanding schrieb:
Die Root-Partition wird dich nicht read-only eingebunden.
Um den rw remount kümmern sich die init Scripte und nicht der Kernel, also üblicherweise systemd.
 
Ein Script hab ich hier https://wiki.debian.org/EFIStub gefunden, hab ich aber noch nicht genauer angesehen. Da ist so ein Beispiel für scheinbar alte Einträge. Dort wird noch "initrd" genannt, was wohl schon länger ersetzt wurde, auch unter Debian.
 
Das booten direkt über EFI geht erst einmal, der Gschwindigkeitszuwachs hielt sich aber in Grenzen.

Das was ich an Copy-Skripten gefunden habe ist auch nur ein

Code:
cp /vmlinuz /boot/efi/EFI/ubuntu/

wobei es mir komisch vorkommt aus / und nicht aus /boot zu kopieren. Lagen der Kernel früher direkt in / und sind das vielleicht einfach alte Scripte? Ich hab das mit "/vmlinuz" aus Beiträgen bis 2017 gefunden.

Wenn man das Script in "/etc/kernel/postinst.d" packt sollte es auch nur im Falle eines Kernelupdates ausgeführt werden?
 
FatManStanding schrieb:
Da ist so ein Beispiel für scheinbar alte Einträge. Dort wird noch "initrd" genannt, was wohl schon länger ersetzt wurde, auch unter Debian.
Nein, die initrd muss auch heute noch mitkopiert werden, wenn sie benutzt wird. Aktuelle Ubuntus haben sie noch.

FatManStanding schrieb:
wobei es mir komisch vorkommt aus / und nicht aus /boot zu kopieren.
Es gibt einige Linux Distributionen, die legen symbolische Links in / an - warum auch immer.

FatManStanding schrieb:
Wenn man das Script in "/etc/kernel/postinst.d" packt sollte es auch nur im Falle eines Kernelupdates ausgeführt werden?
Ja. Achte darauf, dass es alles macht, was du benötigst.
 
FatManStanding schrieb:
Das booten direkt über EFI geht erst einmal, der Gschwindigkeitszuwachs hielt sich aber in Grenzen.
Naja, was hast du erwartet? Sparen kannst du allenfalls die Wartezeit eines Grub Menus. Ob man nun Grub lädt und ausführt und EFISTUB lädt und ausführt, das wird in der Praxis allenfalls Millisekunden ausmachen.
 
Zurück
Oben