Cargador de arranque
# Cargador de arranque

Se llama cargador de arranque, en inglés bootloader, al programa que se llama al final del proceso de arranque para cargar en memoria el núcleo de un sistema operativo y cederle el control de la máquina.

Para sistemas BIOS es prácticamente obligatorio su uso debido al pequeño tamaño disponible en la MBR para lanzar directamente el kernel. Con firmware UEFI se podría lanzar directamente el kernel pero se usan debido a la versatilidad de opciones que ofrece la carga indirecta a través del cargador de arranque.

La Especificación Multiboot ha establecido una forma estándar en la que los cargadores de arranque lancen kernels de un sistema operativo de arquitectura x86. Esta especificación la cumplen por ejemplo Solaris, NetBSD, GNU/Hurd. No la cumplen por ejemplo Linux y Windows.

## Historia

La palabra boot en el mundo de la informática es la abreviatura de bootstrapping (en español «arranque»). El término bootstrapping o arranque en este caso, comenzó como una metáfora derivada de tirar del cierre de las botas para que así una persona pudiera quitárselas o ponérselas con comodidad sin necesitar la ayuda de otro. En los ordenadores de la década de 1950, se utilizó un botón de arranque que al pulsarlo causaba que un programa estructurado leyera un programa de carga de una tarjeta perforada que a su vez cargaba un sistema largo de programas desde tarjetas perforadas hasta la memoria del ordenador, sin más ayuda de los operadores humanos. En el contexto de computación, esa palabra se ha utilizado al menos desde 1958.

## Gestor de arranque

Habitualmente en el proceso de arranque es necesario un menú simple que permita al usuario elegir el siguiente código a ejecutar. Al software que realiza esa tarea se le llama gestor de arranque (en inglés boot manager). Habitualmente el gestor de arranque forma parte del cargador de arranque como por ejemplo en GRUB, GRUB 2, LILO o SYSLINUX. Sin embargo, el cargador de arranque puede no tener gestor de arranque (ej. EFISTUB) y el gestor de arranque puede ser un programa independiente (ej. rEFIt, rEFInd, fallback.efi o los gestores de arranque nativos EFI).

Es habitual que el gestor de arranque termine mandando ejecutar un cargador de arranque. Sin embargo, puede mandar ejecutar otros programas como por ejemplo un programa para consultar cual es el hardware del equipo (Hardware Detection Tool o HDT), un programa para comprobar la integridad de la memoria (memtest), o incluso otro cargador de arranque.

## Etapas

Los bootloaders pueden estar repartidos en varias etapas que se ejecutan una tras otra. De ser así, se denominan bootloaders multietapa (en inglés Multi Stage Bootloader) . En caso contrario se llama cargadores de arranque de una sola etapa (en inglés Single Stage Bootloader).

Los cargadores de arranque en sistemas BIOS tienen casi siempre al menos dos etapas debido a que el espacio disponible para el cargador de arranque en el MBR es demasiado pequeño. Por tanto casi siempre es necesario saltar a una segunda etapa del cargador de arranque. La ubicación de esta segunda etapa dependería del tipo de tabla de particiones usado:

* Tabla de particiones tipo DOS ubicadas en MBR. Es habitual ubicarlo en el espacio entre el MBR y donde empieza la primera partición. Por ejemplo, GRUB con BIOS divide su ejecución en tres etapas: La del MBR, la del espacio entre el MBR y el inicio de la primera partición, y la tercera dentro del directorio /boot/grub del Linux que haya instalado GRUB en disco.
* Tabla de particiones GPT. Se ubica en la llamada BIOS Boot Partition que suele estar ubicada en el espacio sobrante entre el final de la GPT y la primera partición.

## Carga encadenada

A veces un cargador de arranque en lugar de llamar al kernel del sistema operativo, lo que se llama carga directa, llama a otro cargador de arranque. A este proceso se le llama carga encadenada (en inglés chain loading).

Un cargador de arranque puede por ejemplo, llamar a otro para llamar al kernel de un sistema operativo que no soporta. Por ejemplo GRUB usa este método para cargar los sistemas operativos Microsoft MS-DOS y Microsoft Windows. GRUB apunta al primer sector de la partición que tiene ese sistema operativo y allí encuentra los archivos necesarios para arrancarlo.

Otra posible razón para poder usar carga encadenada es poder usar Secure Boot con software libre. Tenemos un cargador de arranque firmado cuya función principal tarea es instalar unas claves adicionales que permitan verificar la firma para cargar otros binarios UEFI (típicamente cargadores de arranque). De esta forma se convierte en la raíz de confianza para todos los demás programas UEFI proporcionados por la distribución. Esto permite una delegación de confianza limpia: Cada distribución de software libre es responsable de firmar el resto de sus paquetes. Los dos cargadores de arranque firmados más habituales son Shim y Preloader. Estos cargadores han sido desarrollados para ser confiables y que puedan ser firmados por cualquier autoridad de certificación. Para ello tiene un código seguro, claro y auditable. Además estos cargadores firmados no deberían tener que actualizarse con mucha frecuencia, lo que reduce la carga de trabajo de los equipos centrales de auditoría y CA.

Aplicando el concepto de carga encadenada a las distintas etapas necesarias en el arranque BIOS, ha producido que ciertos cargadores de arranque se especialicen. Dando lugar a distintos tipos de cargadores de arranqe:

* Cargadores de arranque de primera etapa o FSBL (del inglés First Stage Boot Loader), especializados en estar en la primera etapa, la alojada en el MBR. Ejemplos de este tipo de cargadores son U-Boot SPL. Su principal función es localizar el cargador de arranque de segunda etapa y cargar la primera parte de él en memoria y ejecutarla.
* Cargadores de arranque segunda etapa o SSBL (del inglés Second Stage Boot Loader), especializados en estar en la segunda etapa.

Con este enfoque cargadores de arranque complejos se puede interpretar que están compuestos por distintos cargadores de arranque básicos. Por ejemplo se puede considerar que GRUB está compuesto por un cargador primario o de primera fase, un cargador de etapa 1.5 y un cargador secundario o de segunda fase.

## Ubicación

El cargador de arranque puede estar en:

* Disco duro externo o interno:
   * Con firmware BIOS. En estos sistemas el primer cargador de arranque se ubica en los primeros 446 bytes del MBR. El resto del MBR lo ocupa la tabla de particiones (64 bytes) y los 2 bytes finales a 0x55AA.
   * Con firmware UEFI. En estos sistemas los cargadores de arranque se ubican en la EFI System Partition (ESP).
* CD/DVD
* ISO
* memoria USB
* Servidor de Red NFS/HTTP/FTP

## Ejemplos

Ejemplos de cargadores de arranque son:

* LILO (siglas de Linux Loader). Descontinuado por sus limitaciones entre ellas no servir para firmware con interfaz UEFI. Solo sirve para firmware BIOS
* ELILO (siglas de EFI Linux Loader). Es el cargador de arranque más antiguo de Linux compatible con EFI. Es similar a LILO. Está descontinuado.
* GRUB legacy. Antes de GRUB 2 se llamaba simplemente GRUB. Soporta firmware con interfaces BIOS y UEFI.
* GRUB 2. Es una nueva versión de GRUB pero sin reutilizar nada del código original de la versión anterior de GRUB (GRUB legacy. Soporta firmware con interfaces BIOS o UEFI. Soporta características avanzada como cargar drivers o definir sentencias que configuran el arranque en función de condiciones del sistema como por ejemplo si hay un disco externo conectado.
* Das U-Boot. Solo soporta firmware UEFI. Se usa para sistemas empotrados y es el más usado para arquitecturas ARM.
* systemd-boot. Antes llamado gummiboot. Solo soporta firmware UEFI. Es en modo texto. Es muy simple y se enlaza con el bootloader nativo de la propia UEFI. Comparado con GRUB 2 es más robusto, más veloz pero tiene menos opciones de administración.
* Shim. Cargador de arranque firmado para su uso con Secure Boot.
* Preloader. Cargador de arranque firmado para su uso con Secure Boot.
* Del proyecto SYSLINUX. EL proyecto SYSLINUX proporciona un conjunto de cargadores de arranque ligeros:
   * SYSLINUX original. Permite arrancar desde sistemas de archivos FAT. Usado para arrancar desde de discos flexibles y memorias USB)
   * ISOLINUX. Permite arrancar desde sistemas de archivos ISO 9660. Usado para arrancar desde CD/DVD.
   * EXTLINUX. Permite arrancar desde sistemas de archivos ext2, ext3, ext4 y btrfs.
   * PXELINUX. Permite arrancar desde servidores de red con sistemas PXE (Preboot Execution Environment)
   * MEMDISK. Permite arrancar desde memoria
* LOADLIN (siglas de LOAD LINux). Cargador de arranque antiguo que permitía arrancar Linux, DOS y versiones antiguas de Windows. Descontinuado.
* NTLDR (siglas de NT Loader). Cargador de arranque de las primeras versiones de Microsoft Windows NT, incluyendo Windows XP y Windows Server 2003.
* BOOTMGR (siglas de BOOT ManaGeR), también llamado Windows Boot Manager. Cargador de arranque usado para reemplazar a NTLDR desde Windows Vista (Windows 7, Windows 8, Windows 10). Con la opción Legacy, el Windows Boot Manager ejecutará NTLDR y continuará el proceso como este lo haría al ejecutar cualquier versión de Windows que haga uso de NTLDR, como Windows XP
