23 noviembre 2006

Recuperar el arranque (grub) tras reinstalar windows

Muchos nuevos usuarios de Línux se han encontrado con la curiosidad inesperada de que cuando les toca reinstalar windows en un disco que comparten con linux, la instalación de windows borra el arranque de linux, por lo que no puede arrancar aunque siga estando instalado. Esto es bastante sencillo de arreglar actualmente. Hace relativamente poco tiempo había que ser previsor y tener una copia del arranque para restaurarla posteriormente. Ahora ya no.
Arrancamos el ordenador y vemos la horrorosa ventanita de colores punteados de windows con fondo negro. ¿Que hay que hacer? Pues encontrar rápidamente un disco de Linux, abrir la bandeja del CD, y arrancar el sistema con él, de la misma manera que cuando lo instalamos. Esta es la parte fácil. Vamos al meollo del asunto.
Pongamos que tenemos un disco de Debian sarge. Pues si mal no recuerdo, había que arrancar el sistema poniendo el parámetro "rescue", y lo demás será idéntico a lo que continúa. Pero como no lo recuerdo bien (y muchas debian han pasado por mis manos) mejor que os hagáis con un CD en vivo (CDlive) de Ubuntu y arranquéis con él.
Si es una suse hay que usar el modo de rescate, que no recuerdo si arranca con la consola... queda incompleta esta parte para suse. La completaré cuando vuelva a arrancar con ella. De todas maneras, el resto de la recuperación es idéntica en todas las distribuciones, puesto que todas usan el cargador grub.

Vale, tenemos el disco de Ubuntu y hemos arrancado con el. Tenemos el marrón anaranjado entorno característico de las últimas versiones. ¿Y ahora? Nos vamos a una consola, el entorno gráfico no nos vale para nada. Si, mucho tiempo de arranque perdido para nada. Quizá haya una opción de rescate para arrancar con la consola a secas, pero por ahora no la conozco. Para usar la consola tenemos dos opciones: ir a Aplicaciones>Accesorios>Terminal, o usar una consola del modo texto pulsando simultáneamente control+alt y F1. Puede ser cualquier F desde F1 hasta F6, con lo que tenemos 6 consolas de texto disponibles por defecto. Normalmente pide usuario y contraseña, pero en este caso, por ser un CD en vivo, no. Para volver a las X (el entorno gráfico), control+alt+f7, con lo que las X son la consola 7. Esto último será muy útil para todo tipo de configuraciones de emergencia que podamos tener.
Primero debemos saber cual es nuestra partición de arranque, porque tenemos que montarla. Si no lo sabemos (muy mal, eh) la forma en estas circunstancias es ir probando.
Si no conocéis cómo funciona el tema de particiones, discos y demás en Unix, he escrito otro artículo al efecto, Discos y particiones en Linux.
Tendremos que ir montando particiones tal que así:

sudo mount /dev/hda1 /mnt

Si ha montado sin dar ningún error, miramos el contenido de /mnt.
ls /mnt

Buscamos el directorio /boot o su contenido, /grub y otros archivos. ¿No está?
sudo umount /mnt

Y probamos otra vez con la segunda partición.
sudo mount /dev/hda2 /mnt


Esto, si no tenemos ni la más remota idea de por donde anda la partición, es una locura. Vamos a buscar una pista.
sudo fdisk -l /dev/sda

Esto nos muestra el listado de particiones del disco que le indiquemos, en este caso /dev/sda, con su tamaño y su tipo de sistema de ficheros. Viendo esto ya tendremos información suficiente para saber cual será la partición, o al menos no ir a ciegas.
Disco /dev/sda: 250.0 GB, 250059350016 bytes
255 cabezas, 63 sectores/pista, 30401 cilindros
Unidades = cilindros de 16065 * 512 = 8225280 bytes

Disposit. Inicio Comienzo Fin Bloques Id Sistema
/dev/sda1 1 13 104391 83 Linux
/dev/sda2 14 2018 16105162+ 83 Linux
/dev/sda3 2019 2149 1052257+ 82 Linux swap / Solaris
/dev/sda4 2150 30401 226934190 83 Linux

Supondremos disco ATA por ser más común, así que sda por hda. Las que sean de Linux (tipo 83) y tengan un tamaño pequeño son candidatas. En mi caso, tengo una partición específica para el arranque, /boot, por lo que, al ver que hda1 es la partición más pequeña supongo que debe contener el arranque. Si ésta no existe, será otra que tenga un tamaño pequeño. Además, es recomendable que la que contiene el arranque sea la primera, así que si en su momento lo montamos bien, no habrá duda. En mi caso la partición de usuarios es la más grande, por lo que hda4 es de los usuarios, y hda2 es la del sistema.
sudo mount /dev/hda1 /mnt
ls /mnt

Si vemos todo el árbol de directorios con /boot /bin /etc /usr y demás, y dentro de boot vemos grub, ya estamos a punto para el último paso, puesto que por fin tenemos la partición raiz montada en /mnt. En mi caso hda1 es directamente una partición de arranque, así que debo crear un directorio boot dentro de /mnt antes de hacer el montaje (sudo mkdir /mnt/boot) y después montar en /mnt/boot.
Ahora, si el disco con el que arranca nuestro sistema es el hda, escribiremos simplemente
sudo grub-install --root-directory=/mnt /dev/hda

Si nos dice algo de que no hay correspondencias en la bios o algo así, tenemos que comprobar que el archivo /mnt/boot/grub/device.map tenga algo coherente. Si tenemos varios discos, el nombre de cada dispositivo debe ser correcto y la numeración entre paréntesis debe ser consecuente con aquéllos. Por ejemplo:
(hd0) /dev/hda
(hd1) /dev/hdb
.

Finalmente reiniciamos, bien volviendo a las X o bien simplemente escribiendo
sudo reboot

No hay comentarios: