DEV Community

Cover image for Cómo resolver 'grub_memcpy not found' en Manjaro
Daniel M.
Daniel M.

Posted on

Cómo resolver 'grub_memcpy not found' en Manjaro

Dentro de los ordenadores portátiles, o laptops, existe un pequeño componente consumible, la pila de litio, que cambiarla puede llegar a ser un suplicio. No me refiero al hecho de quitar la gastada y poner otra como quien le cambia las pilas a un mando, sino a dos hechos unidos que a su vez te consumen a ti:

  1. desmontar la parte trasera del portátil.
  2. recuperar la parte del sistema que gestiona el arranque, el bootloader.

En este tutorial recopilo los pasos que he seguido para volver a habilitar el bootloader de Manjaro, una distribución basada en Arch Linux. El portátil es un Slimbook PROX14 que, por suerte, contiene la pila de litio debajo de la batería, por lo que el desmontaje no era complicado. Una vez cambiada la pila, vamos a seguir los pasos pero antes saber cuál era el síntoma:

error: symbol 'grub_memcpy' not found.
Entering rescue mode...
grub rescue>
Enter fullscreen mode Exit fullscreen mode

y hasta aquí, no esperemos que venga nadie a rescatarnos. Hemos perdido la configuración UEFI y tenemos una partición raíz cifrada con LUKS. El workaround ha sido arrancar con un Manjaro instalado en un USB y elegir un bootloader de ese sistema, ubicado en la carpeta:

/boot/EFI/Manjaro
Enter fullscreen mode Exit fullscreen mode

Recuperamos el bootloader

1. Arrancar con un Manjaro Live USB

Arranca el equipo desde un USB de Manjaro en modo UEFI. Este sistema se instaló con Balena Etcher.

Abrimos una terminal para seguir estos pasos.

2. Identificar las particiones

lsblk -f
Enter fullscreen mode Exit fullscreen mode

Ejemplo típico:

Partición Tipo Uso Ruta


nvme0n1p1 vfat EFI /boot/efi
nvme0n1p2 crypto_LUKS Sistema cifrado /


3. Desbloquear la partición cifrada

sudo cryptsetup open /dev/nvme0n1p2 luksroot
Enter fullscreen mode Exit fullscreen mode

Insertamos la contraseña de ese sistema cifrado y nos aparece si buscamos en:

ls -l /dev/mapper/
Enter fullscreen mode Exit fullscreen mode

4. Montar el sistema

sudo mount /dev/mapper/luksroot /mnt
sudo mount /dev/nvme0n1p1 /mnt/boot/efi
Enter fullscreen mode Exit fullscreen mode

No nos debería dar ningún error y si listamos el directorio /mnt, nos debería ir saliendo nuestro sistema nativo:

ls -l /mnt
Enter fullscreen mode Exit fullscreen mode

5. Montar sistemas virtuales

Esta parte fue clave, lo obvié en un primer intento y no lo conseguí. Con esos pasos fue distinto y no salieron errores en los pasos posteriores.

sudo mount --bind /dev /mnt/dev
sudo mount --bind /proc /mnt/proc
sudo mount --bind /sys /mnt/sys
sudo mount --bind /run /mnt/run
Enter fullscreen mode Exit fullscreen mode

6. Entrar en el sistema instalado mediante chroot

sudo chroot /mnt
Enter fullscreen mode Exit fullscreen mode

7. Asegurar que EFI variables está montado

mount -t efivarfs efivarfs /sys/firmware/efi/efivars
Enter fullscreen mode Exit fullscreen mode

8. Reinstalar GRUB limpio

grub-install   --target=x86_64-efi   --efi-directory=/boot/efi   --bootloader-id=Manjaro   --recheck
Enter fullscreen mode Exit fullscreen mode

El resultado de los pasos 7 y 8:

[manjaro /]# mount -t efivarfs efivarfs /sys/firmware/efi/efivars
[manjaro /]# grub-install \ --target=x86_64-efi \ --efi-directory=/boot/efi \ --bootloader-id=Manjaro \ --recheck
Installing for x86_64-efi platform. 
Installation finished. 
No error reported.
Enter fullscreen mode Exit fullscreen mode

9. Regenerar la configuración de GRUB

grub-mkconfig -o /boot/grub/grub.cfg
Enter fullscreen mode Exit fullscreen mode

10. Crear el fallback de arranque

En ese primer intento que comentaba en el paso 5, seguí los pasos que podrían darse para Arch Linux, pero al comprobar que Manjaro tiene su propio sistema, dupliqué algunas carpetas de /boot. Expongo el contenido de la carpeta /boot/efi/EFI:

[manjaro /]# ls -laR /boot/efi/EFI

/boot/efi/EFI: total 24 
drwxr-xr-x 6 root root 4096 ene 8 10:27 . 
drwxr-xr-x 4 root root 4096 ene 1 1970 .. 
drwxr-xr-x 2 root root 4096 ago 14 2024 boot 
drwxr-xr-x 4 root root 4096 ene 8 10:58 EFI 
drwxr-xr-x 2 root root 4096 ene 8 10:25 GRUB 
drwxr-xr-x 2 root root 4096 ago 14 2024 Manjaro

/boot/efi/EFI/boot: total 268 
drwxr-xr-x 2 root root 4096 ago 14 2024 . 
drwxr-xr-x 6 root root 4096 ene 8 10:27 .. 
-rwxr-xr-x 1 root root 266240 sep 29 08:24 bootx64.efi

/boot/efi/EFI/EFI: total 16 
drwxr-xr-x 4 root root 4096 ene 8 10:58 . 
drwxr-xr-x 6 root root 4096 ene 8 10:27 .. 
drwxr-xr-x 3 root root 4096 ene 8 10:58 EFI 
drwxr-xr-x 2 root root 4096 ene 8 10:27 manjaro

/boot/efi/EFI/EFI/EFI: total 12 
drwxr-xr-x 3 root root 4096 ene 8 10:58 . 
drwxr-xr-x 4 root root 4096 ene 8 10:58 .. 
drwxr-xr-x 2 root root 4096 ene 8 10:58 manjaro

/boot/efi/EFI/EFI/EFI/manjaro: total 164 
drwxr-xr-x 2 root root 4096 ene 8 10:58 . 
drwxr-xr-x 3 root root 4096 ene 8 10:58 .. 
-rwxr-xr-x 1 root root 159744 ene 8 10:58 grubx64.efi

/boot/efi/EFI/EFI/manjaro: total 164 
drwxr-xr-x 2 root root 4096 ene 8 10:27 . 
drwxr-xr-x 4 root root 4096 ene 8 10:58 .. 
-rwxr-xr-x 1 root root 159744 ene 8 10:27 grubx64.efi

/boot/efi/EFI/GRUB: total 164 
drwxr-xr-x 2 root root 4096 ene 8 10:25 . 
drwxr-xr-x 6 root root 4096 ene 8 10:27 .. 
-rwxr-xr-x 1 root root 159744 ene 8 10:25 grubx64.efi

/boot/efi/EFI/Manjaro: total 344 
drwxr-xr-x 2 root root 4096 ago 14 2024 . 
drwxr-xr-x 6 root root 4096 ene 8 10:27 .. 
-rwxr-xr-x 1 root root 344064 feb 8 21:32 grubx64.efi
Enter fullscreen mode Exit fullscreen mode

Me centro en las importantes, /boot/efi/EFI/Manjaro y la del fallback, /boot/efi/EFI/boot. El resto las borraré después, en realidad son dos que contienen las otras 6. Copio el archivo grubx64.efi y lo sobrenombro en la ubicación de la fallback.

cp /boot/efi/EFI/Manjaro/grubx64.efi    /boot/efi/EFI/boot/bootx64.efi
Enter fullscreen mode Exit fullscreen mode

Aunque sería raro que no fuese así, aquí compruebo que los tamaños coinciden.

[manjaro /]# cp /boot/efi/EFI/Manjaro/grubx64.efi \ /boot/efi/EFI/boot/bootx64.efi 
[manjaro /]# ls -l /boot/efi/EFI/boot/bootx64.efi 
-rwxr-xr-x 1 root root 344064 feb 8 21:46 /boot/efi/EFI/boot/bootx64.efi 
[manjaro /]# ls -l /boot/efi/EFI/Manjaro/grubx64.efi 
-rwxr-xr-x 1 root root 344064 feb 8 21:32 /boot/efi/EFI/Manjaro/grubx64.efi
Enter fullscreen mode Exit fullscreen mode

11. Salir y reiniciar

exit
sudo reboot
Enter fullscreen mode Exit fullscreen mode

y extraímos el USB con el Manjaro Live.


Limpieza del GRUB y orden de arranque

Si todo ha ido bien y nuestro sistema nativo ha arrancado, procedemos a poner un poco de orden.

1. Ver entradas UEFI

Como comentaba en el paso 5 del bloque anterior, tenía más de dos carpetas en /boot por lo que decidí comprobar cuáles eran las mal copiadas. Con el siguiente comando, puedes ver el registro del arranque y decidir qué hacer con las carpetas redundantes. En mi caso, las moví a un backup y probé si todo iba bien, por lo que decidí borrarlas a posteriori.

sudo efibootmgr -v
Enter fullscreen mode Exit fullscreen mode

El contenido:

BootCurrent: 0001 Timeout: 1 seconds 
BootOrder: 0001,0000 
Boot0000* Manjaro HD(1,GPT,73b40a30-b2a6-4754-a2c9-d97789fc433c,0x1000,0x96000)/\EFI\MANJARO\GRUBX64.EFI dp: 04 01 2a 00 01 00 00 00 00 10 00 00 00 00 00 00 00 60 09 00 00 00 00 00 30 0a b4 73 a6 b2 54 47 a2 c9 d9 77 89 fc 43 3c 02 02 / 04 04 36 00 5c 00 45 00 46 00 49 00 5c 00 4d 00 41 00 4e 00 4a 00 41 00 52 00 4f 00 5c 00 47 00 52 00 55 00 42 00 58 00 36 00 34 00 2e 00 45 00 46 00 49 00 00 00 / 7f ff 04 00 
Boot0001* UEFI OS HD(1,GPT,73b40a30-b2a6-4754-a2c9-d97789fc433c,0x1000,0x96000)/\EFI\BOOT\BOOTX64.EFI0000424f dp: 04 01 2a 00 01 00 00 00 00 10 00 00 00 00 00 00 00 60 09 00 00 00 00 00 30 0a b4 73 a6 b2 54 47 a2 c9 d9 77 89 fc 43 3c 02 02 / 04 04 30 00 5c 00 45 00 46 00 49 00 5c 00 42 00 4f 00 4f 00 54 00 5c 00 42 00 4f 00 4f 00 54 00 58 00 36 00 34 00 2e 00 45 00 46 00 49 00 00 00 / 7f ff 04 00 data: 00 00 42 4f
Enter fullscreen mode Exit fullscreen mode

Poner Manjaro como primera opción

sudo efibootmgr -o 0000,0001
Enter fullscreen mode Exit fullscreen mode

El contenido:

➜ ~ sudo efibootmgr -o 0000,0001 
BootCurrent: 0001 Timeout: 1 seconds BootOrder: 0000,0001 
Boot0000* Manjaro HD(1,GPT,73b40a30-b2a6-4754-a2c9-d97789fc433c,0x1000,0x96000)/\EFI\MANJARO\GRUBX64.EFI 
Boot0001* UEFI OS HD(1,GPT,73b40a30-b2a6-4754-a2c9-d97789fc433c,0x1000,0x96000)/\EFI\BOOT\BOOTX64.EFI0000424f
Enter fullscreen mode Exit fullscreen mode

El arranque de Manjaro sería el primero y si falla, el fallback toma el testigo. Este último registro se podría eliminar con:

sudo efibootmgr -b 0001 -B
Enter fullscreen mode Exit fullscreen mode

Pero mejor dejarlo así.

2. Limpiar copias antiguas (opcional)

sudo rm -rf /boot/efi/EFI/backup-EFI
sudo rm -rf /boot/efi/EFI/backup-GRUB
Enter fullscreen mode Exit fullscreen mode

Y hasta aquí, he podido restaurar el sistema de arranque de Manjaro sin víctimas. Mis agradecimientos a Juanra, Alejandro y José Luis porque este tutorial es un compendio de todos sus consejos.

Foto: "Albion Low Loader Heavy Haulage 1951
by pschube is licensed with CC BY 2.0

Top comments (0)