9.2. Arranque con GRUB

GRUB (Grand Unified Boot Loader, Cargador de arranque unificado global) está dividido en dos fases: stage1 y stage2. stage1 comprende 512 bytes y su única función es cargar la segunda etapa en el cargador de arranque. Posteriormente, se carga stage2. Esta fase contiene la parte principal del cargador de arranque.

En algunas configuraciones, se puede utilizar una etapa intermedia, stage 1.5, que se encarga de localizar y cargar stage 2 desde un sistema de archivos adecuado. Si es posible, se elige este método por defecto durante la instalación o durante la configuración inicial de GRUB con YaST.

stage2 puede acceder a numerosos 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, la línea de comandos de GRUB indica al usuario el modo de proceder (consulte Sección 9.2.1.3, “Edición de entradas de menú durante el procedimiento de arranque” para obtener información detallada).

/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 comandos, los parámetros y las opciones que necesita la shell de 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 de forma interactiva mediante un tipo de indicador de entrada (consulte Sección 9.2.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.

GRUB existe en dos versiones: como cargador de arranque y como programa normal de Linux en /usr/sbin/grub. Este programa, denominado shell de GRUB, proporciona una simulación de GRUB en el sistema instalado y se puede utilizar para instalar GRUB o probar nuevas configuraciones antes de aplicarlas. La función que permite instalar GRUB como cargador de arranque en un disco duro o en un disquete está integrada en GRUB a través de los comandos install y setup. Ésta está disponible en la shell de GRUB cuando se carga Linux.

9.2.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 9.3, “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 la 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 una cadena 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 Sección 9.2.1.1, “Convenciones de nomenclatura para los discos duros y las particiones”. Este ejemplo 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 a la línea de comandos del núcleo.

Si el núcleo no tiene controladores incorporados para acceder a la partición raíz, o se utiliza un sistema Linux reciente con funciones de HotPlug avanzadas, 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 o una partición. 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.

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 Sección 9.2.1.2, “Archivo de menú de ejemplo” se describe un archivo de ejemplo.

9.2.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. Esto significa que (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
    

Dado que depende de los dispositivos del BIOS, GRUB no distingue entre dispositivos IDE, SATA, SCSI y dispositivos de hardware 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 a menudo no es capaz de asignar nombres de dispositivos Linux a nombres de dispositivos BIOS de forma exacta. Esta asignación se genera con la ayuda de un algoritmo y se guarda en el archivo device.map, que se puede editar si es preciso. La información relativa al archivo device.map está disponible en la Sección 9.2.2, “Archivo device.map”.

Una vía completa de GRUB consiste en 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

9.2.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 Sección 9.2.1.3, “Edición de entradas de menú durante el procedimiento de arranque”.

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

En el menú de arranque gráfico de GRUB, seleccione el sistema operativo para el arranque con las teclas de flecha. 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 acceder al menú de texto de GRUB y, a continuación, pulse E. Los cambios realizados de este modo sólo se aplican al procedimiento de arranque en curso, 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.

La edición de entradas del menú facilita la reparación de un sistema defectuoso que no se puede arrancar, dado que 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.

Después de activar el modo de edición, utilice las teclas de flecha para seleccionar la entrada del menú cuya configuración quiera 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.

9.2.2. Archivo device.map

El archivo device.map asigna nombres de dispositivos de GRUB y del BIOS 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, ya que GRUB no tiene acceso a la información del BIOS de 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 utilice el indicador de GRUB para modificarlo de forma temporal si es preciso. 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.

[Important]Discos SATA

Según el controlador, los discos SATA se reconocen como dispositivos IDE (/dev/hdx) o SCSI (/dev/sdx).

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

9.2.3. Archivo /etc/grub.conf

El tercer archivo de configuración de GRUB más importante, después de menu.lst y device.map, es /etc/grub.conf. Este archivo contiene los comandos, los parámetros y las opciones que necesita la shell de GRUB para instalar el cargador de arranque de forma correcta:

root (hd0,4)
   install /grub/stage1 (hd0,3) /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 contenedor de la partición extendida (/grub/stage1 d (hd0,3)). 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ú.

9.2.4. 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).