29.3. Arranque con GRUB

GRUB consta de dos archivos denominados stage1 y stage2. stage1 consta de 512 bytes y se escribe en el MBR o en el sector de arranque de una partición de disco duro o de un disquete. Posteriormente, se carga stage2. Este archivo contiene el código real del programa. La única tarea del primer archivo es cargar el segundo archivo del cargador de arranque.

stage2 es capaz de acceder a los sistemas de archivos. Actualmente, son compatibles Ext2, Ext3, ReiserFS, Minix y el sistema de archivos DOS FAT utilizado por Windows. Hasta cierto punto, también son compatibles JFS, XFS y UFS y FFS utilizados por los sistemas BSD. A partir de la versión 0.95, GRUB también puede arrancar desde un CD o un DVD que contenga un sistema de archivos que cumpla la norma ISO 9660 de acuerdo con las especificaciones de “El Torito”. Incluso antes de arrancar el sistema, GRUB puede acceder a los sistemas de archivos de dispositivos de disco de BIOS (disquetes o discos duros, unidades de CD y unidades de DVD detectados por el BIOS). Por tanto, los cambios realizados en el archivo de configuración de GRUB (menu.lst) no exigen que se vuelva a instalar el gestor de arranque. Cuando se arranca el sistema, GRUB vuelve a cargar el archivo del menú con las vías válidas y los datos de partición del núcleo o del disco RAM inicial (initrd) y ubica estos archivos.

La configuración real de GRUB está basada en tres archivos que se describen a continuación:

/boot/grub/menu.lst

Este archivo contiene toda la información acerca de las particiones o de los sistemas operativos que se pueden arrancar con GRUB. Sin esta información, el control del sistema no se puede pasar al sistema operativo.

/boot/grub/device.map

Este archivo traduce los nombres de los dispositivos desde GRUB y la notación del BIOS a nombres de dispositivos Linux.

/etc/grub.conf

Este archivo contiene los parámetros y las opciones que necesita GRUB para instalar el cargador de arranque de forma correcta.

GRUB se puede controlar de varias maneras. Las entradas de arranque a partir de una configuración existente se pueden seleccionar en el menú gráfico (pantalla de inicio). La configuración se carga desde el archivo menu.lst.

En GRUB, se pueden cambiar todos los parámetros de arranque antes de arrancar. Por ejemplo, los errores cometidos al editar el archivo del menú se pueden corregir de este modo. Los comandos de arranque se pueden introducir también mediante un tipo de indicador de entrada (consulte la Sección 29.3.1.3, “Edición de entradas de menú durante el procedimiento de arranque”). GRUB ofrece la posibilidad de determinar la ubicación del núcleo y del initrd antes de arrancar. De este modo, puede arrancar incluso un sistema operativo instalado para el que no existe ninguna entrada en la configuración del cargador de arranque.

El shell de GRUB proporciona una emulación de GRUB en el sistema instalado. Se puede utilizar para instalar GRUB o para probar la configuración nueva antes de aplicarla. Consulte la Sección 29.3.4, “Shell de GRUB”.

29.3.1. Menú de arranque de GRUB

La pantalla gráfica de inicio con el menú de arranque está basada en el archivo de configuración de GRUB /boot/grub/menu.lst, que contiene toda la información acerca de las particiones o de los sistemas operativos que se pueden arrancar mediante el menú.

Siempre que se arranca el sistema, GRUB carga el archivo de menú a partir del sistema de archivos. Por este motivo, no es necesario volver a instalar GRUB después de efectuar cada cambio realizado al archivo. Utilice el cargador de arranque de YaST para modificar la configuración de GRUB, como se describe en la Sección 29.4, “Configuración del Cargador de arranque con YaST”.

El archivo de menú contiene comandos. La sintaxis es muy sencilla. Todas las líneas contienen un comando seguido de parámetros opcionales separados por espacios, como en el shell. Por razones históricas, algunos comandos permiten un = delante del primer parámetro. Los comentarios se introducen con una almohadilla (#).

Para identificar los elementos del menú en la descripción general del menú, especifique un title para cada entrada. El texto (incluidos los espacios) que sigue a la palabra title se muestra como opción seleccionable en el menú. Todos los comandos hasta el siguiente title se ejecutan cuando se selecciona este elemento del menú.

El caso más sencillo es el redireccionamiento a los cargadores de arranque de otros sistemas operativos. El comando es chainloader y el argumento suele ser el bloque de arranque de otra partición en la notación de bloque de GRUB. Por ejemplo:

chainloader (hd0,3)+1

Los nombres de los dispositivos de GRUB se explican en la Sección 29.3.1.1, “Convenciones de nomenclatura para los discos duros y las particiones”. El ejemplo anterior especifica el primer bloque de la cuarta partición del primer disco duro.

Utilice el comando kernel para especificar una imagen de núcleo. El primer argumento es la vía a la imagen del núcleo de una partición. Los demás argumentos se pasan al núcleo de la línea de comandos.

Si el núcleo no tiene controladores incorporados para acceder a la partición raíz, initrd se debe especificar con un comando de GRUB diferente cuyo único argumento es la vía al archivo initrd. Como la dirección de carga del initrd se escribe en la imagen cargada del núcleo, el comando initrd debe seguir inmediatamente al comando kernel.

El comando root simplifica la especificación del núcleo y de los archivos initrid. El único argumento de root es un dispositivo GRUB o una partición de un dispositivo GRUB. Este dispositivo se utiliza para todos los núcleos, initrd y para las demás vías de archivos para las que no se especifica ningún dispositivo de forma explícita hasta el siguiente comando root. Este comando no se utiliza en el archivo menu.lst generado durante la instalación. Simplemente facilita la edición manual.

El comando boot está implícito al final de todas las entradas de menú, de modo que no es necesario escribirlo en el archivo del menú. Sin embargo, si utiliza GRUB de forma interactiva para arrancar, debe introducir el comando boot al final. El comando no tiene argumentos. Sólo arranca la imagen cargada del núcleo o el cargador de cadena especificado.

Después de escribir todas las entradas de menú, defina una de ellas como entrada default (por defecto). De lo contrario, se utilizará la primera (entrada 0). También es posible especificar un tiempo límite (time-out) en segundos después del cual la entrada por defecto debe arrancar. Normalmente, las entradas de menú van precedidas de timeout y default. En la Sección 29.3.1.2, “Archivo de menú de ejemplo” se describe un archivo de ejemplo.

29.3.1.1. Convenciones de nomenclatura para los discos duros y las particiones

Las convenciones de nomenclatura que utiliza GRUB para los discos duros y las particiones son diferentes de las que se utilizan para los dispositivos normales de Linux. En GRUB, la numeración de las particiones empieza por cero. Por tanto, (hd0,0) es la primera partición del primer disco duro. En un equipo de escritorio estándar con un disco duro conectado como maestro principal, el nombre del dispositivo Linux correspondiente es /dev/hda1.

A las cuatro particiones primarias posibles se les asignan los números de partición de 0 a 3. Las particiones lógicas se numeran a partir de 4:

(hd0,0)   first primary partition of the first hard disk 
(hd0,1)   second primary partition 
(hd0,2)   third primary partition 
(hd0,3)   fourth primary partition (usually an extended partition) 
(hd0,4)   first logical partition 
(hd0,5)   second logical partition
    

GRUB no distingue entre dispositivos IDE, SCSI y RAID. Todos los discos duros reconocidos por el BIOS o por otros controladores se numeran de acuerdo con la secuencia de arranque predefinida en el BIOS.

Desafortunadamente, GRUB no es capaz de asignar nombres de dispositivos Linux a nombres de dispositivos BIOS de forma exacta. Genera esta asignación con la ayuda de un algoritmo y la guarda en el archivo device.map, que se puede editar en caso de ser necesario. La información relativa al archivo device.map está disponible en la Sección 29.3.2, “Archivo device.map”.

Una vía completa de GRUB consta de un nombre de dispositivo escrito entre parántesis y la vía del archivo en el sistema de archivos de la partición especificada. La vía comienza con una barra inclinada. Por ejemplo, el núcleo arrancable se podría especificar del siguiente modo en un sistema con un único disco duro IDE que contenga Linux en la primera partición:

(hd0,0)/boot/vmlinuz

29.3.1.2. Archivo de menú de ejemplo

El siguiente ejemplo muestra la estructura de un archivo de menú GRUB. La instalación de ejemplo consta de una partición de arranque Linux en /dev/hda5, una partición raíz en /dev/hda7 y una instalación de Windows en /dev/hda1.

gfxmenu (hd0,4)/message 
color white/blue black/light-gray 
default 0
timeout 8 

title linux 
   kernel (hd0,4)/vmlinuz root=/dev/hda7 vga=791 
   initrd (hd0,4)/initrd 

title windows 
   chainloader(hd0,0)+1 

title floppy
   chainloader(fd0)+1 

title failsafe 
   kernel (hd0,4)/vmlinuz.shipped root=/dev/hda7 ide=nodma \ 
   apm=off acpi=off vga=normal nosmp maxcpus=0 3 
   initrd (hd0,4)/initrd.shipped

El primer bloque define la configuración de la pantalla de inicio:

gfxmenu (hd0,4)/message

La imagen de fondo message se ubica en /dev/hda5.

color white/blue black/light-gray

Asignación de colores: blanco (primer plano), azul (fondo), negro (selección) y gris claro (fondo de la selección). La asignación de colores no tiene ningún efecto en la pantalla de inicio, sólo en el menú de GRUB personalizable al que es posible acceder saliendo de la pantalla de inicio con Esc.

default 0

La primera entrada del menú title linux es la que se arranca por defecto.

timeout 8

Si durante ocho segundos no se produce ninguna entrada por parte del usuario, GRUB arranca de forma automática la entrada por defecto. Para desactivar el arranque automático, elimine la línea timeout. Si define timeout 0, GRUB arranca la entrada por defecto de forma inmediata.

El segundo y mayor bloque enumera los distintos sistemas operativos que se pueden arrancar. Las secciones de cada sistema operativo se introducen por title.

  • La primera entrada (title linux) se encarga de arrancar SUSE Linux. El núcleo (vmlinuz) se ubica en la primera partición lógica (partición de arranque) del primer disco duro. Los parámetros del núcleo, como la partición raíz y el modo VGA, se añaden aquí. La partición raíz se especifica según la convención de nomenclatura de Linux (/dev/hda7/), porque esta información se lee por el núcleo y no tiene nada que ver con GRUB. El initrd también se ubica en la primera partición lógica del primer disco duro.

  • La segunda entrada se encarga de cargar Windows. Windows se arranca desde la primera partición del primer disco duro (hd0,0). El comando chainloader +1 hace que GRUB lea y ejecute el primer sector de la partición especificada.

  • La siguiente entrada habilita el arranque desde el disquete sin modificar la configuración del BIOS.

  • La opción de arranque failsafe arranca Linux con una selección de parámetros de núcleo que habilita Linux para arrancar incluso en sistemas que presenten problemas.

El archivo del menú se puede cambiar siempre que sea necesario. Durante el siguiente arranque, GRUB utilizará la configuración modificada. Edite el archivo de forma permanente mediante YaST o mediante el editor que prefiera. Como alternativa, realice cambios temporales de forma interactiva mediante la función de edición de GRUB. Consulte la Sección 29.3.1.3, “Edición de entradas de menú durante el procedimiento de arranque”.

29.3.1.3. Edición de entradas de menú durante el procedimiento de arranque

En el menú gráfico de arranque de GRUB, seleccione el sistema operativo por arrancar con las teclas de flechas. Si selecciona un sistema Linux, puede introducir parámetros de arranque adicionales en el indicador de inicio. Para editar entradas de menú por separado directamente, pulse Esc para salir de la pantalla de inicio y, a continuación, pulse E. Los cambios realizados de este modo sólo se aplican al procedimiento de arranque actual, no se adoptan de forma permanente.

[Important]Distribución del teclado durante el procedimiento de arranque

La distribución del teclado americano es la única disponible al arrancar.

Después de activar el modo de edición, utilice las teclas de flecha para seleccionar la entrada del menú cuya configuración se va a editar. Para que la configuración sea editable, pulse E una vez más. De este modo, edite las particiones incorrectas o las especificaciones de vías antes de que tengan un efecto negativo en el proceso de arranque. Pulse Intro para salir del modo de edición y volver al menú. A continuación, pulse B para arrancar esta entrada. Las acciones que se pueden llevar a cabo a continuación se muestran en el texto de ayuda que aparece al final.

Para introducir las opciones de arranque cambiadas de forma permanente y pasarlas al núcleo, abra menu.lst como usuario root y añada los parámetros respectivos del núcleo a la línea existente, separados por espacios:

title linux 
   kernel (hd0,0)/vmlinuz root=/dev/hda3 additional parameter
   initrd (hd0,0)/initrd

La siguiente vez que se arranca el sistema, GRUB adopta de forma automática los parámetros nuevos. Como alternativa, este cambio también se puede realizar con el módulo del cargador de arranque YaST. Añada los parámetros nuevos a la línea existente, separados por espacios.

29.3.1.4. Utilización de comodines para seleccionar el núcleo de arranque

Sobre todo al desarrollar o utilizar núcleos personalizados, debe cambiar las entradas de menu.lst o editar la línea de comandos para reflejar el núcleo actual y los nombres de archivo initrd. Para simplificar este procedimiento, utilice comodines para actualizar la lista de núcleos de GRUB de forma dinámica. Todas las imágenes del núcleo que coinciden con un patrón específico se añaden de forma automática a la lista de imágenes que se van a arrancar. Tenga en cuenta que no hay compatibilidad con esta función.

Active la opción de caracteres comodín añadiendo una entrada de menú a menu.lst. Para que sea útil, todas las imágenes de núcleo e initrd deben tener un nombre de base común y un identificador que coincida con el initrd asociado. Tenga en cuenta la siguiente configuración:

initrd-default
initrd-test
vmlinuz-default
vmlinuz-test

En este caso, debe añadir las dos imágenes de arranque a una configuración GRUB. Para obtener las entradas de menú linux-default y linux-test, se necesitaría la siguiente entrada menu.lst:

title linux-*
   wildcard (hd0,4)/vmlinuz-*
   kernel (hd0,4)/vmlinuz-* root=/dev/hda7 vga=791 
   initrd (hd0,4)/initrd-* 

En este ejemplo, GRUB busca la partición (hd0,4) para las entradas que corresponden con el comodín. Estas entradas se utilizan para generar nuevas entradas de menú de GRUB. En el ejemplo anterior, GRUB se comporta como si las siguientes entradas existieran en menu.lst:

title linux-default
   wildcard (hd0,4)/vmlinuz-default
   kernel (hd0,4)/vmlinuz-default root=/dev/hda7 vga=791 
   initrd (hd0,4)/initrd-default 
title linux-test
   wildcard (hd0,4)/vmlinuz-test
   kernel (hd0,4)/vmlinuz-test root=/dev/hda7 vga=791 
   initrd (hd0,4)/initrd-test 
    

Si los nombres de archivo no se utilizan de forma coherente con esta configuración o falta uno de los archivos ampliados, como una imagen initrd, esta configuración puede ocasionar problemas.

29.3.2. Archivo device.map

El archivo device.map asigna nombres de dispositivos de GRUB a los nombres de dispositivos Linux. En un sistema mixto que contenga discos duros IDE y SCSI, GRUB debe tratar de determinar la secuencia de arranque mediante un procedimiento especial porque GRUB no tiene acceso a la información del BIOS en la secuencia de arranque. GRUB guarda el resultado de este análisis en el archivo /boot/grub/device.map. Para un sistema en el que la secuencia de arranque del BIOS se define como IDE antes de SCSI, el archivo device.map podría aparecer de la siguiente forma:

(fd0)  /dev/fd0 
(hd0)  /dev/hda 
(hd1)  /dev/sda

Como el orden de IDE, SCSI y los demás discos duros dependen de varios factores y Linux no es capaz de identificar la asignación, la secuencia del archivo device.map se puede definir de forma manual. Si encuentra problemas al arrancar, compruebe si la secuencia de este archivo corresponde a la secuencia del BIOS y utiliza el shell de GRUB, descrito en la Sección 29.3.4, “Shell de GRUB”, para modificarlo de forma temporal cuando sea necesario. Una vez que el sistema Linux ha arrancado, el archivo device.map se puede editar de forma permanente con el módulo del cargador de arranque YaST o con el editor que desee.

Después de cambiar de forma manual device.map, ejecute el siguiente comando para volver a instalar GRUB. Este comando hace que el archivo device.map se vuelva a cargar y que los comandos escuchados en grub.conf se ejecuten:

 
grub --batch < /etc/grub.conf

29.3.3. Archivo /etc/grub.conf

El tercer archivo importante de configuración de GRUB aparte de menu.lst y device.map es /etc/grub.conf. Este archivo contiene los parámetros y las opciones que necesita el comando grub para instalar el cargador de arranque de forma correcta:

 
root (hd0,4) 
   install /grub/stage1 d (hd0) /grub/stage2 0x8000 (hd0,4)/grub/menu.lst 
   quit

Significado de las entradas individuales:

root (hd0,4)

Este comando le dice a GRUB que aplique los siguientes comandos a la primera partición lógica del primer disco duro (la ubicación de los archivos de arranque).

parámetro install

El comando grub debe ejecutarse con el parámetro install. stage1 del cargador de arranque debe instalarse en el MBR del primer disco duro (/grub/stage1 d (hd0)). stage2 debe cargarse en la dirección de memoria 0x8000 (/grub/stage2 0x8000). La última entrada ((hd0,4)/grub/menu.lst) le dice a GRUB dónde buscar el archivo del menú.

29.3.4. Shell de GRUB

GRUB existe en dos versiones: como cargador de arranque y como programa normal de Linux en /usr/sbin/grub. Este programa se denomina shell de GRUB. La funcionalidad para instalar GRUB como cargador de arranque en un disco duro o en un disquete está integrada en GRUB con la forma de los comandos install y setup. Ésta está disponible en el shell de GRUB cuando se carga Linux.

Sin embargo, los comandos setup e install también están disponibles durante el procedimiento de arranque antes de iniciar Linux. Esto facilita la reparación de un sistema defectuoso que ya no se puede arrancar porque el archivo de configuración defectuoso del cargador de arranque se puede eludir introduciendo los parámetros de forma manual. La introducción de los parámetros de forma manual durante el procedimiento de arranque también es útil para probar la configuración nueva sin dañar el sistema original. Sólo tiene que introducir el archivo de configuración experimental con una sintaxis similar a la de menu.lst. A continuación, pruebe la funcionalidad de esta entrada sin cambiar el archivo de configuración existente. Por ejemplo, para probar el nuevo núcleo, introduzca el comando kernel y la vía del nuevo núcleo. Si el procedimiento de arranque falla, puede continuar utilizando el archivo intacto menu.lst la siguiente vez que arranque. De forma similar, la interfaz de la línea de comandos también se puede utilizar para arrancar un sistema en lugar de un archivo menu.lst introduciendo los parámetros corregidos. En el sistema instalado, los parámetros correctos se pueden introducir en menu.lst para que el sistema se pueda arrancar siempre.

La asignación de dispositivos GRUB a los nombres de dispositivos Linux sólo es relevante cuando se ejecuta el shell de GRUB como programa de Linux (introduciendo grub, como se describe en la Sección 29.3.2, “Archivo device.map”). Con este propósito, el programa lee el archivo device.map. Para obtener más información, consulte el Sección 29.3.2, “Archivo device.map”.

29.3.5. Configuración de una contraseña de arranque

Incluso antes de que se arranque el sistema operativo, GRUB habilita el acceso a los sistemas de archivos. Los usuarios sin permisos root pueden acceder a los archivos del sistema Linux a los que no tienen acceso una vez arrancado el sistema. Para bloquear este tipo de acceso o impedir que los usuarios arranquen ciertos sistemas operativos, defina una contraseña de arranque.

[Important]Contraseña de arranque y pantalla de inicio

Si utiliza una contraseña de inicio para GRUB, no se muestra la pantalla de inicio habitual.

Como usuario root, realice lo siguiente para definir una contraseña de arranque:

  1. En el indicador de root, introduzca grub.

  2. Cifre la contraseña en la shell del GRUB:

    grub> md5crypt 
    Password: **** 
    Encrypted: $1$lS2dv/$JOYcdxIn7CJk9xShzzJVw/
  3. Pegue la cadena cifrada en la sección global del archivo menu.lst:

    gfxmenu (hd0,4)/message
    color white/blue black/light-gray
    default 0
    timeout 8
    password --md5 $1$lS2dv/$JOYcdxIn7CJk9xShzzJVw/

    Ahora los comandos GRUB sólo se pueden ejecutar en el indicador de inicio después de pulsar P e introducir la contraseña. Sin embargo, los usuarios aún pueden arrancar los sistemas operativos desde el menú de arranque.

  4. Para evitar que uno o varios sistemas operativos se arranquen desde el menú de arranque, añada la entrada lock a todas las secciones de menu.lst que no deberían poder arrancarse sin introducir una contraseña. Por ejemplo:

    title linux 
    kernel (hd0,4)/vmlinuz root=/dev/hda7 vga=791 
    initrd (hd0,4)/initrd 
    lock

    Después de volver a arrancar el sistema y seleccionar la entrada Linux en el menú de arranque, aparece el siguiente mensaje de error:

    Error 32: Debe autenticarse

    Pulse Intro para entrar en el menú. A continuación, pulse P para obtener un indicador de contraseña. Después de introducir la contraseña y pulsar Intro, debería arrancarse el sistema operativo seleccionado (en este caso, Linux).