Nota: este artículo fué publicado en el número 34 (septiembre de 2001) de la revista Mundo Linux, una publicación de Revistas Profesionales S.L.
Vamos a ver una ínfima parte de la funcionalidad de GRUB, "the Grand Unified Bootloader", o lo que es lo mismo, un LILO de ciencia ficción...
Durante muchos años hemos utilizado LILO para arrancar nuestro sistema operativo favorito. El LILO es pequeño, simple, y funciona. Pero no es perfecto. El GRUB es más grande, más complejo, y nos da una flexibilidad hasta ahora desconocida a la hora de arrancar nuestro sistema. En realidad GRUB es como un pequeño sistema operativo independiente diseñado específicamente para arrancar otros sistemas. Espero que después de leer este artículo mucha gente se decida a dar el paso, a abandonar el viejo y querido LILO para pasar a algo mucho más potente y avanzado.
Aprecio el LILO en lo que vale y después de tantos años le he tomado cariño así que no voy a revisar todas sus limitaciones (todos las conocemos porque las hemos sufrido). En lugar de eso, intentaré centrarme en mostrar algunas ventajas importantes del GRUB para que cada uno saque sus propias conclusiones.
¿Qué? ¿Os gusta? Pues leer lo que puede hacer GRUB no es nada comparado con la experiencia de usarlo realmente, así que manos a la obra ;-)
Como podéis imaginaros, no hay forma de meter el código para hacer todas esas cosas en un sector de 512 bytes... así que el GRUB se carga en sucesivas "etapas" (stages).
Puede parecer que GRUB es muy grande comparado con LILO (y efectivamente lo es), pero también hay que decir que GRUB hace muchas más cosas de las que voy a contar yo aquí, algunas realmente impresionantes: permite tener varias versiones de Windows repartidas por la máquina en varios discos (no necesariamente el primero) gracias a la reordenación de unidades y la ocultación de particiones, permite montar sistemas sin disco que arranquen desde la red usando BOOTP o DHCP, etc.
Diría que obtener GRUB es tan fácil como hacer 'apt-get install grub', pero como no todo el mundo usa Debian GNU/Linux en general recomendaré que cada cual se busque un paquete adecuado para su distribución. Seguro que en rpmfind.net están los RPMs actualizados, etc.
También podéis ir directamente a http://www.gnu.org/software/grub/ y ver qué mirror os va mejor para bajaros GRUB. El servidor FTP "principal" para hacer eso está en ftp://alpha.gnu.org/gnu/grub/, y tiene disponibles los últimos fuentes en forma de paquete .tgz, así como los binarios en forma de imagen de disquete arrancable.
El código fuente en forma de paquete .tgz está listo para el típico './configure; make; make install'. La imagen de disquete arrancable resulta muy útil, simple, y recomendable para las primeras pruebas puesto que no requiere instalar nada en el disco duro y permite comprobar la enorme potencia de GRUB sin riesgo alguno.
Una vez tengais GRUB en vuestro sistema, podéis dejarlo ahí como decoración, podéis instalarlo en un disquete para experimentar, o podéis instalarlo en el disco duro para usarlo como bootloader (que es lo ideal).
Antes de empezar a jugar con GRUB conviene entender los criterios que sigue para nombrar los discos y las particiones.
GRUB intenta ser muy neutral en este aspecto, así que no usa la nomenclatura de Linux, ni la de FreeBSD, ni la de ningún otro sistema que yo conozca. Por suerte la nomenclatura es muy simple: la primera unidad de disquete se llama (fd0), la primera unidad de disco duro se llama (hd0), la primera partición primária del primer disco duro se llama (hd0,0) y así sucesivamente. Es decir, todo se numera con enteros, empezando por el cero.
Esto se hace independientemente del tipo de discos, de manera que se numeran siempre correlativamente todas las unidades del sistema tanto si son IDE como si son SCSI. Esto no es un problema entre otras cosas porque el shell de GRUB nos mostrará todos los discos y particiones disponibles si pulsamos la tecla TAB en caso de duda, y nos dará información suficiente para identificarlos.
Si queremos referirnos a un fichero concreto dentro de una partición concreta, podemos hacerlo. Por ejemplo, supongamos que queremos referirnos al fichero /boot/vmlinuz que se encuentra en la primera partición extendida del primer disco. Simplemente, especificamos (hd0,4)/boot/vmlinuz.
Para probar GRUB lo mejor es empezar con un disquete, así que nos bajaremos la última versión disponible de algún mirror de software GNU, en forma de imagen de floppy. El fichero que nos interesa es el que tiene la extensión .ext2fs, algo así como grub-0.90-i386-pc.ext2fs (la última versión disponible en el momento de escribir estas lineas).
Una vez obtenida esta imagen, la grabaremos en un disco (previamente formateado y sin datos importantes) con el comando 'dd if=grub-0.90-i386-pc.ext2fs of=/dev/fd0' (o con una herramienta como rawrite si -tristemente- lo hacemos desde Windows). Dependiendo de la distribución, los usuarios podrán ejecutar este comando libremente, o bien deberán pertenecer a algún grupo con privilegios especiales para acceder a las unidades de disquete (grupo floppy, o similar). El usuario root normalmente podrá hacerlo sin problemas.
Si tenemos correctamente configurada la BIOS para que arranque en primer lugar desde la disquetera (normalmente A:) podemos dejar el disco ahí después de grabarlo, y reiniciar (con 'reboot', 'shutdown -r now', o pulsando Alt+Ctrl+Supr).
Si todo va bien, veremos como se cargan sucesivamente las distintas etapas de GRUB y llegaremos al menú de ejemplo que han preparado para nosotros los desarrolladores de GRUB. Probablemente ninguna de las opciones de ejemplo resultará útil en nuestro sistema, pero más adelante pueden servir como guia a la hora de crear nuestra propia configuración.
De momento nos interesa jugar con la linea de comandos, ya que las distintas opciones del menú no son más que agrupaciones de esos comandos (una especie de "macros") y conviene familiarizarse con ellos. Para pasar al modo comandos desde el menú semigráfico de GRUB seguiremos las instrucciones en pantalla y por tanto pulsaremos 'c'. Para trabajar con un ejemplo concreto, usaremos el sistema descrito en el recuadro.
| El sistema de ejemplo tiene un disco duro de 20GB. Ahora mismo tiene instalado Windows 2000 en la primera partición primária (/dev/hda1 para Linux, (hd0,0) para GRUB) con el sistema de ficheros NTFS, y Debian GNU/Linux en la primera partición extendida (/dev/hda5 para Linux, (hd0,4) para GRUB) con el sistema de ficheros ReiserFS. Las demás particiones que he creado para organizar mis datos, particiones de swap, etc., no tienen ningún interés aquí puesto que no son arrancables. |
Evidentemente en la vida cotidiana no resulta práctico usar GRUB de la manera que hemos visto. En el dia a dia es poco menos que extravagante arrancar desde disquete, y es bastante incómodo tener que teclear repetidamente unos cuantos comandos cada vez que queremos arrancar nuestro sistema.
Por este motivo, podemos instalar GRUB en nuestro disco duro y además podemos configurar un menú de arranque con varias opciones agrupando las secuencias de comandos más comunes. Sin embargo esto no supondrá renunciar a la posibilidad de usar en cualquier momento la linea de comandos, y además siempre podremos editar las opciones del menú lo que resulta muy útil en algunos casos.
La instalación de GRUB en el disco duro es muy simple. Lo más dificil es decidir en qué partición pondremos los ficheros que necesita GRUB (sus diferentes etapas, más ficheros de configuración). Conviene que sea una partición "estable", es decir, no es recomendable usar la partición de pruebas donde metemos cada semana un sistema operativo diferente. Los más originales pueden decidir que van a usar la partición de su Windows Me con FAT32, pero yo prefiero usar la partición principal de Linux que en este caso (según nuestro ejemplo) es la primera partición extendida, con ReiserFS, o (hd0,4) en la notación de GRUB.
Debemos copiar los ficheros que necesita GRUB (stage1, stage2, reiserfs_stage1_5, etc.) en el directório /boot/grub/ de la partición que hayamos elegido. Estos ficheros suelen encontrarse originalmente en /usr/local/share/grub/i386-pc/ aunque esto puede cambiar según la distribución. En cualquier caso con un locate los encontraremos fácilmente.
Entonces procederemos a la instalación de GRUB en el MBR. Primero debemos acceder al modo de comandos de GRUB, bién arrancando con nuestro disquete de pruebas, bién ejecutando el comando grub desde Linux. Después le indicaremos en qué partición puede encontrar el /boot/grub/ con los ficheros necesários que acabamos de copiar, con el comando 'root (hd0,4)' siguiendo con el ejemplo. Finalmente ejecutaremos el comando 'setup (hd0)' si lo que queremos es que se instale GRUB en el MBR de nuestro primer disco duro. En realidad el comando setup es una especie de macro que automatiza el uso de los comandos embed e install que son los que se ejecutarán realmente. Con esto tendremos GRUB instalado como bootloader principal en nuestro sistema.
También puede instalarse GRUB en el primer sector de una partición, por ejemplo con 'setup (hd0,4)', e incluso podemos usar LILO para cargar GRUB o viceversa, aunque ambos se encuentren en los lugares más inverosímiles de nuestro disco duro. Pero todo ésto es demasiado para una primera toma de contacto que es lo que intenta ser este artículo.
Una vez instalado GRUB en nuestro disco duro, podemos olvidarnos del disquete (aunque repito que siempre conviene tenerlo a mano). Ahora podemos proceder a la creación y personalización del menú, que nos permitirá arrancar nuestro sistema sin teclear comandos cada vez que lo hagamos.
Cuando se carga, GRUB siempre busca el fichero menu.lst (entre otros ficheros de configuración que no detallaremos aquí) en el directório /boot/grub/ que está utilizando. A diferéncia de LILO, GRUB reconoce e interpreta correctamente diversos sistemas de ficheros, y entre otras cosas eso implica que no debe reinstalarse cada vez que cambiamos la configuración: lo instalamos la primera vez, y luego simplemente editamos los ficheros de configuración correspondientes. Los cambios serán efectivos en el próximo arranque, momento en el que GRUB los leerá sin problemas.
El formato del fichero /boot/grub/menu.lst es muy simple, y ligeramente parecido al del viejo /etc/lilo.conf. Se trata de un fichero de configuración típico de UNIX, donde se ignora (i.e. se considera comentario) todo aquello que esté entre un carácter # y un final de linea, o el final de fichero.
En el menu.lst podemos crear una especie de macros agrupando comandos de GRUB. Al arrancar se nos mostrará un menú donde podremos seleccionar una de las macros para ejecutarla inmediatamente.
En el fichero de configuración simplemente usamos la etiqueta title para dar un nombre a la opción del menú, y a continuación introducimos la secuencia de comandos asociados a esa opción. Por supuesto los comandos pueden ser cualesquiera de los casi 50 que nos ofrece el shell de GRUB, incluso podemos tener opciones que sirvan para cambiar los colores, para instalar GRUB en el disco duro, etc., pero lo más habitual es que las opciones del menú de arranque agrupen secuencias cortas de comandos que sirvan para iniciar alguno de los sistemas operativos que tenemos instalados en nuestra máquina.
Aparte de las diferentes opciones del menú, podemos especificar al principio parámetros como timeout, default y fallback. El significado de estas opciones (en inglés) es bastante obvio, pero veamos un ejemplo simple de menu.lst antes de continuar:
timeout 10 default 0 fallback 1 title GNU/Linux root (hd0,4) kernel /vmlinuz root=/dev/hda5 title GNU/Linux (old) root (hd0,4) kernel /vmlinuz.old root=/dev/hda5 title Windows 2000 rootnoverify (hd0,0) makeactive chainloader +1
En este caso el 'timeout 10' significa que se seleccionará automáticamente la opción por defecto tras 10 segundos de inactividad. Por supuesto, 'default 0' significa que la opción por defecto es la primera (recordemos que GRUB siempre empieza a contar por el cero). Luego tenemos 'fallback 1' que significa que si falla la primera opción durante el arranque automático, lo intente con la segunda.
A continuación, tenemos tres opciones de arranque diferentes. La primera, titulada GNU/Linux, carga (hd0,4)/vmlinuz. La segunda, titulada GNU/Linux (old), carga (hd0,4)/vmlinuz.old (es decir, arranca con el kernel anterior, muy útil cuando falla el nuevo). La tercera, titulada Windows 2000, arranca Windows. Los comandos utilizados son los que hemos visto anteriormente así que no los detallaremos de nuevo aquí.
Hay que notar que en el menu.lst se puede omitir el comando boot, que se sobreentiende cuando el usuario selecciona una opción del menú, cosa que no pasa cuando el usuario introduce manualmente los comandos en el shell de GRUB.
Cuando hayamos creado un /boot/grub/menu.lst parecido a este (por supuesto adaptado a la configuración de nuestro sistema particular) sencillamente podremos reiniciar y GRUB nos mostrará un menú semigráfico donde podremos seleccionar la opción que deseemos.
Podemos editar cada una de las opciones del menú si la resaltamos y pulsamos la tecla 'e', de manera que si nos equivocamos editando el fichero de configuración no debe cundir el pánico: podemos corregir nuestro error al momento y arrancar tranquilamente nuestro sistema para corregir definitivamente el fichero de configuración, sin más, sabiendo que los cambios que hagamos serán efectivos en el próximo arranque.
Además, desde el menú podemos acceder a la poderosa linea de comandos con ayuda on-line (comando help) y sugerencias contextuales (tecla TAB), simplemente pulsando la tecla 'c' desde el menú principal.
Es evidente que con los casi 50 comandos que tenemos disponibles en el shell de GRUB pueden hacerse maravillas, cosas mucho más útiles y complejas que las que hemos visto aquí.
De todas formas con este pequeño artículo espero haber despertado vuestra curiosidad y vuestro interés por GRUB, el indiscutible substituto de LILO. El viejo LILO ha funcionado perfectamente durante años, pero los tiempos cambian y en mi opinión ha llegado el momento de jubilarlo.
Debeis pasaros todos a GRUB cuanto antes, el "LILO on steroids" como dicen algunos...
Cuidado que algunas son grandes, a 1400x1050 ;-)