# GNU GRUB

GNU GRUB (acronimo di GNU GRand Unified Bootloader, detto anche GRUB 2 per far riferimento all'ultima versione) è un boot loader del progetto GNU, ovvero serve ad avviare il kernel ed il sistema operativo. Viene utilizzato in diverse distribuzioni Linux come gestore di avvio anche per ambienti dual o multiboot o per avviare specifiche configurazioni del kernel.

## Descrizione

Funziona su architetture PC basate su BIOS recenti di tipo UEFI o sulle precedenti IBM-compatibili, sulle PowerPC basate su OpenFirmware (come PowerMac e Pegasos), ma anche su RiscOS/ARM, su UltraSparc e Coreboot (ex LinuxBIOS). Semplice da usare, perché configurabile in maniera automatica o modificando un unico file di configurazione, è corredato da vari programmi ausiliari. Primo fra tutti, l'installatore grub-install, che appunto individua i vari kernel e altri sistemi presenti nella directory radice e negli altri dispositivi di memorizzazione di massa per e genera automaticamente la configurazione.

### Identificare i dispositivi

GRUB utilizza una nomenclatura dei moduli diversa rispetto a quella che è utilizzata in LILO o all'interno di Linux, anche perché non è un bootloader dedicato solo a Linux. GRUB richiede che le unità cui si fa riferimento siano indicate fra parentesi tonde, e deve essere specificato sia il tipo di unità che il numero cardinale progressivo (iniziano a contare dal numero 0 e non 1) ed, eventualmente, la partizione utilizzata.
Qualche esempio chiarirà meglio la situazione: (hd0,1) indica che ci si sta riferendo ad un hard disk (hd), e tra tutti i dischi fissi presenti sul computer, si indica proprio il primo della catena (hd0). GRUB non fa alcuna differenza tra IDE, SCSI o SATA: tutto dipende dalla catena di riconoscimento del BIOS, che può essere impostata a piacere. In genere, i dischi EIDE hanno la precedenza sui restanti, e vengono identificati con i numeri più bassi.
Il secondo numero dopo la virgola indica la partizione del disco specificato alla quale ci si sta riferendo: le partizioni primarie vengono identificate come 0, 1, 2 e 3 mentre le partizioni logiche iniziano sempre da 4, indipendentemente dal numero di primarie presenti. Nell'esempio, (hd0,1) indica la seconda partizione primaria, mentre (hd0,4) indica la prima partizione logica sempre dello stesso disco. Nel caso ci si stia riferendo ad un disco EIDE, secondo la convenzione Linux, (hd0,1) corrisponde a hda2, mentre (hd0,4) corrisponde a hda5.
Rispetto ad altri boot loader, GRUB è in grado di sfogliare file all'interno dei file system. Attualmente supporta i seguenti file system:
* Ext2/Ext3/Ext4
* ReiserFS
* XFS di SGI (sperimentale)
* Journaled File System (JFS)
* UFS
* VFAT (FAT16 e FAT32).
* NTFS
GRUB è normalmente utilizzato attraverso monitor e tastiera del computer, ma può essere configurato anche per interagire con una console seriale.

### Processo di avvio

GRUB è un bootloader a stadi poiché la sua esecuzione è scandita da vari stadi (stage) di avvio, ognuno dei quali è rappresentato da un file: - due stage essenziali (file stage1 e stage2) - vari stage opzionali (indicati con i files che contengono nel proprio nome stage1_5) stage1 Questo è un file essenziale per poter effettuare il boot con GRUB ed è chiamato boot.img. Tipicamente si trova nel MBR o nel boot sector di una partizione. Poiché un boot sector è grande 512 byte, la dimensione di tale file deve essere inferire a questo valore: tipicamente è infatti pari a 446 bytes. Essendo di dimensioni così ridotte, boot.img non è in grado di "capire" alcun filesystem, per cui l'unica cosa che fa è trovare e caricare lo stage1_5: per far questo, lo stage1_5 deve essere collocato fra il MBR e la prima partizione del disco. Caricato lo stage1_5 in RAM gli viene passato il controllo. stage1_5 Lo stage1_5 come detto è collocato prima della prima partizione del disco, la quale è tipicamente collocata dopo il 63° settore del disco stesso. Questo lascia maggior spazio di memorizzazione per codice più complesso, in grado quindi di gestire (leggere) una certa varietà di filesystem. In questo modo, si può collocare il file stage2 in una partizione che può essere formattata con uno dei filesystem supportati e con una quantità di spazio disponibile estremamente più ampia.
stage2 Questo è il nucleo di GRUB e normalmente risiede in una partizione (su un filesystem reso leggibile dallo stage1_5), al percorso /boot/grub. Il processo di avvio può essere così riassunto:
* Il BIOS dopo il POST cerca le periferiche avviabili e dà il controllo al settore di avvio (MBR) del floppy o dell'hard disk, che nel limitato spazio di 516 byte contiene lo stage1 (boot.img di 446byte)
* lo stage1 individua e carica lo stage1_5 core.img (che risiede nei circa 30 kB fra MBR e prima partizione del disco di avvio) che rende leggibili i filesystem sulle partizioni del disco e permette quindi il caricamento dello stage 2 da /boot/grub
* Lo stage2 mostra all'utente il menu di avvio con la lista dei kernel avviabili e degli eventuali altri sistemi operativi presenti sul disco
* GRUB carica il kernel selezionato nella memoria e lo esegue oppure passa il controllo al bootloader di un altro sistema operativo (per es. NTLDR di Windows)
* Il kernel successivamente avvierà systemd (in passato sysVinit) e poi l'interfaccia.

### Versioni

Una prima versione del software, prima chiamata GRUB e poi rinominata GRUB Legacy, è stata sviluppata fino alle versioni 0.9x. Sulla distribuzione Ubuntu, per esempio, l'ultima versione legacy inclusa è stata la 0.9.10.
L'attuale GRUB 2 non costituisce un mero aggiornamento della precedente versione, perché nasce da una completa riscrittura con il fine di semplificare il codice del precedente e aumentare modularità e portabilità. Il software nasce con il progetto PUPA, volto appunto alla ricerca sulle evoluzioni di GRUB. Tra le caratteristiche più interessanti della versione 2 spiccano: il supporto per lo scripting; il caricamento dinamico di moduli, per estendere le funzionalità in run-time piuttosto che in compile-time; un supporto grafico particolarmente avanzato per un boot loader, che supporta VGA, VESA framebuffer, font e anche un terminale grafico (gfxterm).