sábado, 30 de octubre de 2021

error: attempt to read or write outside of disk 'hd0'.

Un día enciendo el ordenador y me encuentro con la siguiente pantalla, en vez de aparecer el GRUB.


 error: attempt to read or write outside of disk 'hd0'.   
 Entering rescue mode...                                  
 grub rescue>                                             
                                                          

En mi caso el problema sabia de donde procedía. Era de la ultima actualización del sistema, y mas concretamente, de la actualización del gestor de arranque GRUB.

error: intento leer o escribir fuera del disco 'hd0'

Estaba claro, la actualización del GRUB había fallado en algún momento de dicha actualización.

Intente solucionar el problema, reinstalando grub en la partición primaria del primer disco duro. Osea en /dev/sda.

Usando el siguiente comando:

grub-install /dev/sda

Y luego actualizando las entradas del grub con el siguiente comando:

update-grub

Pero al reiniciar volvía a aparecer el error:

 error: attempt to read or write outside of disk 'hd0'.   
 Entering rescue mode...                                  
 grub rescue>                                             
                                                          
Vamos a solucionarlo usando los siguientes pasos:

1.- Localizar la partición en la que Debian GNU/Linux está presente usando los siguientes comandos:

 grub rescue > ls                                         
                                                          
y nos devolverá el listado de todos los discos duros, junto a todas las particiones de cada disco duro. Debemos identificar el disco duro como (hd0) y cada una de las particiones como (hd0, msdos1), (hd0, msdos2), etc.

Es posible que dependiendo de la versión del grub, la representación cambie, por ejemplo, podríamos ver (hd0,1) (hd0,2).
 (hd0) (hd0,msdos1) (hd0,msdos2) (hd0,msdos3)           
 (hd0,msdos4) (hd0,msdos5)                              
2.- Entonces ahora tenemos que buscar la partición del disco duro (hdX) (X= es el numero del disco duro) donde se encuentra instalado Debian GNU/Linux, para ello usamos el siguiente comando, y lo repetimos hasta que aparezca la instalación de Debian GNU/Linux

 grub rescue > ls (hd0,msdos1)/                        
                                                       
 grub rescue > ls (hd0,msdos2)/                        
                                                       
 grub rescue > ls (hd0,msdos3)/                        
                                                       
En mi caso personal es en la partición (hd0, msdos3), y nos debe de aparecer el sistema de archivos de Debian GNU/Linux

 grub rescue > ls (hd0,msdos3)/                         
 ./ ..// lost+found/ home/ etc/ media/ vmlinuz.old var/ 
 bin usr/ sbin lib lib32 lib64 libx32 boot/ dev/ proc/  
 root/ run/ sys/ tmp/ mnt/ srv/ opt/ .cache/            
 initrd.img.old vmlinuz initrd.img                      
                                                        
Entonces ya sabemos que el sistema se encuentra instalado (hd0,msdos3), el comando que hemos usado para saberlo es:

 grub rescue > ls (hd0,msdos3)/                        
                                                       
3.- Ahora vamos a usar permisos de root, para ello usamos el siguiente comando:

 grub rescue > set root=(hd0,msdos3)                    
                                                        
4.- Vamos a indicarle al sistema donde se encuentra el gestor de arranque grub, usando el siguiente comando:

 grub rescue > set prefix=(hd0,msdos3)/boot/grub        
                                                        
5.- Una vez realizado el comando anterior, vamos a cargar el GRUB de forma directa.

 grub rescue > insmod normal                            
                                                        
5.1.- y ahora arrancamos el grub, usando el siguiente comando:

 grub rescue > normal                                   
                                                        
Con esto nos aparecerá el grub que habíamos perdido.


6.- Arrancamos Debian GNU/Linux y lo primero que vamos hacer es instalar el grub, nuevamente, para ello usamos el siguiente comando:

 grub-install /dev/sda                                  
                                                        
7.- Y por ultimo actualizamos las entradas del GRUB, usando el siguiente comando:

 update-grub                                            
                                                        
A partir de este momento, hemos recuperado el gestor de arranque GRUB, instalado en la partición /dev/sda3 del primer disco duro /dev/sda.






Reinstalar GRUB usando GRUB RESCUE

Vamos a reinstalar el grub perdido, por la instalación de una versión de Windows, ya que tras instalar windows, este borra parte del gestor de arranque del GRUB

Esto es valido cuando nos aparece en pantalla alguno de los siguientes mensajes:

error: unknown filesystem
Entering rescue mode…
grub rescue>



error: no such partition.
Entering recue mode...
grub recue>

Es posible reparar/restaurar el grub mediante grub rescue >
Para ello debemos escribir los siguientes comandos en el promt de grub rescue:

  grub rescue> ls  

Nos muestra los discos duros y particiones de nuestro ordenador. Debemos identificar el disco duro como (hd0) y cada una de las particiones como (hd0, msdos1), (hd0, msdos2), etc.

Es posible que dependiendo de la versión del grub esta representación cambie, por ejemplo, podríamos ver (hd0,1) (hd0,2) etc...

Entonces debemos de escribir el siguiente comando:

  grub rescue> ls (hd0,msdos1)  

  grub rescue> ls (hd0,msdos2 

  grub rescue> ls (hd0,msdos3)                    
                                                                
Repetiremos este proceso hasta que identifiquemos el sistema de archivos propio de Linux. En el caso aparecerá un mensaje que dice:

  Filesystem is ext4  
                                                                 
Usamos el siguiente comando para asegurarnos que nos muestra el listado del sistema de archivos de Debian GNU/Linux.

NOTA IMPORTANTE: al final del comando usamos la contrabarra /

  grub rescue> ls (hd0,msdos3)/   

Cuando lo hayamos identificado, escribiremos el siguiente comando:

  grub rescue> set root=(hd0,msdos3 

A continuación:

  grub rescue> set prefix=(hd0,msdos3)/boot/grub   
 
Ahora usamos el comando:

  grub rescue> insmod normal                   

Y finalmente:

  grub rescue> normal   

Ahora habremos recuperado el grub de Linux para arrancar nuestros sistemas operativos. Pero esto no es todo, ahora seguidamente tendremos que arrancar nuestro sistema Debian GNU/Linux y entrar en un terminal de comandos para instalar del grub nuevamente

  # grub-install /dev/sda   
 
y actualizamos las entradas del grub usando el comando:

  # update-grub   









Swap - Area de intercambio

Cuando instalamos Debian GNU/Linux, el proceso de instalación nos pide que le asignemos un espacio para el sistema y otro para el swap o también llamada Área de intercambio.


La partición swap es un espacio de intercambio que utiliza el disco duro (HDD o SSD), en lugar de la memoria RAM para almacenar los datos temporalmente.

Los usuarios avanzados saben que cantidad de espacio tienen que asignar a la partición swap, pero los nuevos usuarios que van a instalar Debian GNU/Linux por primera vez, no saben que cantidad de espacio tiene que asignar a la partición swap. 

Cuando encendemos el ordenador, la memoria RAM está casi vacía, pues sólo va ocupando espacio con procesos que permiten arrancar el sistema, pero todavía no hay ningún programa abierto. 
A medida que usamos el ordenador y abrimos aplicaciones, como por ejemplo el navegador, el gestor de archivos, editor de documentos, etc... la memoria se va llenando poco a poco, hasta que llegamos al tope de la memoria y no queda más espacio, entonces el sistema operativo Debian GNU/Linux empieza a usar la memoria swap, para poder seguir trabajando.

Obviamente, la memoria RAM es mucho más rápida que la partición swap, si no usáramos la partición swap, el sistema lo mas normal es que se bloquee, y perdamos, todo o parte del trabajo que estemos realizando.

Que tengamos asignado un espacio para la memoria swap no quiere decir que tenga que utilizarse. (ya que no todos lo usuarios llenaran la memoria ram del sistema)


La primera duda de un nuevo usuario de Debian GNU/Linux:

¿Necesito una partición swap para instalar Linux?

Rotundamente no. No es necesario si tu pc tiene 16 GB o mas de memoria ram, (con las grandes cantidades de memoria que usan hoy en día los PC no es necesario). Ahora bien, si vas hibernar el sistema operativo SI es obligatorio tener una partición swap.

Aunque yo SIEMPRE aconsejo usar memoria swap, tanto si hibernas como si no hibernas.

La siguiente duda es:

¿Cuánto espacio en GB tiene que tener la particion swap?

La memoria ram, es limitada. Entonces yo aconsejo asignar a la partición swap, la misma cantidad de espacio de swap que tenemos de memoria ram.

Por ejemplo: si tenemos 8 GB de ram, le asignamos a la partición swap 8 GB.

El conjunto formado por la memoria RAM y la swap permite simular una RAM de mayor tamaño que la que hay instalada en un equipo. Esto tiene como ventaja que proporciona una memoria adicional que es a veces necesaria para continuar ejecutando procesos. 

 Partición swap 

La partición Swap se formatea en cada nueva instalación del sistema, generando aleatoriamente una nueva UUID para identificar la partición swap. 

OBSERVACIÓN: Aunque durante el proceso de instalación se le puede  indicar: NO formatear partición swap.


 Qué es UUID 

UUID son las siglas en ingles de Universally Unique IDentifier, traducido al español, significa literalmente, IDentificador Unico Universal.

Como tal, el UUID es un código identificador estándar usado durante la instalación del sistema operativo.

Es utilizado para reconocer y distinguir una partición dentro del sistema.

El UUID tiene una longitud de 128 bit, es decir, 16 bytes. El número de posibles UUID es de 3x1038, por ello las probabilidades de coincidir dos códigos UUID son extremadamente bajas.

Como tal, un UUID está conformado por 32 dígitos divididos en cinco grupos, que obedecen a la siguiente estructura: 8-4-4-4-12.
Es decir, 36 caracteres y cuatro guiones que los separan.

Por ejemplo: 12345678-1234-1234-1234-123456789112

MUY IMPORTANTE: Cuando se tiene dos o mas sistemas operativos GNU/Linux instalados en el mismo disco duro (HDD ó SSD), por defecto, durante la instalación del sistema operativo, la partición swap se formatea y se genera un nuevo UUID aleatorio, creando un problema en el o en los sistemas operativos que ya estaban instalados en el disco duro (HDD ó SSD).

Dicho problema aparece de diferentes formas, pero el mas visual y el mas rápido en apreciarse, es durante el arranque del sistema, pues el sistema se demora en arrancar 1 minuto y 30 segundos. A causa del nuevo UUID generado, que no coincide con  el UUID que estaba usando el sistema, hasta ese momento. Y se demora, porque esta buscando la partición swap que tiene el UUID anterior a la instalación del nuevo sistema operativo, ya que dicha partición se usa para hibernar el sistema.


El kernel de linux, configura la partición swap en dos ficheros diferentes:

- /etc/fstab
- /etc/initramfs-tools/conf.d/resume

en ambos ficheros se configura para poder usa la swap.

La estructura de UUID es la siguiente xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx


/etc/fstab

En este archivo de configuración se encuentra todos los puntos de montaje, incluida la partición swap con respectiva UUID




/etc/initramfs-tools/conf.d/resume

En el archivo resume, se usa el parámetro del mismo nombre: resume, para localizar la partición swap.

El archivo de configuración llamado resume se encuentra en la siguiente ruta: /etc/initramfs-tools/conf.d/

y contiene la estructura que dijimos antes: RESUME=UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx




Se puede deshabilitar cambiando el UUID por noresume, quedando asín: 

RESUME=none.

A partir de este momento no se podría hibernar el sistema operativo. Ya que no se esta usando partición swap.

Aunque lo correcto es actualizar el nuevo UUID de la partición swap, para que todo funcione correctamente.



 Soluciones al cambio del UUID 

 1- Añadir el parámetro noresume 

De forma eventual vamos a usar el parámetro noresume antes de cargar el sistema, directamente desde el grub de arranque. editamos la línea que carga el sistema y le agregamos al final el parámetro noresume al final de quiet splash


 2- Modificando la línea que carga el sistema operativo desde el grub 

Nos vamos a la ruta:

nano /etc/default/grub

y añadimos noresume al final de la linea que termina en quiet splash:

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash noresume"

Luego para que los cambios surtan efectos se tiene que actualizar el grub, usando el siguiente comando: update-grub

Nota muy importante: Este cambio se tiene que realizar en el grub que cargue todos los sistemas operativos instalados, no en el grub del sistema operativo que de error. Es decir en el grub por defecto que cargue todos y cada uno de los sistemas operativos instalados en el pc.


 3- Rectificando los archivos fstab y resume 

Cambiar el UUID erróneo en el nuevo UUID. Para ello, anotamos el código correcto para la partición swap, usando el siguiente comando:

lsblk -f

y copiamos y pegamos el UUID correcto de la partición swap, usando los siguientes comandos:

nano /etc/fstab


Cambiamos el UUID incorrecto por el nuevo UUID, y guardamos el cambio pulsando las teclas Control+o y salimos del archivo con Contral+x.

repetimos el proceso con el siguiente archivo:

nano /etc/initramfs-tools/conf.d/resume


Cambiamos el UUID incorrecto por el nuevo UUID, y guardamos el cambio pulsando las teclas Control+o y salimos del archivo con Contral+x.

Por ultimo actualizamos la nueva configuración, usando el siguiente comando:

update-initramfs -u

Reiniciamos el sistema y vemos como ya funciona correctamente



========================================================


OBSERVACION: Otras veces se demora al arrancar o al apagarse porque tenemos instalado el paquete el paquete unattended-upgrades. Entonces tenemos que desintalarlo

apt-get --purge remove unattended-upgrades

Despues actualizamos la nueva configuración, usando el siguiente comando:

update-initramfs -u

Reiniciamos el sistema y vemos como ya funciona correctamente.