GRUB-Comment s'amorce mon système

Objet : Comprendre l'utilité de Grub

Suivi :

Création par captnfab 11/02/2014

Commentaires sur le forum : Lien vers le forum concernant ce tuto 1) N'hésitez pas à y faire part de vos remarques, succès, améliorations ou échecs !

Introduction

Tchip!

Bip bip, tut.

Brrrtglglglglgl.

Dzip dzip.

Crrrrrrrrrrrr.

Et non, ça n'était pas un modem 56k en train d'établir une connexion internet, mais comme vous l'avez reconnue une tour des années 2000 (avec lecteur de disquette) qui démarrait.

Qu'est-ce que ça cache?

Fonctionnement

Ce qui nous intéressera ici n'est pas ce que fait le BIOS ou l'UEFI, mais plutôt ce qu'il se passe à partir du moment où ils donnent la main. On prendra comme exemple le cas où c'est le gestionnaire de démarrage Grub qui est installé.

Le cas BIOS

L'amorce du BIOS est rigolote, on comprend un peu pourquoi certains voulaient la changer. Après le POST, quand le BIOS a repéré un disque dur amorçable (à ne pas confondre avec une partition amorçable, et encore moins avec le flag boot), il charge le premier secteur du disque dur en mémoire, et l'exécute.

Un secteur fait 512 octets. Vu les autres infos déjà présentes dans ce secteur, comme la table des partitions (dans un format appelé «msdos» et ne permettant pas plus de 4 paritions principales, dont au plus 1 partition étendue), il ne reste que 440 octets de libres pour le chargeur de démarrage. Dans ces 440 octets, sur la plupart de nos machines, se trouve « Grub Stage 1 », installé par « grub-install /dev/disque-dur », soit automatiquement lors de l'installation de Debian, soit manuellement par la suite.

Ce petit programme de 440o ne peut pas faire grand chose. En pratique, il charge un code situé dans les premiers secteurs du disque dur s'ils sont libres, un « Grub Stage 1.5 », qui lui contient les pilotes nécessaires pour lire le système de fichier ext2. À partir de là, « Grub Stage 1.5 » peut aller lire et charger en mémoire « Grub 2 » depuis /boot/grub, l'interface visuelle et modulaire que nous connaissons.

Le cas UEFI

Cette fois-ci, le firmware de l'UEFI (qui remplace donc le BIOS, son SETUP et son POST), récupère dans le MBR simplifié l'adresse de la partition EFI. Puis il va chercher dans cette partition le fichier « .efi » correspondant au gestionnaire de démarrage. Debian range un grub.efi et un grub.cfg dans « efi/debian/ » (à vérifier via ls /boot/efi/efi)

Lancement du noyau

La sélection d'un noyau dans le menu du Grub permet de choisir un fichier image contenant le noyau, une archive contenant des modules indispensables au démarrage, et des options de configuration, comme par exemple, la partition à utiliser comme système de fichier racine /.

Le noyau est chargé en mémoire par le gestionnaire de démarrage, puis exécuté.

Options au démarrage et découverte des autres systèmes

La liste des options de démarrage proposées par Grub est présente dans le fichier grub.cfg, lui-même généré lors du update-grub. Si le paquet os-prober est installé, les systèmes autres partitions seront testées pour la présence d'OS connus, et les entrées seront ajoutées au grub.cfg. La sélection de l'option de démarrage par défaut est faite par grub et configurable via le /etc/default/grub.

GRUB Multiboot

Au cas où vous avez 2 ou plus systèmes libres sur des disques séparés avec leur GRUB respectif le dernier système mis à jour prendra la main au démarrage, comment l'éviter ?

Supprimer /boot/grub de l'installation d'un second système serait une grosse erreur. Cela n'empêchera pas le GRUB correspondant (dont le premier étage est ailleurs) de se lancer mais aura pour seul effet de le faire planter (car il a besoin de /boot/grub pour continuer), bloquant l'amorçage.

Il y a plusieurs causes possibles qui peuvent faire que le GRUB lancé au démarrage a changé. Cela dépend tout d'abord si la machine démarre en mode BIOS/legacy ou en mode EFI.

En mode BIOS

L'amorçage se fait à partir du MBR d'un disque.
Comme Debian et Ubuntu2) par exemple sont installés sur des disques séparés, la logique voudrait que le GRUB de chacun soit installé dans le MBR de son propre disque.

La priorité entre les deux disques est réglée dans le BIOS. La réinstallation d'un GRUB suite à une mise à jour des paquets grub* ne peut donc normalement pas écraser l'autre.

En mode EFI

GRUB est installé dans une partition système EFI.
Peu importe qu'il y ait une seule partition EFI sur un des disques ou une sur chaque disque, le GRUB de chaque distribution est installé dans un répertoire différent donc pas de risque d'écrasement (sauf entre deux Debian ou deux Ubuntu) et l'ordre de priorité est déterminé par une variable du firmware EFI.

Généralement, le dernier chargeur installé se met en premier dans l'ordre de priorité. La commande efibootmgr permet d'afficher les entrées d'amorçage EFI et leur ordre de priorité.

Le rapport de bootinfoscript3) paquet : boot-info-script nous en apprendra plus sur la configuration d'amorçage.

Conclusion

Dans ce cas, chaque système devrait avoir son propre chargeur d'amorçage, et un chargeur principal indépendant devrait être installé pour chaîner les chargeurs des différents systèmes qui vont à leur tour charger le noyau de leur propre système.

On ne peut pas connaître les paramètres du noyau d'un autre système autrement qu'en lisant le fichier de configuration du chargeur d'amorçage de ce dernier, qui n'existe que si un chargeur est installé.

Avec un chargeur qui charge directement les noyaux de tous les systèmes en se basant sur leurs fichiers de configuration d'amorçage respectifs, les modifications de ces derniers (ajout ou suppression de noyau, modification des paramètres...) ne sont prises en compte que si on met à jour la configuration du chargeur actif.
Avec GRUB, on doit donc démarrer le système secondaire à modifier, faire la modification, exécuter update-grub, redémarrer sur le système principal, exécuter update-grub et là seulement on peut redémarrer sur le système secondaire avec les modifications appliquées.
Laborieux.

Si le système auquel le chargeur appartient est supprimé ou endommagé, ça ne démarre plus !
Il faut installer un GRUB (ou autre chargeur comme rEFInd en EFI) indépendant des OS installés.

rEFInd (stretch)

Depuis stretch, la commande refind permet d'ajouter en EFI les nouveaux systèmes sans modifier la priorité du premier installé )comme le permettait anciennement gag)...

À tester...

Sources sur le forum :

https://debian-facile.org/viewtopic.php?pid=244498#p244498

https://debian-facile.org/viewtopic.php?pid=332625#p332625

Un krô merci à nounours, solar66 et raleur et tous les autres participants d'avoir initié sur le fil du forum ces précisions délicates.

Références

http://fr.wikipedia.org/wiki/Master_boot_record

http://en.wikipedia.org/wiki/GNU_GRUB

http://en.wikipedia.org/wiki/Unified_Extensible_Firmware_Interface