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.efi
proceso 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 initramfs
para 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í:
$cmdline
son 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 $SPLASH
debe ser una imagen que desee mostrar como pantalla de presentación al iniciar.
$EFISTUB
es el genérico linuxx64.efi.stub
que viene con systemd
. En Arch Linux
, generalmente se coloca en /use/lib/systemd/efi/
el directorio.
$output
es 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:
-c
significa crear (para crear una nueva entrada de inicio)-d
es para apuntar al disco donde está el ESP.-p
apunta al número de partición de ese disco.-L
es para dar una etiqueta adecuada para la entrada de arranque.-l
apunta 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 UEFI
shell. Puede probar muchas cosas desde ese shell, incluido arrancar un kernel efistub
con 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.