Come avviare caricare il kernel usando il caricatore EFI stub (efistub)?


14

Ho Ubuntu 14.04 in esecuzione in modalità UEFI come unico sistema operativo, nessun doppio avvio qui. La versione del kernel è 3.13.0-24-generica. C'è una partizione EFI. In questo caso la partizione EFI non è quella predefinita /dev/sda1ma /dev/sda3perché ho effettivamente convertito la modalità BIOS in modalità EFI . Ho usato il grub-efi-amd64pacchetto, anche se in realtà carica il menu di avvio di GRUB dal menu di avvio del firmware UEFI (carichi di avvio UEFI \EFI\ubuntu\grubx64.efi).

Voglio saltare quel doppio passaggio di caricamento del menu di avvio e avviare più velocemente, direttamente dall'UEFI nel kernel. I kernel Ubuntu dal 12.10 hanno la funzione "Kernel EFI stub loader" .

So che devo copiare il kernel Ubuntu nella partizione EFI (possibilmente rinominare) e creare una voce nel menu di avvio UEFI (ad esempio usando efibootmgr). Quali comandi terminali esatti sono necessari per fare questo?

Risposte:


14

I comandi seguenti sono più generici quindi solo per la versione del kernel 3.13.0-35.

1. Montare la partizione efi e copiare lì i file del kernel

$ 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. Cambia il nome del file del kernel

Abbreviare il nome del file del kernel rimuovendolo -genericperché sembra che ci sia un limite di percorso di 39 caratteri e Rinomina i file del kernel per terminare .efi, questo garantisce la compatibilità con la maggior parte dei sistemi

$ 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'`

Il precedente accorciamento dei nomi dei file del kernel non è sufficiente per un kernel mainlinedpkg installato , perché ad esempio senza è ancora lungo 40 caratteri./EFI/ubuntu/vmlinuz-3.16.0-031600rc6.efi-generic

3. Aggiungere una nuova voce al menu di avvio di EFI

Sostituisci 3.13.0-35in questo esempio con la tua specifica versione del kernel

$ 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

Questa nuova voce del menu di avvio diventerà la nuova scelta di avvio predefinita.

Potrebbe non essere necessario ai parametri di debug in più debug, ignore_loglevel, libata.force=dump_ide crashkernel=384M-:128M. Initrddeve essere presente, altrimenti l'avvio si blocca su " Passato a clocksource tsc. " perché non è possibile aprire il dispositivo root sda1.


Non so come l'hai capito, ma sei fantastico. C'è sorprendentemente poca documentazione su questa caratteristica ordinata.
user3549648

Nel caso in cui non funzioni per te, prova a mettere argomenti di -le -utra virgolette doppie (o sfuggire alla barra rovesciata manualmente). È possibile verificare se questo è il problema eseguendolo efibootmgr -vdopo aver aggiunto una nuova voce al menu di avvio di EFI. Inoltre, nel caso in cui la tua macchina abbia più di un disco (ad esempio un SSD e un HDD), dovrai specificarne uno in base -dal valore predefinito /dev/sda(vedi man efibootmgr)
Peeyush Kushwaha

5

Secondo il wiki di Debian , questo può essere fatto in pochi semplici passaggi che sopravviveranno ad un aggiornamento del kernel .

Nota: ciò presuppone che sia installata una partizione EFI /boot/efi.

  1. Crea /etc/kernel/postinst.d/zz-update-efistubcon i seguenti contenuti:

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

    Questo è un hook che verrà eseguito sull'aggiornamento del kernel per copiare l'immagine del kernel più recente e initrd nella posizione appropriata. Quindi rendilo eseguibile ed eseguilo:

    sudo chmod +x /etc/kernel/postinst.d/zz-update-efistub
    sudo /etc/kernel/postinst.d/zz-update-efistub
    
  2. Aggiungi la voce di avvio:

    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"
    

    Non dimenticare di modificare gli argomenti -de in -pbase alla posizione della partizione di sistema EFI. Nel mio caso, è / dev / sdb1, ma è probabile che questo sia diverso per te. Probabilmente dovrai anche cambiare il root=valore nel cmdline del kernel nella tua partizione di root.

    (È possibile modificare l'etichetta in qualsiasi cosa si desidera modificando il -Lparametro.)

    La voce di avvio appena aggiunta diventerà la voce predefinita. E non si romperà dopo un aggiornamento del kernel, poiché l'hook si accerterà vmlinuze initrd.imgverrà sempre aggiornato.


Qualsiasi modo per farlo funzionare con avvio sicuro poiché sul mio laptop HP quando provo questo dà un errore di avvio sicuro (ovviamente posso disabilitare anche l'avvio sicuro)
Suici Doga,

Sembra che dovresti usare cryptboot e alcuni strumenti per firmare prima il kernel . È un po 'una seccatura soprattutto se non stai usando Arch (in quanto non esiste uno strumento pronto per l'uso), quindi disabiliterei solo l'avvio sicuro.
Léo Lam,

Che ne dici di copiare il kernel .signed?
Suici Doga,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.