GRUB est le GRand Unified Bootloader. Comme son nom l'indique, il s'agit d'un chargeur de système à l'instar de LILO. Originellement écrit par Erich Stefan Boleyn, il est devenu maintenant un projet de la FSF et est utilisé principalement dans le cadre du projet GNU Hurd.
Résumé
Un bootloader (ou chargeur en français) est le premier programme purement logiciel (par opposition au programme du BIOS) à être exécuté sur un ordinateur. Sa tâche est de charger le noyau du système d'exploitation et de lui passer le contrôle. Celui-ci s'occupe, alors, de charger le reste du système.
Histoire du Grub
Comme nous venons de le dire, les premières versions de GRUB sont l'oeuvre de Erich S. Boleyn et date de l'époque où il cherchait une solution pour booter le micro-noyau Mach 4 (1995). Erich est également l'auteur, avec Brian Ford, du standard Mutliboot. Après plusieurs tentatives de réutilisation du chargeur BSD, Erich décida d'en créer un nouveau en partant de rien : GRUB était né. Faute de temps, Erich a passé le relais à Okuji Yoshinori et Gordon Matzigkeit, qui ont ouvert le développement à tous les enthousiastes de la planète (CVS :pserver:anoncvs@anoncvs.gnu.org:/gd/gnu/anoncvsroot, module grub)
Caractéristiques
Lorsqu'on parcourt le manuel GRUB, on découvre un programme d'une richesse inégalée, à la fois simple à utiliser et extrêmement configurable.
Voici les diverses caractéristiques qui font de GRUB un élément indispensable d'un système de qualité comme GNU :
1 - Il est compatible avec le standard Multiboot.
2 - Il regroupe en un seul logiciel les fonctionnalités avancées pour les experts et les fonctions de base simples d'emploi pour les utilisateurs de base.
3 - Il peut démarrer les systèmes FreeBSD, NetBSD, OpenBSD, GNU/hurd et GNU/Linux, mais également des systèmes archaïques et propriétaires comme Windows 98, Windows NT et OS/2.
4 - Il supporte plusieurs formats d'exécutables.
5 - Il lui est possible de démarrer des systèmes ne supportant pas le standard Multiboot.
6 - Son fichier de configuration est clair et parfaitement compréhensible.
7 - Il possède une interface à menus puissante ET un mode de fonctionnement par ligne de commande.
8 - Il peut accéder à n'importe quel disque ou périphérique supporté par le BIOS de la machine.
9 - Il possède une fonction indépendante de translation de géométrie des disques.
10 - Il peut détecter TOUTE la RAM disponible sur la machine et passer cette valeur au noyau qu'il démarre.
11 - Enfin, il supporte le mode LBA (Logical Block Address), éliminant les problèmes dus à la taille des unités disque.
Comme vous pouvez le constater, GRUB n'a aucune équivalence dans le monde des bootloaders. Mais ce n'est pas tout, GRUB possède un mode de fonctionnement permettant à l'utilisateur de modifier le fichier de configuration depuis GRUB lui-même. Ainsi, il n'est pas nécessaire de démarrer un système pour apporter des modifications aux entrées, en ajouter ou en supprimer.
Installation
Bien connu des utilisateurs du Hurd, GRUB nécessite une petite gymnastique mentale lors de son installation. En effet, la dénomination des disques et des partitions est très différente de celle que l'on utilise avec Linux. GRUB utilise la syntaxe hdN,n où N est un numéro de disque et n, celui de la partition. Attention cependant, GRUB commence à compter à partir de zéro (comme n'importe quel programme). Autre point important, les disques sont référencés dans leur ordre d'apparition, en commençant par ceux du contrôleur IDE, puis SCSI. Pour GRUB, il n'existe aucune différenciation dans l'appellation d'un disque IDE et SCSI.
Par exemple, la troisième partition du second disque sera hd1,2. Peu importe que ce disque soit esclave sur le premier contrôleur, maître sur le second ou encore qu'il soit un disque SCSI si vous ne possédez qu'un seul disque IDE.
Pour créer une disquette bootable avec GRUB, vous devez procéder comme suit :
- Récupérez la dernière version de GRUB sur le site GNU ou le miroir le plus proche.
- Décompressez l'archive et compilez avec les commandes habituelles (./configure & make).
- Pour simplifier, recopiez les exécutables GRUB, stage1 et stage2, dans un répertoire facilement reconnaissable (par exemple, /GG).
- Créez un système de fichiers ext2 sur une disquette (mke2fs /dev/fd0).
- Montez la disquette et créez-y un sous-répertoire grub dans un répertoire boot à la racine du système de fichiers.
- Copiez stage2 et le fichier de configuration (livré avec les sources) dans boot/grub/.
- Depuis le répertoire /GG, lancez grub.
- Sur la ligne de commande, saisissez ce qui suit sur une ligne :
install= (hd1,0)/GG/stage1 (fd0) (fd0)/boot/grub/stage2 0x8000 (fd0)/boot/grub/menu.lst
Explication : nous utilisons la commande install= pour placer stage2 depuis la première partition du second disque dur (notre partition Linux racine) sur la disquette. Nous demandons l'utilisation de /boot/grub/stage2 sur la disquette (adresse 0x8000). Enfin, nous signalons à stage2 de prendre en compte le fichier de configuration /boot/grub/menu.lst de la disquette.
Voici l'exemple francisé livré avec les sources de GRUB 0.5.92 :
# Temps limite avant démarrage sur l'entrée par
# défaut (30 sec.)
timeout= 30
# Définition de l'entrée par défaut
default= 0
# Entrée 0 : démarrage du Hurd sur le 1er disque,
# 1ère partition
title= GNU/HURD
root= (hd0,0)
kernel= /boot/gnumach root=hd0s1
module= /boot/serverboot
# Entrée 1 : démarrage de Linux sur le 2e disque,
# 1ère partition
title= GNU/Linux
kernel= (hd1,0)/vmlinuz root=/dev/hdb1
# Entrée 2 : démarrage de Mach (avec noyau sur disquette)
title= Utah Mach4 multiboot
root= (hd0,2)
pause=My test!!
kernel= (fd0)/boot/kernel root=hd0s3
module= (fd0)/boot/bootstrap
# Entrée 3 : démarrage de FreeBSD (avec noyau sur
# disquette)
title= FreeBSD 2.2-SNAP
root= (hd0,2)
kernel= (fd0)/kernel
# Entrée 4 : démarrage d'OS/2 (non testé)
title= OS/2
root= (hd0,1)
makeactive
chainloader= /boot/chain.os2
# Entrée 5 : démarrage de Windows NT 3.5 ou Windows95
title= Windows NT 3.5/Windows 95
root= (0x80,0)
makeactive
chainloader= +1
# Entrée 6 : installation de GRUB sur le disque dur
title= Installe GRUB
root= (hd0,0)
install= /boot/grub/stage1 d (hd0) /boot/grub/stage2 0x8000 p
Les commandes utilisées dans le fichier de configuration sont quasiment les mêmes qu'avec la ligne de commande. Voici quelques-unes des commandes utiles; commençons par celles utilisées dans notre menu.lst :
title : définit le nom de la nouvelle entrée. Ce nom est pris en compte à partir du premier caractère non blanc et s'affichera dans le menu de démarrage.
root : définit la partition racine du système à démarrer.
kernel : définit l'image du noyau à lancer. Les formats supportés sont Multiboot (ELF ou a.aout), Linux (compressé ou non), FreeBSD (a.aout) et NetBSD (a.out). Cette option ne prend en compte que le nom de l'image, le reste de la ligne est passé comme paramètre au noyau.
module : valable uniquement avec les noyaux compatibles Multiboot, cette option ne fait que passer la liste des modules. Notez que GRUB ne fait rien du tout avec ce ou ces modules ; c'est à vous de connaître leur utilité.
install : il s'agit de la fonction d'installation de GRUB. La syntaxe est la suivante :
install= fichier-stage1 [d] périph-de-destination fichier-stage2 adresse [p] [fichier-config].
Les paramètres entre crochets sont optionnels.
chainloader : charge le fichier mentionné comme un chain-loader (en bref, on charge un autre chargeur). Cette option est utilisée pour les systèmes propriétaires comme Windows, où il n'y a pas vraiment de noyau à charger. Dans ce cas précis, on utilise le nom de fichier +1 (notation blocklist) pour demander le chain-loader placé sur le premier secteur de la partition (secteur de boot de DOS). Dans le cas d'OS/2, le chain-loader est bien un fichier ; il suffit alors d'en spécifier l'emplacement.
Il existe encore bien d'autres commandes (décrites dans le manuel GRUB en cours de traduction). Signalons l'une d'entre elles, qui permet de colorer les menus de GRUB.
color : cette commande, placée en dehors d'une entrée, détermine les couleurs des menus "normaux" (avant et arrière-plan) sélectionnés avec la syntaxe suivante :
color = 0xnn 0xnn,
où la première valeur est le menu "normal" et la seconde le menu sélectionné. Chacune de ces valeurs est composée de deux chiffres en base 16 : le premier donne la couleur de l'arrière-plan et le second de l'avant plan. Les chiffres possibles sont : 0 noir, 1 bleu, 2 vert, 3 cyan, 4 rouge, 5 magenta, 6 brun et 7 gris clair. Les chiffres suivants ne s'appliquent qu'à l'arrière-plan : 8 gris foncé, 9 bleu clair, A vert clair, B cyan clair, C rouge clair, D magenta clair, E jaune et F blanc. Je vous conseille cependant de ne pas définir une couleur par entrée ; GRUB est un bootloader et non un sapin de Noël...