Arrancar desde dispositivos usb con grub

1. Introducción
2. Preparativos
3. Proceso
4. Observaciones

1. Introducción

En este pequeño artículo os mostraré como, haciendo uso de un disco duro local en el que tenemos grub instalado (en nuestro caso, el disco donde tenemos Debian Lenny), podremos arrancar otra distribución GNU/Linux instalada en un dispositivo USB (un disco usb o un simple pendrive) en aquellas maquinas que por su antigüedad, carecen de dicha característica en la propia bios.

2. Preparativos

Para empezar, vamos a situarnos. Imaginemos que tenemos un PC con un disco duro IDE particionado de la siguiente forma (podemos ver la estructura de nuestro disco con fdisk -l):

Nº Dispositivo Montaje Tipo Tamaño
1 /dev/hda1 /boot ext3 100mb * - Esta es la que nos interesa.
2 /dev/hda2 swap swap 256mb
3 /dev/hda5 / ext3 6gb

* En caso de no existir, /boot será un simple directorio en la partición /.

Ahora, al introducir el disco usb, veremos que aparece un nuevo dispositivo (sdX). En mi caso, GNU/Linux lo reconoce como sda, y posee la siguiente estructura de particiones:

Nº Dispositivo Tipo Tamaño
1 /dev/sda1 ext3 38gb (Aquí tengo una Debian Sid)
2 /dev/sda2 swap 256mb (esta en realidad no sería necesaria)

NOTA: En éste caso, trabajaremos asumiendo que hda es hd0 y sda es hd1. En tu máquina puede no ser así.

3. Proceso

Lo que tenemos que hacer en este momento es montar sda1 en algún lugar para extraer 4 archivos de él. Así, ejecutamos:

mount /dev/sda1 /mnt
cd /mnt/boot

Dentro de este directorio tendremos los archivos vmlinuz-elquesea, initrd.img-elquesea, system.map-elquesea config-elquesea.

Lo que se trata es de copiar esos cuatro archivos a la partición boot del disco interno (en nuestro caso hda1). Para no ensuciar nuestra distribución con kernels incompletos y que los "update-grub" que ejecutemos a posteriori no los tomen como kernels normales (y los añadan al menu.lst), crearemos antes una carpeta dentro de /boot. Esto es:

mkdir /boot/sid

Ahora copiamos el kernel y los archivos que lo acompañan.

cp -a /mnt/boot/vmlinuz-elquesea /boot/sid/
cp -a /mnt/boot/system.map-elquesea /boot/sid/
cp -a /mnt/boot/initrd.img-elquesea /boot/sid/
cp -a /mnt/boot/config-elquesea /boot/sid/

La ultima parte es editar el /boot/grub/menu.lst para añadir las lineas que nos permitan arrancar del pendrive.

nano /boot/grub/menu.lst

Y añadimos al final del archivo (para que el propio grub no las borre tras un update-grub) las lineas:

title Sid-USB, kernel elquesea
root (hd0,0) *
kernel /sid/vmlinuz-elquesea root=/dev/sda1 ro
initrd /sid/initrd.img-elquesea

Expliquemos en que consisten estas lineas.
La 1ª (title) nos dará el texto que vemos en grub al arrancar. Puedes poner lo que quieras, pero evita carácteres extraños.
La 2ª (root) es la línea que toma grub para buscar los kernels (en nuestro caso, todos -incluido el de Sid- están dentro de la partición hda1). Esta variable está en formato GRUB, así que ojo (si tienes duda mira el archivo /boot/grub/device.map para ver como se llama tu partición en formato grub).
La 3ª (kernel) indica que kernel se usará para arrancar y con que opciones.
La 4ª (initrd) se refiere a donde está el initrd.img (no lleva opciones).

* ¡Ojo!, hd(0,0) es nuestra partición hda1, la cual está montada como /boot en vez de como /. Ello lleva implícito que en las líneas kernel e initrd ya no se pone el /boot/ . Grub buscará el kernel y el initrd en (hd0,0)/sid/... (en otras palabras, en /boot/sid/...). Si teneis la partición (hd0,0) como / en vez de /boot, las líneas kernel e initrd deberían quedar así:

kernel /boot/sid/vmlinuz-elquesea root=/dev/sda1 ro
initrd /boot/sid/initrd.img-elquesea

Cuando hayáis dejado las líneas como queráis, cerráis nano (CONTROL+X) y reiniciáis la maquina para ver si es capaz de arrancar desde el disco usb.

Espero que os haya sido de utilidad.

4. Observaciones

- Como veréis, esto no es más que un parche que hace que parte del arranque se haga desde el disco local, se carguen los módulos usb-core y se prosiga el arranque desde el disco usb (la parte del init). Pero ¡funciona!

- He comprobado que hay determinados kernels (sobre todo cuando se trata de kernels de distintas distribuciones), que en presencia de muchos discos scsi o sata junto a dispositivos usb (como un lector de tarjetas) nombran de mil formas diferentes al disco usb (dependiendo de en que orden ven todos esos dispositivos). En mi caso, en un P3 que tiene montada una controladora scsi con 4 discos y un lector de tarjetas, con un kernel el disco USB era el 'sdf' y con otro era el 'sdh'. Os toca jugar hasta que deis con el correcto (en el propio grub podéis modificar temporalmente estas lineas pulsando e ) .

- Por último, decir que en esta guía estamos jugando con grub. Hay que saber lo que se hace en cada momento. Si no sabes para que sirve alguna de las cosas que aquí nombró, te ruego que te informes y preguntes. No me hago responsable de problemas que pudieran surgir tras seguir la guía.