# GNU GRUB

GNU GRUB (GNU GRand Unified Bootloader) es un cargador de arranque múltiple, desarrollado por el proyecto GNU que nos permite elegir qué Sistema Operativo arrancar de los instalados.
Se usa principalmente en sistemas operativos GNU/Linux. El sistema operativo Solaris ha usado GRUB como cargador de arranque en sistemas x86 desde la revisión 10 1/06.

## Historia

GRUB fue inicialmente diseñado e implementado por el programador Erich Stefan Boleyn como parte del trabajo en el arranque del sistema operativo GNU Hurd desarrollado por la Free Software Foundation. En 1999, Gordon Matzigkeit y Yoshinori Okuji convirtieron a GRUB en un paquete de software oficial del Proyecto GNU y abrieron el desarrollo del mismo al público.
Alrededor de 2002 investigadores japoneses empezaron a trabajar en PUPA (siglas de Preliminary Universal Programming Architecture), cuyo objetivo era reescribir el cuerpo de GRUB para hacerlo más claro, seguro, robusto y poderoso. PUPA fue posteriormente renombrado a GRUB 2, y la versión original de GRUB fue renombrada a GRUB Legacy. A partir de entonces se fueron realizando actualizaciones de ambas versiones. La última actualización sobre GRUB Legacy (versión 0.97) fue realizada en 2005.
Sobre 2007 algunas distribuciones de GNU/Linux empezaron a usar GRUB 2. A finales de 2009 la mayor parte de las distribuciones de GNU/Linux tenían instalado GRUB 2 por defecto.

## Características

GRUB es un cargador de arranque que cumple la Especificación Multiboot. De esta forma puede arrancar de forma uniforme los kernels que cumplen la Especificación Multiboot.
Está diseñado para cumplir los siguientes objetivos, listados por orden de importancia:
* Funciones básicas tienen que ser sencillas para los usuarios finales.
* Amplia funcionalidad para apoyar a los expertos y diseñadores del kernel.
* Compatibilidad con versiones anteriores para arrancar FreeBSD, NetBSD, OpenBSD y Linux. Los núcleos compatibles como DOS, Windows NT y OS/2, son arrancables mediante una función de carga en cadena.
Características adicionales que soporta:
* Reconoce múltiples formatos ejecutables.
* Soporta kernels que no cumplen especificación multiboot.
* Admite comandos de configuración y puede cargar una configuración preestablecida.
* Provee interfaz de menú.
* Tiene una interfaz de línea de comandos flexible.
* Admite muchos sistemas de ficheros (BtrFS, ext2/ext3/ext4, FAT12/FAT16/FAT32, exFAT, HFS, HFS+” ISO9660, nilfs2, NTFS, ReiserFS, ZFS, ROMFS, JFS, XFS, ...).
* Descompresión automática.
* Acceso a datos ubicados en cualquier dispositivo instalado.
* Independiente de la geometría de la unidad.
* Detecta toda la RAM instalada.
* Admite direccionamiento de bloque lógico (LBA).
* Arranque de red.
* Terminales remotos para permitir el control desde una estación remota.

## Funcionamiento

Cuando se enciende un equipo, el proceso de arranque se inicia con el firmware, que generalmente es el BIOS o el UEFI, realizando una serie de pruebas de autodiagnóstico y cargando el gestor de arranque. El gestor de arranque, en este caso GRUB, permite seleccionar el sistema operativo a cargar, como GNU/Linux.
Una vez seleccionado el sistema operativo, el gestor de arranque carga el kernel (núcleo) en la memoria y le pasa el control.

### Proceso de inicio de GRUB Legacy

* El BIOS busca un dispositivo de inicio (como el disco duro) y de ahí pasa el control al primer sector físico del dispositivo conocido como master boot record, son los primeros 512 bytes (primer sector) del disco duro y que forman la fase 1 de GRUB.
* La fase 1 de GRUB carga la siguiente fase de GRUB, ubicada físicamente en cualquier parte del disco duro. La fase 1 puede cargar ya sea la fase 1.5 o, directamente, la 2.
* La fase 1.5 de GRUB, ubicada en los siguientes 30 kilobytes del disco duro, carga la fase 2. En GRUB 2, esta fase ha dejado de existir.
* La fase 2 de GRUB (cargada por las fases 1 o 1.5) recibe el control, y presenta al usuario el menú de inicio.
* GRUB carga el kernel seleccionado por el usuario, en la memoria y le pasa el control.
En el caso de computadoras con sistema de arranque EFI, el firmware carga el ejecutable de GRUB directamente (fase 2), siempre y cuando esté correctamente instalado en la partición EFI y configurado en la NVRAM.

### GRUB 2

GRUB 2 es una reescritura de GRUB que comparte muchas características con su versión anterior, ahora conocida como GRUB Legacy. Las más importantes diferencias entre GRUB 2 y GRUB Legacy son:
* El fichero de configuración de GRUB 2 es ‘grub.cfg’ en lugar del ‘grub.conf’ o ‘menu.lst’. Se añade nueva sintaxis y muchos nuevos comandos. El fichero ‘grub.cfg’ es típicamente automáticamente generado por ‘grub2-mkconfig’ lo que facilita mucho el uso.
* Los números de partición en los nombres de los dispositivos GRUB ahora empiezan en 1, en lugar de en 0.
* Una pequeña cantidad de almacenamiento persistente está disponible entre reinicios, usando los comandos ‘save_env’ y ‘load_env’ y la utilidad ‘grub2-editenv’. Esto no está disponible en todas las configuraciones.
* GRUB 2 tiene formas más confiables de encontrar sus propios ficheros y los de los kernels de destino en sistemas de varios discos, y tiene comandos para buscar dispositivos usando etiquetas del sistema de archivos o identificadores únicos universales (UUID).
* GRUB 2 soporta muchos más sistemas de ficheros, incluyendo pero no limitado a Ext4, HFS+, y NTFS.
* GRUB 2 puede leer ficheros directamente de dispositivos LVM y RAID.
* GRUB 2 tiene disponible un terminal gráfico y un sistema de menú gráfico
* Los archivos de imagen que componen GRUB se han reorganizado; La etapa 1, la etapa 1.5 y la etapa 2 ya no existen. En su lugar GRUB 2 dispone de una variedad de imágenes de arranque (boot.img, diskboot.img, cdboot.img, pxeboot.img, lnxboot.img, kernel.img) para iniciar GRUB de varias formas, una imagen del núcleo (core.img) y un conjunto de módulos que se combinan con la imagen del núcleo (*.mod).
* GRUB 2 introduce muchas instalaciones en módulos cargados dinámicamente, lo que permite que la imagen del núcleo sea más pequeña y que se construya de formas más flexibles