Construyendo la EFISTUB

Construyendo la EFISTUB

Durante unos días busqué en Google por todas partes para ver si alguien alguna vez había tenido los mismos problemas que yo. aquí está mi kernel de Linux en mi Lenovo Z50-70 (tal vez sea importante)

 $ 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

He seguido dos guías para usar efi-stub (el cargador de arranque automático UEFI del kernel)

Wiki oficial de Debian en efistub y guía bitbinaria sobre debian y efistub

pero ninguno de ellos funcionó.

número 1: Mi firmware no encuentra EFI/Debian/vmlinuz.efi(pero sí encontró la aplicación rEFInd efi, así como grub cuando instalé Debian por primera vez)

problema 2: Al iniciar el vmlinuz.efiproceso rEFInd, detiene el proceso de arranque con un mensaje de initramfs y errores que me indican que no se pudo montar/encontrar la raíz.

también

cat /proc/cmdline 

no hace eco de my /proc/cmdline, sino uno genérico sin ninguna opción especificada para el montaje raíz

número 3: como en la guía que he usado efibootmgr, pero con cada reinicio se elimina mi nueva entrada.

Soy bastante nuevo en el mundo (U)EFI, pero realmente desearía poder hacer que esto funcione. Como por ahora me he quedado sin ideas, si sabes algo que pueda ayudarme, ¡dímelo!

Gracias.

Respuesta1

Esta pregunta es antigua, pero como no tiene respuesta y recientemente inicié mi sistema archlinux con la configuración mencionada, déjame escribir cómo lo hice. Mi especificación:

OS : arch Linux (mainline kernel, Linux-zen kernel, linux-clear kernel).
System : HP laptop with UEFI 2.

Aparte de eso, también estaba intentando configurar el arranque seguro con mis propias claves (lo que complicó aún más la configuración). Pero no tocaré esa parte aquí.

Lo primero que debes hacer es configurarlo initramfspara tener el archivo hooks. Esa es la esencia de todo el problema que estás teniendo (probablemente, y yo también). Solo tengo experiencia en cómo arch Linux construye su ramdisk/initramfs. Es posible que tengas que convertir el proceso para Debian (o cualquier otra distribución que estés utilizando).

Comencé con tres ganchos disponibles en el proceso de construcción de makinitcpio initramfs:

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 ).

Construyendo la EFISTUB

Utilice la herramienta objcopy del paquete binutils.

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 $!

El comando anterior básicamente toma su kernel, iniramfs y los parámetros del kernel y los convierte en un único EFISTUB que puede iniciar directamente desde el firmware (UEFI).

Aquí: $cmdlineson básicamente los parámetros de su kernel y debe, al menos, contener la ruta raíz, por ejemplo, en su caso root=/dev/Debian/root $SPLASHdebe ser una imagen que desee mostrar como pantalla de presentación al iniciar.

$EFISTUBes el genérico linuxx64.efi.stubque viene con systemd. En Arch Linux, generalmente se coloca en /use/lib/systemd/efi/el directorio.

$outputes la ubicación donde desea generar el archivo (que obviamente debería estar en ```ESP (partición del sistema EFI) para que el firmware pueda detectarlo).

Luego, con la ayuda de efibootmgr, puede realizar una entrada de inicio del recién creado EFISTUB:

# efibootmgr -c -d /dev/sda -p 2 -L "Debian EFISTUB" -l /efi/EFI/debian/linux-efi.efi 

En el ejemplo anterior:

  • -csignifica crear (para crear una nueva entrada de inicio)
  • -des para apuntar al disco donde está el ESP.
  • -papunta al número de partición de ese disco.
  • -Les para dar una etiqueta adecuada para la entrada de arranque.
  • -lapunta al cargador (básicamente el efistub). Supuse que está ubicado en el directorio EFI/debian en el ESP y que está montado en/efi.

Consejos: mientras trabajaba en el arranque efistub, me resultó muy útil tener el UEFIshell. Puede probar muchas cosas desde ese shell, incluido arrancar un kernel efistubcon parámetros de kernel personalizados, etc.

La guía anterior aquí es cómo iniciar EFISTUB SIN LA AYUDA DE NINGÚN CARGADOR DE ARRANQUE. Si está iniciando varios sistemas operativos (kernels), puede agregar un cargador de inicio para administrar los diferentes archivos efistubs.

Respuesta2

Creo que puedes hacerlo buscando el disco de instalación de Debian y conectándolo a la PC. Luego inicie desde el disco y pase al menú de solución de problemas y recuperación de archivos vmlinuz y otros archivos de inicio.

información relacionada