miércoles, marzo 05, 2008

Migrando a GRUB 2

Otavio Salvador propuso en la lista de Debian-Release pasar a utilizar GRUB2 en la próxima release (Debian Lenny) y comenzó un interesante thread al respecto.

Para el que no lo conoce, GRUB es el mnemónico de GRand Unified Bootloader. Un boot loader, o cargador de arranque, es el primer programa que se ejecuta cuando la computadora arranca (salvando la secuencia de arranque en ROM). El boot loader es responsable de cargar y transferir el control al núcleo, o kernel, del sistema operativo. El kernel, luego, incializa el resto del sistema operativo.

GRUB es, para aquellos que tenemos Linux, el "menú que aparece en la pantalla" y que nos permite seleccionar el sistema operativo, o la versión de kernel, que vamos a iniciar. Otro gestor conocido y que muchos hemos utilizado alguna vez, es LILO.

La versión 1 de GRUB, ahora denominada GRUB Legacy, es la que utiliza la mayoría de las distribuciones de GNU/Linux actuales y ya no está siendo desarrollada activamente por la comunidad; no se están añadiendo nuevas funcionalidades y sólo se están aplicando los parches necesarios para mantenerlo al día mientras la versión 2 se estabiliza. De ahí la solicitud de Otavio en la lista de mails.

Los objetivos de esta nueva versión son, entre otros:
  • Permitir scripting, condicionales, bucles, variables y funciones.
  • Interfaz gráfica.
  • Extensibilidad mediante carga dinámica de módulos.
  • Portabilidad a distintas arquitecturas.
  • Internacionalización. Soporte para caracteres fuera del conjunto ascii, mensajes localizados, etc.
  • Mejor administración de memoria.
  • Marco de trabajo modular, jerárquico y orientado a objetos para sistemas de archivo, archivos, dispositivos, unidades, terminales, comandos, tablas de partición y cargadores de SO.
  • Instalación multiplataforma.
  • Modo de rescate para casos en los cuales es imposible iniciar.
  • Corregir errores de diseño de la versión anterior de GRUB, que no pueden resolverse debido a compatibilidad inversa, por ejemplo el numerado de las particiones (he he he ...).
Hay que advertir que, sin embargo, algunos sistemas de archivo todavía no están soportados (faltan reiser3 y reiser4, por ejemplo). Parte del estado de la transición en Debian está documentado en las páginas Grub2 y GrubTransition de la Debian wiki.

Con el objeto de comenzar a testear esta nueva versión, decidí instalarla en una instalación de Debian Lenny local. Para ello, en primer lugar hay que descargar e instalar el metapaquete grub2, que se encargará de efectuar la migración del archivo de configuración anterior al nuevo formato e instalar el nuevo cargador de arranque en modo chainloading, manteniendo la versión de GRUB anterior para permitir la recuperación en caso de una falla.

# aptitude install grub2

El paso siguiente, por cierto bastante evidente, es reiniciar el equipo para verificar el funcionamiento del nuevo cargador de arranque. Verán en la pantalla de selección que la primer opcion de GRUB es iniciar el nuevo cargador de arranque ("Chainload into GRUB 2").

Al ingresar en GRUB2 notarán el cambio en el despliegue de la imagen de fondo (debian-blueish-wallpaper en mi caso, y muy agradable por cierto) y el menú desde el cual podrán seleccionar el sistema operativo a iniciar.

Si ocurrió alguna falla durante el inicio, pueden volver a iniciar cualquiera de los sistemas operativos instalados mediante el primer menú de GRUB (Legacy).

Si todo salió bien, ya pueden sobreescribir el cargador de arranque antiguo con el nuevo. Para ello hay que ejecutar como root:

# upgrade-from-grub-legacy

La configuración en la versión Legacy se almacenaba generalmente en el archivo menu.lst dentro del directorio /boot/grub (o donde tengan instalado el cargador). En GRUB2, la configuración se almacena en el archivo grub.cfg, que es generado automáticamente en Debian por update-grub siguiendo las plantillas almacenadas en /etc/grub.d y el archivo /etc/default/grub

Actualización (29/04/2008): Ya no es necesario incorporar las entradas de los sistemas operativos a mano en la configuración del gestor de arranque. La versión de grub en Debian Lenny puede incorporar automáticamente al menú de arranque los sistemas operativos existentes en el equipo gracias a la detección realizada por el paquete os-prober. De todas formas, dejo tal cual el procedimiento que sigue pues puede servir ante un fallo.

Para añadir una nueva entrada de sistema operativo en el menú hay que crear un nuevo archivo en /etc/grub.d. Por ejemplo, para añadir una entrada de arranque a Windows XP podemos seguir los pasos indicados en este thread y crear un archivo 20_windows_xp en /etc/grub.d con las siguientes líneas

#! /bin/sh -e

cat << EOF
menuentry "Microsoft Windows XP Professional" {
set root=(hd0,1)
chainloader +1
}
EOF

Donde (hd0,1) será lo que tenían definido en menu.lst sólo que con un número más. Vale decir, si era (hd0,0) ahora será (hd0,1). Este cambio viene de larga data y a petición de varios pues, como recordarán, las particiones en GRUB Legacy se numeraban desde el 0, con lo cual siempre eran un número menor a las indicadas por fdisk en Linux, y eso nos ha traído dolores de cabeza a más de uno.

Finalmente queda dar los permisos de ejecución al script y volver a generar la configuración en base a estas plantillas con:

# chmod +x /etc/grub.d/20_windows_xp
# update-grub

Y reiniciar para probar nuevamente...

Si la imagen de fondo de GRUB2 no les agrada, pueden obtener más imágenes instalando el paquete grub2-splashimages o crear una utilizando GIMP o su editor favorito.

Bien eso es todo. Mucha suerte y en el caso de que no tengan éxito, siempre tengan a mano un CD o DVD de Debian de la arquitectura que están utilizando, para iniciar en modo rescate, jeje...

Saludos!

10 comentarios:

Alvaro dijo...

Gracias por el artículo, funciona perfectamente. ¿Sabes si las futuras actualizaciones de Grub borrarán la entrada del Windows como ocurría con el grub anterior? Por si acaso voy a guardar una copia de 20_windows_xp.

Mauro Meloni dijo...

Hasta donde yo sé (AFAIK), por lo menos en Debian no se borran. El archivo grub.cfg se genera automáticamente en base a las plantillas preexistentes. De cualquier manera nunca viene mal tener un backup, je. Saludos!

Karzac dijo...

Yo para windows tuve que cambiar hd(0,0) por hd(0,1) porque parece que grub2 hace la deteccion de las particiones a la antigua, supongo que se solucionará en las futuras versiones. Me dio la impresion al ver la configuracion en /boot/grub/grub.cfg que se podian cargar temas estilo gfxgrub, haber si alguien lo confirma :)

lanek dijo...

gracias por tus explicaciones, va de lujo. Eso sí, yo he tenido un problema con los directorios que he solucionado haciendo lo siguiente cada vez que kiero editar la configuración del grub (me he hecho un script vaya):


sudo gedit /etc/default/grub
sudo mkdir /usr/local/etc/default
sudo cp /etc/default/grub /usr/local/etc/default/grub
sudo cp /etc/grub.d/* /usr/local/etc/grub.d/
sudo update-grub


también si os aparece algo como grub-probe: error: Cannot get the real path of `/dev/sdb' (en ese caso) deberiais comentar la linea que corresponda a sdb en el archivo /boot/grub/device.map

espero haberme explicao medianamente bien por si a alguien le sucediese lo mismo...

saludos!

Mauro Meloni dijo...

Gracias por el aporte, lanek. Seguramente va a servir a más de uno con el mismo problema.
Saludos!

Alvaro dijo...

He tenido un problemilla con este tema. Estoy usando Ubuntu Intrepid.
Me instala los paquetes, después me sale una ventana diciendo que recomiendo hacer algo de chainload para convervar el menu.lst hasta que vea que funciona grub2 y le digo que sí. Me recupera lo del chainload una línea vacía y le doy a Aceptar. Reinicio y me sale el nuevo menu.
Con Chainload para grub, los kernels anteriores que tenía para grub y el arranque de Xp.

No puedo entrar con ninguno de ellos, excepto a Xp.

He entrado por liveCd y visto el menu.lst, el arranque para grub2 es con /boot/grub/core.img, que no hace nada al igual que los arranques para los kernels que tenía en la antigua versión de menu.lst.

He recuperado la copia del menu.lst y puedo entrar otra vez perfectamente, pero estoy sin grub2.

Alguna ayuda?

javier dijo...

Hola, vagando en Internet me encontré con tu blog, que por cierto esta muy bueno, con un muy buen contenido, desde ya gracias y espero que le sigan poniendo tanta ganas como hasta ahora.

Su amigo de http://lomascodiciadodelplaneta.blogspot.com

Anónimo dijo...

una pregunta, yo tengo problemas con los pci, ya que tengo que colocar en el menu.lst el comentario "pic=acpi", en la linea "...ro quiet" Para el caso del grub2 donde agrego esa instruccion?

David_erh dijo...

Hola,espero me puedas ayudar,tengo en la misma PC Ubuntu 9.10 y Fedora Core 12 pero el grub2.0 de Ubuntu no me reconoce la instalación de Fedora, como podría hacer para agregar Fedora al menu boot como lo hiciste tu con Windows XP.

Gracias

alfajor dijo...

Muchas gracias, me fuinciono bien, es lo que estaba buscando :D