8.3. Arrancar con GRUB

GRUB (Grand Unified Bootloader) está compuesto por dos etapas: la primera (stage1) es de 512 bytes y está guardada en el MBR o en el bloque de arranque de una partición de disco o disquete; la segunda etapa (stage2), más grande, se carga a continuación y contiene el código del programa. En GRUB, la única función de la primera etapa es cargar la segunda etapa del cargador de arranque.

stage2 puede acceder directamente al sistema de archivos. Actualmente se soportan Ext2, Ext3, ReiserFS, Minix y el sistema DOS FAT utilizado por Windows. Con algunas limitaciones, también se soporta JFS XFS así como UFS/FFS, el sistema de archivos de los sistemas BSD. Desde la versión 0.95, GRUB es capaz de arrancar desde un CD o DVD con un sistema de archivos estándar conforme a ISO 9660 de acuerdo a la especificación “El Torito”. GRUB puede acceder a los sistemas de archivos en los dispositivos de disco BIOS soportados (disquetes o unidades de CD, DVD o discos duros detectados por la BIOS) antes de arrancar, por lo que los cambios en el archivo de configuración de GRUB (menu.lst) no obligan a reinstalar el gestor de arranque. Al arrancar, GRUB vuelve a cargar los archivos de menú incluyendo las rutas y particiones actuales hacia el kernel o el ramdisk de inicio (initrd) y encuentra estos archivos automáticamente.

Para la configuración de GRUB son necesarios tres archivos que se describen a continuación:

/boot/grub/menu.lst

Este archivo contiene la información relativa a las particiones y a los sistemas operativos que pueden arrancarse con GRUB. Sin estos datos no sería posible ceder el control del sistema al sistema operativo.

/boot/grub/device.map

Este archivo “traduce” los nombres de dispositivo de la notación GRUB/BIOS a la nomenclatura Linux.

/etc/grub.conf

Este archivo contiene los parámetros y opciones requeridos por la shell de GRUB para instalar el cargador de arranque correctamente.

GRUB puede manejarse de distintas formas. Las entradas de arranque de la configuración existente se seleccionan a través de un menú gráfico (splash screen). La configuración se carga del archivo menu.lst.

GRUB puede modificar todos los parámetros de arranque antes del proceso de inicio, lo que permite resolver un error cometido al editar el archivo del menú. Asimismo, los comandos de arranque pueden introducirse de forma interactiva por medio de una especie de prompt (vea la Sección 8.3.1.3, “Modificar las entradas de menú durante el proceso de arranque”). GRUB le permite averiguar la situación del kernel y de initrd antes de arrancar, posibilitando el arranque de un sistema operativo instalado para el que todavía no existe ninguna entrada en la configuración del cargador de arranque.

Finalmente, la shell de GRUB proporciona una emulación de GRUB en el sistema instalado. Puede utilizar esta shell para instalar GRUB o para probar una nueva configuración antes de aplicarla (véase también la Sección 8.3.4, “La shell de GRUB”).

8.3.1. El menú de arranque de GRUB

Tras la pantalla de bienvenida con el menú de arranque se encuentra el archivo de configuración de GRUB, /boot/grub/menu.lst. Este archivo contiene toda la información sobre todas las particiones o sistemas operativos que pueden ser arrancados con ayuda del menú.

En cada arranque del sistema, GRUB vuelve a leer el archivo de menú del sistema de archivos. Por lo tanto, no hay ninguna necesidad de actualizar GRUB después de modificar el archivo. Si desea realizar cambios en la configuración de GRUB, utilice el módulo del cargador de arranque de YaST (Sección 8.4, “Configuración del cargador de arranque con YaST”).

Este archivo de menú contiene comandos de sintaxis muy sencilla. Cada línea incluye un comando seguido de los parámetros opcionales separados por espacios en blanco, al igual que en la shell. Por razones históricas, algunos comandos tienen un signo = como primer parámetro. Las líneas de comentarios comienzan con #.

Para reconocer las entradas de menú en la vista del menú, debe dar un nombre o title a cada entrada. El texto que aparece tras la palabra clave title será mostrado (incluyendo espacios en blanco) en el menú como opción para seleccionar. Después de seleccionar una entrada determinada del menú, se ejecutarán todos los comandos que se encuentren antes del siguiente title.

El caso más sencillo es la ramificación al cargador de arranque de otro sistema operativo. El comando es chainloader y el argumento suele ser el bloque de arranque de otra partición en GRUB anotación por bloque (block-notation), por ejemplo:

chainloader (hd0,3)+1

Los nombres de dispositivo que se encuentran en GRUB se explican en la Sección 8.3.1.1, “Convención de nombres para discos duros y particiones”. El ejemplo anterior determina el primer bloque de la cuarta partición del primer disco duro.

Con el comando kernel se puede especificar una copia o imagen del kernel (kernel image). El primer argumento es la ruta a la copia del kernel de una partición. El resto de los argumentos mostrarán el kernel en la línea de comandos.

Si en el kernel no está compilado el controlador adecuado para el acceso a la partición root, se debe introducir initrd. Aquí se trata de un comando GRUB que tiene la ruta al archivo initrd como único argumento. Puesto que la dirección de carga del initrd se encuentra en la copia del kernel cargada, el comando initrd debe seguir a kernel.

El comando root facilita la especificación de los archivos del kernel y de initrd. root tiene como único argumento un dispositivo GRUB o una partición de éste. Todas las rutas del kernel, de initrd o de otros archivos en las que no se ha introducido explícitamente un dispositivo, anticiparán el dispositivo hasta el siguiente comando root. Este comando no aparece en un menu.lst generado durante la instalación.

Al final de cada entrada de menú se encuentra implícito el comando boot, por lo que no es necesario escribirlo en el archivo de menú. Si tiene ocasión de utilizar GRUB de forma interactiva en el arranque, debe introducir el comando boot al final. boot no tiene argumentos, simplemente controla la copia cargada del kernel o el chain loader indicado.

Si ha introducido todas las entradas de menú, debe fijar una entrada como default o predeterminada. De no ser así, se utilizará la primera (entrada 0) como valor predeterminado. También tiene la posibilidad de asignar un tiempo de espera en segundos (timeout) antes de que se inicie el arranque de la opción predeterminada. timeout y default se escriben normalmente antes de las entradas de menú. Puede encontrar un ejemplo explicado de un archivo en la Sección 8.3.1.2, “Ejemplo de un archivo de menú”.

8.3.1.1. Convención de nombres para discos duros y particiones

Para denominar a los discos duros y particiones, GRUB utiliza convenciones distintas a las ya conocidas de los dispositivos Linux normales. La numeración de las particiones en GRUB empieza por cero. (hd0,0) corresponde a la primera partición en el primer disco duro. En una estación de trabajo ordinaria a la que esté conectado un disco como Primary Master, el nombre de dispositivo es /dev/hda1.

Las cuatro particiones primarias posibles ocupan los números de particiones 0 a 3. Las particiones lógicas se designan con los números a partir de 4:

(hd0,0)   primera partición primaria en el primer disco duro
(hd0,1)   segunda partición primaria
(hd0,2)   tercera partición primaria
(hd0,3)   cuarta partición primaria (y normalmente partición extendida)
(hd0,4)   primera partición lógica
(hd0,5)   segunda partición lógica

GRUB no distingue entre dispositivos IDE, SCSI o RAID. Todos los discos duros detectados por la BIOS u otras controladoras se numeran según el orden de arranque definido en la BIOS.

El problema en GRUB es que no resulta fácil realizar la correspondencia entre los nombres de dispositivo Linux y los nombres de dispositivo de la BIOS. GRUB utiliza un algoritmo para generar esta correspondencia y la guarda en un archivo (device.map) que puede ser editado. Puede obtener información adicional sobre el archivo device.map en la Sección 8.3.2, “El archivo device.map”.

Una ruta completa de GRUB consta de un nombre de dispositivo que se escribe entre paréntesis y de la ruta del archivo del sistema de archivos a la partición indicada. Al principio de la ruta se coloca una barra. Por ejemplo, en un sistema con un solo disco duro IDE y Linux en la primera partición, el kernel arrancable será:

(hd0,0)/boot/vmlinuz

8.3.1.2. Ejemplo de un archivo de menú

Para comprender mejor la estructura de un archivo de menú GRUB, presentamos a continuación un breve ejemplo. El sistema de nuestro ejemplo contiene una partición de arranque de Linux en /dev/hda5, una partición root en /dev/hda7 y un sistema 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 se ocupa de la configuración de la pantalla de bienvenida:

gfxmenu (hd0,4)/message

La imagen de fondo se encuentra en /dev/hda5 y se llama message

color white/blue black/light-gray

El esquema de colores: blanco (primer plano), azul (fondo), negro (selección) y gris claro (fondo de la selección). El esquema de colores no se ve reflejado en la pantalla de bienvenida sino en el menú de GRUB al que accede tras salir de ella con Esc.

default 0

Por defecto se arranca la primera entrada del menú con title linux.

timeout 8

Si transcurren 8 segundos sin que el usuario realice ninguna acción, GRUB arrancará automáticamente.

El segundo bloque (y también el más grande) contiene una lista con los diversos sistemas operativos arrancables. Las secciones para cada sistema operativo comienzan con la entrada title.

  • La primera entrada (title linux) se encarga del arranque de SUSE LINUX. El kernel (vmlinuz) se encuentra en la primera partición lógica (aquí la partición de arranque) del primer disco duro. Aquí se añaden los parámetros del kernel como la especificación de la partición raíz, el modo VGA, etc. La definición de la partición raíz se realiza de acuerdo con el esquema Linux (/dev/hda7/), ya que esta información va dirigida al kernel y no tiene mucha relación con GRUB. initrd se encuentra también en la primera partición lógica del primer disco duro.

  • La segunda entrada se ocupa de cargar Windows. Este sistema operativo se inicia desde la primera partición del primer disco duro (hd0,0). La carga y ejecución del primer sector de la partición especificada se controla por medio de chainloader +1.

  • La siguiente sección permite el arranque desde un disquete sin tener que cambiar la configuración de la BIOS.

  • La opción de arranque failsafe sirve para iniciar Linux con una selección determinada de parámetros del kernel que permiten el arrancar Linux incluso en sistemas problemáticos.

El archivo de menú puede modificarse en cualquier momento; GRUB lo aplicará automáticamente la próxima vez que arranque el sistema. Si desea editar este archivo con carácter permanente, puede utilizar cualquier editor o bien YaST. Si sólo desea efectuar cambios temporales, puede hacerlo de forma interactiva con la función de edición de GRUB (consulte la Sección 8.3.1.3, “Modificar las entradas de menú durante el proceso de arranque”)

8.3.1.3. Modificar las entradas de menú durante el proceso de arranque

Por medio de las teclas de cursor puede seleccionar en el menú gráfico de GRUB el sistema operativo que desea arrancar. Si selecciona un sistema Linux, puede añadir sus propios parámetros en el cursor de arranque. Si pulsa Esc para salir de la pantalla de bienvenida e introduce a continuación e (edit), podrá editar directamente cada una de las entradas del menú. Ahora bien, los cambios realizados sólo tienen validez para ese proceso de arranque y no se adoptarán de forma permanente.

[Important]Disposición del teclado durante el proceso de arranque

Tenga presente que al arrancar estará trabajando con un teclado norteamericano. Preste atención a los caracteres especiales intercambiados.

Después de activar el modo de edición, seleccione por medio de las teclas de cursor la entrada del menú cuya configuración desea modificar. Para acceder a la configuración en modo de edición ha de volver a pulsar e. De este modo, puede corregir datos incorrectos de las particiones o rutas antes de que los fallos repercutan negativamente en el proceso de arranque. Para salir del modo de edición y volver al menú de arranque pulse Intro. A continuación arranque esa entrada por medio de b. Un texto de ayuda en la parte inferior de la pantalla le informa sobre el resto de opciones disponibles.

Si desea guardar de forma permanente las opciones de arranque modificadas y pasárselas al kernel, abra el archivo menu.lst como usuario root e introduzca los parámetros adicionales del kernel en la línea existente separándolos entre sí con espacios:

title linux
kernel (hd0,0)/vmlinuz root=/dev/hda3 <párametros adicionales>
initrd (hd0,0)/initrd

La próxima vez que el sistema arranque, GRUB cargará automáticamente los nuevos parámetros. Otra posibilidad para los cambios consiste en activar el módulo del cargador de arranque de YaST. En este procedimiento, el parámetro también se añade a una línea ya existente separándolo mediante un espacio.

8.3.1.4. Selección del kernel de arranque mediante comodines

Sobre todo cuando se desarrollan o utilizan kernels personalizados, es necesario modificar las entradas de menu.lst o editar la línea de comandos para reflejar los nombres actuales del kernel y del archivo initrd. Con el fin de simplificar este proceso, se recomienda el uso de comodines para actualizar dinámicamente la lista de kernels de GRUB. Todas las imágenes del kernel que coinciden con un patrón específico se añaden a la lista de imágenes arrancables. Tenga en cuenta que nuestro servicio de soporte no presta asistencia para esta función.

Si desea activar la opción de comodines, introduzca una entrada de menú adicional en menu.lst. Para que esta opción pueda aplicarse, todas las imágenes del kernel e initrd deben tener un nombre base común y un identificador que asocie el kernel con el initrd correspondiente. Vea por ejemplo la siguiente configuración:

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

En este caso puede añadir dos imágenes de arranque en una configuración de GRUB. Para obtener las entradas de menú linux-default y linux-test, debe añadir la siguiente entrada a 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 examina la partición (hd0,4) en busca de entradas que coincidan con el comodín. Esas entradas se utilizan para generar nuevas entradas de menú de GRUB. En el ejemplo anterior, GRUB actuaría como si menu.lst incluyera las siguientes entradas:

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 

Los problemas con esta configuración pueden surgir cuando los nombres de archivo no se usan de forma consecuente o falta alguno de los archivos extendidos (por ejemplo una imagen initrd).

8.3.2. El archivo device.map

El ya mencionado archivo device.map contiene la correspondencia entre los nombres de dispositivo GRUB y los nombres de dispositivo Linux. Si dispone de un sistema mixto con discos duros IDE y SCSI, GRUB debe intentar averiguar el orden de arranque a partir de un procedimiento concreto. En este caso, GRUB no tiene acceso a la información de la BIOS sobre el orden de arranque. GRUB guarda el resultado de esta comprobación en /boot/grub/device.map. A continuación vemos un ejemplo para el que asumimos que el orden de arranque definido en la BIOS es de IDE antes que SCSI:

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

Debido a que el orden de IDE, SCSI y otros discos duros depende de diversos factores y a que Linux no es capaz de detectar dicha correspondencia, existe la posibilidad de determinar el orden manualmente en el archivo device.map. Si al arrancar el sistema se producen problemas, compruebe si el orden de arranque en el archivo coincide con el orden especificado en la BIOS. En caso necesario, modifíquelo durante el arranque con ayuda de la shell de GRUB descrita en la Sección 8.3.4, “La shell de GRUB”. Una vez que el sistema Linux ha arrancado, puede modificar el archivo device.map de forma permanente mediante el módulo del cargador de arranque de YaST o cualquier otro editor.

Tras modificar el archivo device.map manualmente, ejecute el siguiente comando para reinstalar GRUB. Al hacerlo, el archivo device.map se cargará de nuevo y los comandos incluidos en grub.conf se ejecutarán:

grub --batch < /etc/grub.conf

8.3.3. El archivo /etc/grub.conf

/etc/grub.conf es el tercer archivo de configuración más importante de GRUB por detrás de menu.lst y device.map. Este archivo contiene las opciones y los parámetros que grub necesita para instalar correctamente el cargador de arranque:

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

A continuación se explica el significado de cada una de las entradas:

root (hd0,4)

Con este comando se le indica a GRUB que los comandos que vienen a continuación se refieren sólo a la primera partición lógica del primer disco duro donde GRUB encontrará sus archivos de arranque.

install parameter

El comando grub ha de iniciarse con el parámetro install. stage1 ha de ser instalado en el MBR del primer disco duro como primera etapa del cargador de arranque (/grub/stage1 d (hd0)). stage2 ha de cargarse en la dirección de memoria 0x8000 (/grub/stage2 0x8000). La última entrada (hd0,4)/grub/menu.lst informa a grub de la ubicación del archivo de menú.

8.3.4. La shell de GRUB

Existen dos variantes de GRUB: una como cargador de arranque y otra como un programa normal Linux en /usr/sbin/grub. Este programa se denomina shell de GRUB. La funcionalidad de instalar GRUB como cargador de arranque en un disco duro o disquete está directamente integrada en GRUB en forma del comando install o setup. De este modo, esta función está disponible en la shell de GRUB cuando Linux está cargado.

Los comandos setup e install están disponibles también durante el proceso de arranque sin necesidad de que Linux se esté ejecutando. De este modo se simplifica la recuperación de un sistema defectuoso (que no puede arrancarse), ya que el archivo de configuración dañado del cargador de arranque puede evitarse mediante la introducción manual de parámetros. La introducción manual de parámetros durante el arranque resulta también muy adecuada para probar nuevas configuraciones cuando el sistema nativo no debe dañarse bajo ningún concepto. Introduzca simplemente el comando de configuración experimental con una sintaxis parecida a la del archivo menu.lst y pruebe la funcionalidad de esta entrada sin modificar el archivo de configuración actual y por tanto sin riesgo para la capacidad de arranque del sistema. Si por ejemplo desea probar un nuevo kernel, introduzca el comando kernel incluyendo la ruta al kernel alternativo. En caso de que el proceso de arranque falle, vuelva a utilizar para el próximo arranque el archivo menu.lst intacto. Por supuesto, la interfaz de la línea de comandos también resulta muy adecuada para poder arrancar el sistema a pesar de un archivo menu.lst defectuoso: simplemente introduzca el parámetro corregido en la línea de comandos. Para que el sistema pueda arrancarse de forma permanente, ha de añadir este parámetro a menu.lst mientras el sistema está activo.

El algoritmo de correspondencia de los nombres de dispositivo GRUB y Linux se activa sólo cuando la shell GRUB se ejecuta como programa Linux (para lo que se emplea el comando grub como se describe en la Sección 8.3.2, “El archivo device.map”). El programa lee a tal efecto el archivo device.map. Puede obtener información adicional en la Sección 8.3.2, “El archivo device.map”.

8.3.5. Definir la contraseña de arranque

GRUB soporta el acceso a sistemas de archivos ya desde el mismo momento del arranque. Esto también significa que es posible ver algunos archivos del sistema Linux a los que los usuarios sin privilegios root no tendrían acceso normalmente en un sistema iniciado. Mediante la definición de una contraseña, no sólo puede evitar este tipo de accesos no autorizados durante el proceso de arranque, sino también bloquear la ejecución de determinados sistemas operativos por parte de los usuarios.

Para definir una contraseña de arranque, realice los siguientes pasos como usuario root:

  1. Introduzca el comando grub en el símbolo de espera de órdenes de root.

  2. Codifique la contraseña en la shell de GRUB:

    grub> md5crypt
    Password: ****
    Encrypted: $1$lS2dv/$JOYcdxIn7CJk9xShzzJVw/
    
  3. Introduzca el valor codificado 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/
    

    De esta forma se impide la ejecución de comandos GRUB en el cursor de arranque. Para poder volver a ejecutar comandos es necesario introducir p y la contraseña. No obstante, aquí sigue siendo posible para todos los usuarios el arrancar un sistema operativo del menú de arranque.

  4. Si desea impedir además el arranque de uno o varios sistemas operativos del menú de arranque, añada la entrada lock a cada una de las secciones que no deba iniciarse sin introducir previamente la contraseña. Por ejemplo:

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

    Así, después de reiniciar el sistema y seleccionar la entrada Linux en el menú de arranque, aparece el siguiente mensaje de error:

    Error 32: Must be authenticated
    

    Pulse Intro para acceder al menú y a continuación p para obtener un cursor en el que introducir la contraseña. Después de escribir la contraseña y pulsar Intro, se inicia el proceso de arranque del sistema operativo seleccionado (en este caso Linux).

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

Al utilizar la contraseña de arranque en GRUB, no aparece la habitual pantalla de bienvenida.


SUSE LINUX Manual de administración 9.3