¿Cómo iniciar la carga del kernel utilizando el cargador EFI stub (efistub)?

14

Tengo Ubuntu 14.04 ejecutándose en modo UEFI como único sistema operativo, no hay arranque dual aquí. La versión del kernel es 3.13.0-24-generic. Hay una partición EFI. En este caso, la partición EFI no está en el valor predeterminado /dev/sda1sino /dev/sda3porque realmente convertí el modo BIOS al modo EFI . He usado el grub-efi-amd64paquete, aunque eso realmente carga el menú de arranque GRUB desde el menú de arranque del firmware UEFI (cargas de arranque UEFI \EFI\ubuntu\grubx64.efi).

Quiero omitir ese paso de carga del menú de arranque doble y arrancar más rápido, directamente desde UEFI en el kernel. Los núcleos de Ubuntu desde la 12.10 tienen la función "Kernel EFI stub loader" .

Sé que necesito copiar el kernel de Ubuntu en la partición EFI (posiblemente cambiar el nombre) y crear una entrada en el menú de arranque UEFI (por ejemplo, usando efibootmgr). ¿Qué comandos de terminal exactos son necesarios para hacer esto?

Pro Backup
fuente

Respuestas:

14

Los siguientes comandos son más genéricos que para la versión 3.13.0-35 del kernel únicamente.

1. Monte la partición efi y copie allí los archivos del núcleo

$ 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. Cambiar el nombre del archivo del núcleo

Acorte el nombre del archivo del núcleo al eliminarlo -genericporque parece que hay un límite de ruta de 39 caracteres de longitud y Cambiar el nombre de los archivos del núcleo para terminar .efi, esto garantiza la compatibilidad con la mayoría de los sistemas

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

El acortamiento del nombre del archivo de kernel de nombre anterior no es suficiente para un kernel de línea principaldpkg instalado , porque por ejemplo, sin todavía tiene 40 caracteres de longitud./EFI/ubuntu/vmlinuz-3.16.0-031600rc6.efi-generic

3. Agregue una nueva entrada al menú de arranque EFI

Reemplace 3.13.0-35en este ejemplo con su versión de kernel específica

$ 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

Esta nueva entrada del menú de inicio se convertirá en su nueva opción de inicio predeterminada.

Puede que no necesite los parámetros de depuración adicionales debug, ignore_loglevel, libata.force=dump_idy crashkernel=384M-:128M. Initrddebe estar presente; de ​​lo contrario, el inicio se bloquea en " Cambiado a tscksource tsc " porque el dispositivo raíz sda1 no se puede abrir.

Pro Backup
fuente
No sé cómo te diste cuenta de esto, pero eres increíble. Sorprendentemente, hay pocos documentos sobre esta característica ordenada.
user3549648
En caso de que no funcione, intente poner argumentos de -ly -uentre comillas dobles (o escapar de la barra invertida manualmente). Puede probar si este es el problema ejecutando efibootmgr -vdespués de haber agregado una nueva entrada al menú de arranque de EFI. Además, en caso de que su máquina tenga más de un disco (digamos un SSD y un HDD), entonces deberá especificar uno con los -dvalores predeterminados /dev/sda(ver man efibootmgr)
Peeyush Kushwaha
5

Según el wiki de Debian , esto se puede hacer en unos pocos pasos simples que sobrevivirán a una actualización del núcleo .

Nota: esto supone que tiene una partición EFI montada en /boot/efi.

  1. Crea /etc/kernel/postinst.d/zz-update-efistubcon los siguientes contenidos:

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

    Este es un enlace que se ejecutará en la actualización del núcleo para copiar la última imagen del núcleo e initrd en la ubicación adecuada. Luego hazlo ejecutable y ejecútalo:

    sudo chmod +x /etc/kernel/postinst.d/zz-update-efistub
    sudo /etc/kernel/postinst.d/zz-update-efistub
    
  2. Agregue la entrada de arranque:

    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"
    

    No olvide cambiar los argumentos -dy -pdependiendo de dónde esté su partición del sistema EFI. En mi caso, es / dev / sdb1, pero es probable que esto sea diferente para usted. Probablemente también tendrá que cambiar el root=valor en el cmdline del núcleo a su partición raíz.

    (Puede cambiar la etiqueta a lo que desee cambiando el -Lparámetro).

    La entrada de arranque que acaba de agregar se convertirá en la entrada predeterminada. Y no se romperá después de una actualización del núcleo, ya que el enlace se asegurará vmlinuzy initrd.imgsiempre se actualizará.

Léo Lam
fuente
Cualquier forma de hacer que funcione con arranque seguro ya que en mi computadora portátil HP cuando lo intento me da un error de arranque seguro (por supuesto, también puedo desactivar el arranque seguro)
Suici Doga
Parece que primero tendría que usar cryptboot y algunas herramientas para firmar el núcleo . Es un poco complicado, especialmente si no está usando Arch (ya que no hay una herramienta lista para usar), por lo que simplemente deshabilitaría el arranque seguro.
Léo Lam
¿Qué hay de copiar el núcleo .signed?
Suici Doga