martes, 26 de junio de 2012

Recuperar un sistema usándolo desde una sesión viva (parte 2)

Hace poco tiempo me pasó que un amigo que cambiando las particiones se cargó la partición donde estaba alojado el cargador de arranque GRUB. Luego de eso no pudo arrancar su pc. He aquí la solución.

Recuperar GRUB desde LiveCD (sesión viva)

Vamos a utilizar un LiveCD para recuperarlo. En este caso uso Ubuntu por ser la que más novatos usan, pero los comandos para montar la partición del disco rígido deben ser las mismas. Tengan en cuenta que es más seguro hacerlo desde la sesión viva del mismo sistema operativo que tienen instalado, i.e: si tienen instalado Ubuntu, usen un LiveCD de Ubuntu. Es posible hacerlo combinando distribuciones, pero no lo probé, así que no puedo estar seguro.

Iniciar la sesión viva

Empezamos por tomar un LiveCD de Ubuntu, el mismo que utilizaste para instalar el sistema operativo. Puede ser en CD/DVD o en un pendrive USB. Hay que tener cuidado de que estemos arrancando el USB/CD y no el disco local. Cuando aparezca el diálogo de ubiquity, vamos a seleccionar "Español" y "Probar Ubuntu".
 Es recomendable hacer un backup de datos en este punto.

Identificar la partición de nuestro sistema

Ahora lo problemático: identificar en qué partición está el directorio /boot. Para eso abrimos la terminal click sobre "Inicio" y empezar a escribir "terminal" (puede que aparezca con las primeras letras)
El dispositivo en donde se encuentra la partición /boot depende de como se haya instalado el sistema. En éste caso se instaló sobre un disco que tenía Windows XP utilizando la opción "Instalar Ubuntu junto a Windows XP". Entonces, tenemos que identificar esa partición. Vamos a utilizar fdisk -l como usuario root para identificar las particiones del disco local.
$ sudo fdisk -l
Estas son las particiones de mi disco. La partición con "Sistema" Linux es donde se instaló Ubuntu. Si eligieron alguna forma de particionado donde /boot esté en una partición separada del resto del sistema tendrán que montarla más adelante junto con la partición del sistema. Como ven, la partición donde está el directorio /boot es /dev/sda5.

Montar la partición del sistema

Identificada la partición del sistema vamos a montarla en el directorio /mnt del árbol de directorios de nuestra sesión viva para que sea accesible. Para montar particiones se usa el comando mount como root:
$ sudo mount [opciones] <partición> <directorio>
En nuestro caso la partición es /dev/sda5 y el directorio /mnt, no necesitamos ninguna opción para montar ésta partición. Ejecutamos el comando (recordar cambiar el nombre de la partición adecuada!)
$ sudo mount /dev/sda5 /mnt
Sólo si tenemos el directorio /boot en una partición diferente la montamos en /mnt/boot utilizando el mismo comando, por ejemplo:
$ sudo mount /dev/sdaX /mnt/boot

Montar los sistemas de directorios virtuales (virtual filesystems)

Es necesario para poder utilizar el sistema desde el disco local. Si alguna parte escapa a tu conocimiento, simplemente tomalo como "magia". La razón simple es que hace falta "mentirle" al sistema para poder utilizarlo desde el disco local, haciendole creer que la partición "root" (/) está en el directorio /mnt. Pero para lograrlo es necesario poder acceder al sistema que está corriendo realmente en nuestra sesión viva.
Entonces, montamos los sistemas virtuales /dev (información sobre dispositivos en el sistema), /proc (información de los procesos en ejecución del sistema) y /sys (información sobre el sistema y controladores). Nuevamente usamos el comando mount pero esta vez con la opción --bind:
$ sudo mount --bind /dev /mnt/dev
$ sudo mount --bind /proc /mnt/proc
$ sudo mount --bind /sys /mnt/sys 

Asegurar que ejecutamos comandos de la sesión viva

Para no llevarnos sorpresas con cambios de versiones entre la sesión viva y el sistema local.
Hay que tomar nota que estamos usando la opción --bind para no sobrescribir los archivos en el disco local!
$ sudo mount --bind /usr /mount/usr

Cambiar de directorio raíz (root)

Ahora viene la parte divertida (o no), cambiar el directorio root del sistema a nuestro disco local. Para esto usamos el comando chroot:
$ sudo chroot /mnt
A partir de este momento el directorio / (root) está en el disco local, ejecutamos comandos de la sesión viva y tenemos toda la información de procesos, dispositivos y controladores de la sesión viva, sorprendente, no?
También hay que notar que estamos registrados como usuario root. No es necesario anteponer sudo a cada comando que necesite privilegios.

Generando un archivo de configuración para GRUB

En Ubuntu, la creación del archivo de configuración de GRUB está a cargo de un comando (update-grub), en otras distribuciones tienen nombres diferentes, incluso algunas (como ArchLinux) no tienen ningún comando específico sino que usan las utilidades proporcionadas por GRUB (grub-mkconfig). es recomendable leer los manuales de cada una. En Ubuntu ejecutamos
# update-grub 

Reinstalar GRUB en el disco

El comando grub-install instala el cargador de arranque en el MBR (Registro de Arranque Principal) del disco local. Es importante notar que es necesario especificar el disco en el que queremos instalar el cargador de arranque, no la partición. Esto es, si la partición donde está instalado nuestro sistema es /dev/sda5, entonces el disco es /dev/sda (sin el número de partición)
# grub-install /dev/sda

Verificar la instalación

Usando el mismo comando podemos checkear que todo esté bien, para no tener que volver a rehacer todo. Siempre es bueno gastar unos segundos para luego no tener problemas que cuesten horas.
# grub-install --recheck /dev/sda

Salir de chroot

Si todo salió bien salimos de chroot. Para eso presionamos CTRL+D o alternativamente escribimos:
# exit

Desmontar los sistemas de archivos

Ahora desmontamos todos los sistemas de archivos que montamos para "engañar" a nuestra sesión viva
$ sudo umount /mnt/dev
$ sudo umount /mnt/proc
$ sudo umount /mnt/sys
$ sudo umount /mnt/usr
Si habíamos instalado una partición que contiene el directorio /boot aparte lo desmontamos también
$ sudo umount /mnt/boot
Y por último desmontamos el disco local
$ sudo umount /mnt
Noten que si falta desmontar alguna partición, no se puede desmontar el directorio /mnt, resultando en un error como me lo indicó la terminal (me olvidé de desmontar /mnt/usr). También nos da una ayuda para saber qué proceso o qué usuario está usando la partición.

Listo! a reiniciar la PC

Para reiniciar, se pude hacer desde el entorno gráfico pero ya que estamos en la terminal, escribimos
$ sudo reboot
Hay que asegurarse de que ésta vez la PC inicie desde el disco local.

Espero haberles sido útil.

No hay comentarios:

Publicar un comentario