Instalar un gestor de arranque

TEMARIO

Introducción

Cuando enciendes una computadora, el primer programa que se ejecuta se llama cargador de arranque. Su trabajo es cargar el corazón del sistema operativo y dejar que empiece a funcionar. Este «corazón» luego prepara el hardware, cargando otros programas necesarios y completando el inicio del sistema operativo.

GRUB es el programa que inicia tu computadora cuando la enciendes. Es como el portero que te da opciones para iniciar diferentes sistemas operativos, como Linux o Windows. Puedes elegir qué sistema operativo quieres usar utilizando las teclas del teclado. También puedes cambiar opciones como la velocidad o la resolución de la pantalla antes de iniciar.

En la mayoría de las computadoras con Linux, GRUB (también conocido como GRUB 2) se instala y configura automáticamente. Esto significa que la mayoría de las veces, no necesitas preocuparte por ello. Sin embargo, es importante para los administradores de sistemas saber cómo manejar GRUB en caso de problemas, como una actualización de software que causa problemas al iniciar la computadora. En esta lección aprenderás a instalar, configurar e interactuar con GRUB.

GRUB Legacy vs. GRUB 2

La versión original de GRUB (Grand Unified Bootloader), ahora conocida como GRUB Legacy se desarrolló en 1995 como parte del proyecto GNU Hurd, y más tarde se adoptó como el gestor de arranque predeterminado de muchas distribuciones de Linux, reemplazando alternativas anteriores como LILO.

GRUB 2 es una versión mejorada del antiguo GRUB. Fue diseñado para ser más limpio, seguro y potente. Tiene un archivo de configuración más flexible, con más opciones y comandos, similar a un lenguaje de programación. También es más modular y fácil de traducir a diferentes idiomas.

Pantalla de inicio de GRUP 2

También hay soporte para temas y menús gráficos de arranque con pantallas de presentación, la capacidad de arrancar archivos ISO de LiveCD directamente desde el disco duro, mejor soporte para arquitecturas que no son x86, soporte universal para UUID (lo que facilita la identificación de discos y particiones) y mucho más.

Hoy en día, GRUB Legacy ya no se actualiza (la última versión fue en 2005), y la mayoría de las distribuciones de Linux usan GRUB 2 como su gestor de arranque predeterminado. Aunque aún puedes encontrar sistemas que usan GRUB Legacy, es útil saber cómo funciona y en qué se diferencia de GRUB 2.

¿Dónde se ubica el cargador de arranque?

Históricamente, los discos duros en los sistemas compatibles con PC de IBM se particionaron utilizando el esquema de partición MBR, creado en 1982 para IBM PC-DOS (MS-DOS) 2.0.

En este esquema, la primera parte del disco se llama Master Boot Record (MBR). Este MBR contiene información sobre las particiones en el disco (llamada tabla de particiones) y también tiene un pequeño programa llamado cargador de arranque.

Cuando enciendes la computadora, un pequeño código de inicio, llamado gestor de arranque, se carga primero. Este código es limitado en tamaño pero esencial para comenzar. Luego, este código pasa el control a otro programa de arranque que se encuentra en el disco, usualmente en un espacio especial entre el MBR y la primera partición. Este programa de arranque se encarga de cargar los sistemas operativos.

En un disco con particiones MBR, el código de arranque para GRUB está instalado en el MBR. Esto carga y pasa el control a una imagen “núcleo” instalada entre el MBR y la primera partición. Desde este punto, GRUB es capaz de cargar el resto de los recursos necesarios (definiciones de menú, archivos de configuración y módulos adicionales) desde el disco.

El esquema MBR tiene limitaciones, como el número máximo de particiones y el tamaño máximo del disco. Para superar estas limitaciones, se creó un nuevo esquema de particionamiento llamado GPT (Tabla de Partición GUID), que forma parte del estándar UEFI.

Los discos con particiones GPT se pueden usar con computadoras con el BIOS de PC tradicional o con el firmware UEFI. En máquinas con un BIOS, la segunda parte de GRUB se almacena en una partición especial de arranque del BIOS.

En los sistemas con firmware UEFI, GRUB se carga mediante el firmware desde los archivos grubia32.efi (para sistemas de 32 bits) o grubx64.efi (para sistemas de 64 bits) desde una partición llamada ESP (EFI System Partition).

La partición /boot

En Linux, los archivos necesarios para el proceso de arranque generalmente se almacenan en una partición de arranque, montados en el sistema de archivos raíz y coloquialmente denominados /boot.

En los sistemas modernos, no es necesario tener una partición de arranque, ya que los cargadores de arranque como GRUB pueden encontrar los archivos de arranque dentro del sistema de archivos raíz. Sin embargo, es una buena práctica tener una partición de arranque separada, ya que mantiene los archivos necesarios para el arranque separados del resto del sistema de archivos.

Esta partición suele estar al principio del disco. Esto se debe a cómo se diseñaron originalmente los discos en las computadoras IBM, que usaban un sistema llamado Cilindros, Cabezas y Sectores (CHS). Este sistema tenía un límite de tamaño de disco de alrededor de 528 MB (504 MB en MS-DOS) debido a las limitaciones de hardware. Para superar este límite y acceder a más espacio en disco, se implementaron esquemas de direccionamiento de disco como LBA (Dirección Lógica de Bloques).

Para asegurar que la computadora pueda cargar el kernel sin problemas, la partición
/boot generalmente se coloca al principio del disco y termina antes del cilindro 1024, que es alrededor de 528 MB. Se recomienda que esta partición tenga un tamaño de al menos 300 MB en las computadoras actuales.

Otra razón para separar la partición /boot es cuando necesitas aplicar cifrado o compresión. Algunos métodos de cifrado y compresión pueden no ser compatibles con
GRUB 2. Además, si necesitas utilizar un tipo de sistema de archivos no compatible en la partición raíz del sistema (/), tener una partición /boot separada puede ser útil.

Contenido de la partición de arranque

El contenido de la partición /boot puede variar con la arquitectura del sistema o el cargador de arranque en uso, pero en un sistema basado en x86, generalmente encontrará los archivos a continuación. La mayoría de estos se nombran con un sufijo -VERSION, donde -VERSION es la versión del núcleo de Linux correspondiente. Entonces, por ejemplo, un archivo de configuración para la versión del núcleo de Linux 4.15.0-65-generic se llamaría config-4.15.0-65-generic.

Con uname-r, podemos ver la versión del nucleo.

Archivo de configuración.- Este archivo, generalmente llamado config-VERSION , almacena los parámetros de configuración para el núcleo de Linux. Este archivo se genera automáticamente cuando se compila o instala un nuevo núcleo y el usuario no debe modificarlo directamente.

Mapa del sistema.- Este archivo es una tabla de búsqueda que combina nombres de símbolos (como variables o funciones) con su posición correspondiente en la memoria. Esto es útil para depurar el tipo de fallo del sistema conocida como kernel panic, ya que permite al usuario saber qué variable o función se estaba llamando cuando ocurrió el fallo. Al igual que el archivo de configuración, el nombre suele ser System.map-VERSION (por ejemplo, System.map-4.15.0-65-generic).

Kernel de Linux.- Este es el núcleo del sistema operativo propiamente dicho. El nombre suele ser vmlinux-VERSION (por ejemplo, vmlinux-4.15.0-65-generic). También puede encontrar el nombre vmlinuz en lugar de vmlinux, la z al final significa que el archivo ha sido comprimido.

Disco RAM inicial.- Esto generalmente se llama initrd.img-VERSION y contiene un sistema de archivos raíz mínimo cargado en un disco RAM, que contiene utilidades y módulos del núcleo necesarios para que el núcleo pueda montar el sistema de archivos raíz real.

Archivos relacionados con el cargador de arranque.- En los sistemas con GRUB instalado, estos generalmente se encuentran en /boot/grub e incluyen el archivo de configuración GRUB (/boot/grub/grub.cfg para GRUB 2 o /boot/grub/menu.lst en caso de GRUB Legacy), módulos (en /boot/grub/i386-pc), archivos de traducción (en /boot/grub/locale) y fuentes (en /boot/grub/fonts).

GRUB 2

Instalando GRUB 2.- GRUB 2 se puede instalar utilizando la utilidad grub-install. Si tiene un sistema que no arranca, necesitará arrancar usando un Live CD o un disco de rescate, averiguar cuál es la partición de arranque de su sistema, montarlo y luego ejecutar la utilidad.

El primer disco de un sistema suele ser el boot device y es posible que necesite saber si hay una boot partition en el disco. Esto se puede hacer con la utilidad fdisk. Para enumerar todas las particiones en el primer disco de su máquina, use:

La partición de arranque se identifica con el * debajo de la columna de arranque. En el ejemplo anterior, es /dev/sda1.

Ahora, cree un directorio temporal en /mnt y monte la partición en él:

Luego ejecute grub-install, apuntándolo al dispositivo de arranque (no la partición) y al directorio donde está montada la partición de arranque. Si su sistema tiene una partición de arranque dedicada, el comando es:

Si estás instalando en un sistema que no tiene una partición de arranque separada, sino solo un directorio /boot en el sistema de archivos principal, entonces debes usar el comando grub-install. Aquí tienes el comando:

Configurando GRUB 2

GRUB 2 es un gestor de arranque comúnmente utilizado en sistemas Linux. Su archivo de configuración principal se encuentra en /boot/grub/grub.cfg. Aunque puedes modificar este archivo manualmente, no se recomienda porque se regenera automáticamente y tus cambios pueden perderse. Para hacer cambios en la configuración de GRUB de forma segura, debes editar el archivo /etc/default/grub. Después de hacer tus cambios, ejecutas el comando update-grub para aplicarlos y actualizar el archivo de configuración de GRUB (/boot/grub/grub.cfg) de manera correcta.

En el archivo /etc/default/grub, puedes encontrar opciones para controlar el comportamiento de GRUB 2 cuando arranque tu sistema Linux. Estas opciones incluyen cosas como qué kernel arranca por defecto, el tiempo espera antes de arrancar automáticamente, y parámetros adicionales para la línea de comandos.

Algunas de las opciones más importantes incluyen:

GRUB_DEFAULT= .- La opción que controla qué opción de arranque se selecciona automáticamente cuando inicia tu computadora. Puede ser un número (como 0, 1, etc.), el nombre de una opción de arranque (como «debian») o «saved«, que se utiliza con la configuración GRUB_SAVEDEFAULT=, que explicaremos más adelante. Es importante recordar que las opciones de arranque comienzan en cero, lo que significa que la primera opción es 0, la segunda es 1, y así sucesivamente.

GRUB_SAVEDEFAULT= .- Si esta opción se establece en true y GRUB_DEFAULT= se establece en saved, entonces la opción de inicio predeterminada siempre será la última seleccionada en el menú de inicio.

GRUB_TIMEOUT= .- El tiempo de espera, en segundos, antes de que se seleccione la entrada de menú predeterminada. Si se establece en 0, el sistema iniciará la entrada predeterminada sin mostrar un menú. Si se establece en -1, el sistema esperará hasta que el usuario seleccione una opción, sin importar el tiempo que tarde.

GRUB_CMDLINE_LINUX= .- Enumera las opciones de línea de comando que se agregarán a las entradas para el kernel de Linux.

GRUB_CMDLINE_LINUX_DEFAULT= .- Por defecto, se generan dos entradas de menú para cada núcleo de Linux, una con las opciones predeterminadas y una entrada para la recuperación. Con esta opción, puede agregar parámetros adicionales que se agregarán solo a la entrada predeterminada.

GRUB_ENABLE_CRYPTODISK= .- Si esta configuración se establece en «y«, ciertos comandos como grub-mkconfig, update-grub y grub-install buscarán discos cifrados y añadirán los comandos necesarios para acceder a ellos durante el arranque. Esto desactivará el arranque automático (GRUB_TIMEOUT= con cualquier valor que no sea -1), ya que se requerirá una contraseña para descifrar los discos antes de que puedan ser accesibles.

Administrar entradas de menú

Cuando se ejecuta update-grub, GRUB 2 buscará núcleos y sistemas operativos en la máquina y generarán las entradas de menú correspondientes en el archivo /boot/grub/grub.cfg. Se pueden agregar nuevas entradas manualmente a los archivos de script dentro del directorio /etc/grub.d.

Estos archivos deben tener permisos de ejecución y son procesados en un orden específico por update-grub. Por ejemplo, 05_debian_theme se procesa antes que 10_linux, y así sucesivamente. Las opciones de menú personalizadas suelen añadirse al archivo 40_custom.

A continuación se muestra el formato básico para una opción de menú:

La primera línea siempre comienza con menuentry y termina con {. El texto entre comillas se mostrará como la etiqueta de entrada en el menú de arranque de GRUB 2.

El parámetro set root define el disco y la partición donde se encuentra el sistema de archivos raíz para el sistema operativo. Tenga en cuenta que en GRUB 2 los discos están numerados desde cero, por lo que hd0 es el primer disco (sda en Linux), hd1 el segundo, y así sucesivamente. Las particiones, sin embargo, están numeradas a partir de uno. En el ejemplo anterior, el sistema de archivos raíz se encuentra en el primer disco (hd0), la primera partición (,1) o sda1.

En vez de indicar directamente el dispositivo y la partición, también puedes hacer que GRUB 2 busque un sistema de archivos con una etiqueta específica o un UUID (Identificador Único Universal). Para ello, utiliza el comando search –set=root seguido del parámetro –label y la etiqueta del sistema de archivos que deseas buscar, o –fs-uuid seguido del UUID del sistema de archivos.

Puede encontrar el UUID de un sistema de archivos con el siguiente comando:

En el ejemplo anterior, el UUID para /dev/sda1 es 2495-E40D. Si desea establecerlo como el dispositivo raíz para GRUB 2, el comando sería search –set=root –fs-uuid 2495-E40D.

Cuando se usa el comando search, es común agregar el parámetro –no-floppy para que GRUB no pierda el tiempo buscando en disquetes.

La línea linux indica dónde se encuentra el núcleo del sistema operativo (en este caso, el archivo vmlinuz en la raíz del sistema de archivos). Después de eso, puede pasar los parámetros de la línea de comandos al núcleo del sistema operativo.

En el ejemplo anterior, especificamos la partición raíz (root=/dev/sda1) y pasamos tres
parámetros del kernel: la partición raíz debe montarse como solo lectura (ro), la mayoría de los mensajes de registro deben estar deshabilitados (quiet) y se debe mostrar una pantalla de
bienvenida (splash).

La línea initrd indica dónde se encuentra el disco RAM inicial. En el ejemplo anterior, el archivo es initrd.img, ubicado en la raíz del sistema de archivos.

En la última línea, terminamos menuentry con el símbolo }.

Interactuando con GRUB 2

Cuando enciendes el ordenador con GRUB 2, verás un menú con diferentes opciones. Utiliza las teclas de flecha para moverte y seleccionar una opción, luego presiona Enter para confirmar y arrancar la opción que hayas seleccionado. Si ve solo una cuenta regresiva, pero no un menú, presione Shift para que aparezca el menú.

Para editar una opción, selecciónela con las teclas de flecha y presione E . Esto mostrará una ventana del editor con el contenido del menuentry asociado con esa opción, como se define en /boot/grub/grub.cfg. Después de editar una opción, escriba Ctrl + X o F10 para arrancar, o Esc para volver al menú.

Para ingresar al shell de GRUB 2, presione C en la pantalla del menú (o Ctrl + C) en la ventana de edición). Verá un símbolo del sistema como este: grub>

Escriba help para ver una lista de todos los comandos disponibles, o presione Esc para salir del shell y volver a la pantalla del menú.

Arranque desde la consola del GRUB 2

Si algo no funciona correctamente al intentar arrancar tu computadora desde el menú de inicio, puedes recurrir al shell de GRUB 2 para iniciar el sistema manualmente y solucionar el problema.

Lo primero que debe hacer es averiguar dónde está la partición de arranque. Puede hacerlo con el comando ls, que le mostrará una lista de las particiones y discos que GRUB 2 ha encontrado.

En el ejemplo anterior, las cosas son fáciles. Solo hay un disco (hd0) con solo una partición: (hd0, msdos1).

Los discos y particiones enumerados serán diferentes en su sistema. En nuestro ejemplo, la primera partición de hd0 se llama msdos1 porque el disco se particionó utilizando el esquema de partición MBR. Si se particionara usando GPT, el nombre sería gpt1.

Para arrancar Linux, necesitamos un kernel y un disco RAM inicial (initrd). Veamos el contenido de (hd0, msdos1)

Puede agregar el parámetro -l a ls para obtener una lista larga, similar a lo que obtendría en un terminal Linux. Use Tab para autocompletar los nombres de disco, partición y archivo.

Tenga en cuenta que tenemos imágenes de kernel (vmlinuz) e initrd (initrd.img) directamente en el directorio raíz. Si no, podríamos verificar el contenido de /boot con list (hd0,msdos1)/boot/.

Ahora, configure la partición de arranque:

Cargue el kernel de Linux con el comando linux, seguido de la ruta al kernel y la opción root= para decirle al kernel dónde se encuentra el sistema de archivos raíz para el sistema operativo.

Cargue el disco RAM inicial con initrd, seguido de la ruta completa al archivo initrd.img:

Ahora, inicie el sistema con boot.

Arranque desde la consola de rescate

Si algo sale mal al iniciar tu computadora, GRUB 2 puede cargar un shell de rescate. Es como una versión más simple del shell que mencionamos antes. Sabrás que estás en el shell de rescate porque verás un símbolo especial en la pantalla que veremos como grub rescue>.

El proceso para iniciar un sistema desde esta consola es casi el mismo que se muestra anteriormente. Sin embargo, deberá cargar algunos módulos GRUB 2 para que todo funcione.

Una vez que hayas identificado la partición de arranque (puedes hacerlo usando el comando ‘ls‘, como se explicó antes), utiliza el comando ‘set prefix=‘, seguido de la ubicación completa del directorio que contiene los archivos de GRUB 2. Normalmente es /boot/grub.En nuestro ejemplo:

Ahora, cargue los módulos normal y linux con el comando insmod:

Luego, configure la partición de arranque con set root= como se indicó anteriormente, cargue el kernel de Linux (con linux), el disco RAM inicial (initrd) e intente arrancar con boot.

GRUB Legacy

Instalación de GRUB Legacy desde un sistema en ejecución.- Para instalar GRUB Legacy en un disco mientras el sistema está en funcionamiento, usaremos una herramienta llamada grub-install. El comando básico es grub-install DEVICE, donde DEVICE es el nombre del disco en el que deseas instalar GRUB Legacy. Por ejemplo, /dev/sda.

Recuerda que al instalar GRUB Legacy, necesitas especificar el disco donde se instalará, como por ejemplo /dev/sda/, y no la partición /dev/sda1.

De manera predeterminada, GRUB copiará los archivos necesarios al directorio /boot en el dispositivo especificado. Sin embargo, si deseas copiarlos a otro lugar, puedes utilizar el parámetro –boot-directory= seguido de la ruta completa donde deseas que se copien los archivos.

Instalación de GRUB Legacy desde un GRUB Shell.- Si tienes problemas para iniciar el sistema y necesitas reinstalar GRUB Legacy, puedes hacerlo desde la consola de GRUB desde un disco de inicio de GRUB Legacy.

Desde el shell de GRUB (escriba c en el menú de arranque para acceder al indicador grub>), el primer paso es configurar el dispositivo de arranque, que contiene el directorio
/boot. Por ejemplo, si este directorio está en la primera partición del primer disco, el comando sería:

Si no sabe qué dispositivo contiene el directorio /boot, puede pedirle a GRUB que lo busque con el comando find, como se muestra a continuación:

Una vez que hayas terminado, simplemente reinicia el sistema y debería arrancar como de costumbre.

Configuración de entradas y ajustes del menú GRUB Legacy.- La información sobre las opciones de inicio y configuraciones de GRUB Legacy se guarda en un archivo llamado /boot/grub/menu.lst. Es un archivo de texto básico que contiene una lista de instrucciones y configuraciones que puedes editar fácilmente con tu editor de texto preferido.

Las líneas que comienzan con # se consideran comentarios y las líneas en blanco se ignoran. Una entrada de menú tiene al menos tres comandos. El primero, title, establece el título del sistema operativo en la pantalla del menú. El segundo, root, le dice a GRUB Legacy desde qué dispositivo o partición arrancar.

La tercera entrada, kernel, especifica la ruta completa a la imagen del núcleo del sistema operativo que debe cargarse cuando se selecciona la entrada correspondiente. Tenga en cuenta que esta ruta es relativa al dispositivo especificado en el parámetro root.

A continuación, un ejemplo simple:

A diferencia de GRUB 2, en GRUB Legacy ambos discos y particiones están numerados desde cero. Entonces, el comando root (hd0,0) establecerá la partición de arranque como la primera partición (0) del primer disco (hd0).

Si especificas el dispositivo de arranque antes de la ruta en el comando kernel, puedes omitir la instrucción root. La sintaxis sigue siendo la misma, así que:

equivale a:

Ambos cargarán el archivo vmlinuz desde el directorio raíz (/) de la primera partición del primer disco (hd0,0).

El parámetro root=/dev/hda1, trás el comando kernel, le indica al kernel de Linux qué partición debe utilizar como sistema de archivos principal. Es una configuración del kernel de Linux, no un comando de GRUB Legacy.

Es posible que necesites indicar la ubicación de la imagen inicial del disco RAM (initrd) para el sistema operativo utilizando el parámetro initrd. Puedes especificar la ruta completa al archivo de la misma manera que hicimos con el parámetro kernel. También puedes especificar un dispositivo o partición antes de la ruta, por ejemplo:

En GRUB Legacy, hay un diseño modular. Los módulos, suelen estar guardados como archivos .mod en /boot/grub/i386-pc, se pueden cargar para añadir funciones extras. Por ejemplo, para soportar hardware poco común, sistemas de archivos o algoritmos de compresión nuevos.

Para cargar los módulos, usamos el comando module, seguido de la ubicación completa del archivo .mod correspondiente. Es importante recordar que, al igual que con los núcleos y las imágenes initrd, esta ubicación es relativa al dispositivo especificado en el comando root.

El siguiente ejemplo cargará el módulo 915resolution, que es necesario para configurar correctamente la resolución de la pantalla en sistemas con chips de video Intel de las series 800 o 900.

Carga en cadena de otros sistemas operativos.- Con GRUB Legacy, puedes cargar sistemas operativos que no son compatibles, como Windows, usando un proceso llamado chainloading. Primero, se carga GRUB Legacy y luego, cuando seleccionas la opción adecuada, se carga el gestor de arranque para el sistema que quieras usar.

Una entrada típica para cargar Windows en cadena se vería así:

Una entrada típica para cargar Windows

Veamos cada parte, como vimos anteriormente, root (hd0,1) indica el dispositivo y la partición donde se encuentra el cargador de arranque del sistema operativo que queremos cargar. En este caso, es la segunda partición del primer disco.

makeactive.- establecerá una bandera que indica que esta es una partición activa. Esto solo funciona en particiones primarias de DOS.

chainload +1.- le dice a GRUB que cargue el primer sector de la partición de arranque. Aquí es donde generalmente se encuentran los gestores de arranque.

boot.- ejecutará el gestor de arranque y cargará el sistema operativo correspondiente.