Wie lade ich den Kernel mit dem EFI-Stub-Loader (efistub)?

14

Ich habe Ubuntu 14.04 im UEFI-Modus als einziges Betriebssystem ausgeführt, kein Dual-Boot hier. Die Kernelversion ist 3.13.0-24-generisch. Es gibt eine EFI-Partition. In diesem Fall ist die EFI-Partition nicht die Standardpartition, /dev/sda1sondern die, /dev/sda3weil ich den BIOS-Modus tatsächlich in den EFI-Modus konvertiert habe . Ich habe das grub-efi-amd64Paket verwendet, obwohl es das GRUB-Startmenü aus dem UEFI-Firmware-Startmenü lädt (UEFI-Start wird geladen \EFI\ubuntu\grubx64.efi).

Ich möchte diesen doppelten Ladeschritt überspringen und schneller direkt von UEFI in den Kernel booten. Die Ubuntu-Kernel seit 12.10 verfügen über die Funktion "Kernel EFI Stub Loader" .

Ich weiß, dass ich den Ubuntu-Kernel auf die EFI-Partition kopieren (möglicherweise umbenennen) und einen Eintrag im UEFI-Startmenü erstellen muss (z. B. mithilfe von efibootmgr). Welche genauen Terminalbefehle sind dazu erforderlich?

Pro Backup
quelle

Antworten:

14

Die folgenden Befehle sind allgemeiner als nur für die Kernel-Version 3.13.0-35.

1. Hängen Sie die efi-Partition ein und kopieren Sie die Kerneldateien dorthin

$ mount /dev/sda3 /boot/efi

$ mkdir -pv /boot/efi/EFI/ubuntu/

$ cp -uv /boot/vmlinuz-* /boot/initrd.img-* /boot/efi/EFI/ubuntu/
'/boot/vmlinuz-3.13.0-35-generic' -> '/boot/efi/EFI/ubuntu/vmlinuz-3.13.0-35-generic'
'/boot/initrd.img-3.13.0-35-generic' -> '/boot/efi/EFI/ubuntu/initrd.img-3.13.0-35-generic'

2. Ändern Sie den Namen der Kerneldatei

Kürzen Sie den Namen der Kerneldatei, indem Sie ihn entfernen, -genericda anscheinend eine Pfadbegrenzung von 39 Zeichen gilt und Sie die Kerneldatei (en) umbenennen müssen .efi, um die Kompatibilität mit den meisten Systemen zu gewährleisten

$ for f in /boot/efi/EFI/ubuntu/vmlinuz-*-generic; do mv -uv -- "$f" "${f//-generic/}.efi"; done
'/boot/efi/EFI/ubuntu/vmlinuz-3.13.0-35-generic' -> '/boot/efi/EFI/ubuntu/vmlinuz-3.13.0-35-generic.efi'`

Die obige Namenskürzung der Kerneldatei reicht für einen dpkginstallierten Mainline-Kernel nicht aus , da zum Beispiel /EFI/ubuntu/vmlinuz-3.16.0-031600rc6.efiwithout -genericnoch 40 Zeichen lang ist.

3. Fügen Sie dem EFI-Startmenü einen neuen Eintrag hinzu

Ersetzen Sie 3.13.0-35in diesem Beispiel durch Ihre spezifische Kernelversion

$ kv=3.13.0-35;efibootmgr -c -p 3 -L $kv -l \EFI\ubuntu\vmlinuz-$kv.efi -u root=/dev/sda1 initrd=\\EFI\\ubuntu\\initrd.img-$kv-generic ro rootfstype=ext4 debug ignore_loglevel libata.force=dump_id crashkernel=384M-:128M

Dieser neue Startmenüeintrag wird zu Ihrer neuen Standardstartoption.

Sie könnten die zusätzlichen Debugging - Parameter nicht benötigen debug, ignore_loglevel, libata.force=dump_idund crashkernel=384M-:128M. Initrdmuss vorhanden sein, sonst hängt boot bei " Switched to clocksource tsc. ", da das Root-Gerät sda1 nicht geöffnet werden kann.

Pro Backup
quelle
Ich weiß nicht, wie du das herausgefunden hast, aber du bist unglaublich. Es gibt überraschend wenig Doku um diese nette Funktion.
user3549648
Falls es nicht funktioniert für Sie versuchen , Argumente zu setzen -lund -uin doppelten Anführungszeichen (oder manuell zu entkommen Backslash). Sie können testen, ob dies das Problem ist, indem Sie ausführen, efibootmgr -vnachdem Sie dem EFI-Startmenü einen neuen Eintrag hinzugefügt haben. -d/dev/sdaman efibootmgr
Wenn
5

Laut Debian-Wiki kann dies in wenigen einfachen Schritten geschehen, die ein Kernel-Update überstehen .

Hinweis: Dies setzt voraus, dass Sie eine EFI-Partition installiert haben /boot/efi.

  1. Erstellen Sie /etc/kernel/postinst.d/zz-update-efistubmit folgenden Inhalten:

    #!/bin/sh
    cp /vmlinuz /initrd.img /boot/efi/EFI/ubuntu/
    

    Dies ist ein Hook, der beim Kernel-Update ausgeführt wird, um das neueste Kernel-Image und initrd an den entsprechenden Speicherort zu kopieren. Dann mache es ausführbar und starte es:

    sudo chmod +x /etc/kernel/postinst.d/zz-update-efistub
    sudo /etc/kernel/postinst.d/zz-update-efistub
    
  2. Fügen Sie den Boot-Eintrag hinzu:

    sudo efibootmgr -c -d /dev/sdb -p 1 -L "Ubuntu (efistub)" -l /EFI/ubuntu/vmlinuz -u "root=/dev/sdb2 rw initrd=/EFI/ubuntu/initrd.img quiet splash"
    

    Vergessen Sie nicht, die Argumente -dund zu ändern, -pje nachdem, wo sich Ihre EFI-Systempartition befindet. In meinem Fall ist es / dev / sdb1, aber dies ist wahrscheinlich für Sie anders. Sie müssen wahrscheinlich auch den root=Wert in der Kernel-Cmdline in Ihre Root-Partition ändern .

    (Sie können die Bezeichnung beliebig ändern, indem Sie den -LParameter ändern .)

    Der soeben hinzugefügte Starteintrag wird zum Standardeintrag. Und es wird nach einem Kernel-Update nicht kaputt gehen, da der Hook dafür sorgt vmlinuzund initrd.imgimmer aktualisiert wird.

Léo Lam
quelle
Wie auch immer, es funktioniert mit sicherem Start, da auf meinem HP Laptop, wenn ich dies versuche, ein Fehler beim sicheren Start
angezeigt
Es sieht so aus, als müssten Sie zuerst cryptboot und einige Tools verwenden, um den Kernel zu signieren . Es ist ein bisschen mühsam, vor allem wenn Sie Arch nicht verwenden (da es kein einsatzbereites Tool gibt), also würde ich einfach den sicheren Start deaktivieren.
Léo Lam
Was ist mit dem Kopieren des signierten Kernels?
Suici Doga