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.lstEste 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.mapEste archivo “traduce” los nombres de dispositivo de la notación GRUB/BIOS a la nomenclatura Linux.
/etc/grub.confEste 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”).
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ú”.
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
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:
La imagen de fondo se encuentra en /dev/hda5 y se
llama message
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.
Por defecto se arranca la primera entrada del menú con title
linux.
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”)
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.
![]() | 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.
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).
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
/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:
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.
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ú.
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”.
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:
Introduzca el comando grub en el símbolo de espera
de órdenes de root.
Codifique la contraseña en la shell de GRUB:
grub> md5crypt Password: **** Encrypted: $1$lS2dv/$JOYcdxIn7CJk9xShzzJVw/
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.
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).
![]() | Contraseña de arranque y pantalla de bienvenida |
|---|---|
Al utilizar la contraseña de arranque en GRUB, no aparece la habitual pantalla de bienvenida. | |