GRUB2: GRand Unified Bootloader, version 2

L

ORSQUE votre système d'exploitation GNU/Linux ne parvient plus à se lancer au démarrage de la machine, il est parfois possible de lancer le système «à la main», en quelques commandes, si le bootloader GRUB2 a été installé!

2020.02.21 - Première écriture

1. Comment invoquer le shell GRUB

Après l'éventuel mot de passe permettant l'accès aux disques en début d'allumage, un menu apparaît pour choisir le système d'exploitation à lancer. C'est à ce moment que frapper la touche [c] permet d'accéded à l'invite grub>.

grub>

Attention! grub fonctionne en clavier américain (la première ligne est donnée avec la touche [Maj]):

³ ! @ # $ % ^ & * ( ) _ + Back
Tab Q W E R T Y U I O P [ ] Ent
Caps A S D F G H J K L ; ' \ er
Sft < Z X C V B N M , . / Sft
Ctrl W A Space A M Ctrl

En résumé, par rapport à un clavier AZERTY:

De plus,

Aide à la saisie

Dans les commandes qui suivent, il ne sera pas nécessaire de saisir le nom entier d'un répertoire ou d'un fichier: s'il existe, il s'auto-complétera avec [Tab] après la saisie de quelques lettres.

Il est possible de réutiliser une commande précédente avec la flèche du haut et de s'y promener avec la flèche gauche, la droite, effacer avec [Backspace] et [Delete] et y insérer du texte.

Les éventuels noms de fichier et de répertoire contenant des espaces doivent être entourés de guillemets.

2. Explorer les disques en présence

La commande ls suffit pour explorer les différents disques installés sur l'ordinateur. Utilisée seul, elle décrit les disques accessibles.

grub> ls
 (fd0) (hd0) (hd0,msdos5) (hd1) (hd1,gpt1)

...avec pour conventions de nommage:

La commande ls permet également d'obtenir des informations sur un disque dur en entier ou sur chacune de ses partitions:

grub> ls (hd0) informe sur le premier disque dur: Master Boot Record et taille du disque. Exemple d'un portable avec un seul disque dur et boot multiple Windows (partitions 1 à 3) et Debian (partitions 5 à 7):

grub> ls
 (hd0) (hd0,msdos7) (hd0,msdos6) (hd0,msdos5) (hd0,msdos3) (hd0,msdos2) (hd0,msdos1)

grub> ls (hd1,1) informe sur la première partition (,1) du second disque dur (hd1,): type, taille. Exemples avec une partition «windows» et une partition «linux».

grub> ls (hd0,1)
 Partition hd0,1: Type de fichier ntfs - Etiquette «Réservé au système» - Dernière date de modification Samedi 2019.02.22 17h:23:45 -
 UUID b91d9629-a4c5-6a96-aae9-400de4403252 - La partition commence à 1024 Kio - Taille totale de 756000 Kio
grub> ls (hd0,6)
 Partition hd0,6: Type de fichier ext* - Dernière date de modification Vendredi 2019.02.21 18h:43:52 -
 UUID d4c96929-b51a-69a6-dee9-403a04254a02 - La partition commence à 82000000 Kio - Taille totale de 126600000 Kio

La commande ls permet encore de lister les répertoires d'une partition (barre oblique obligatoire):

grub> ls (hd0,1)/ liste les éventuels répertoires de la première partition d'un premier disque. Le premier exemple suivant est une partition Windows, le second Linux (les réponses ne sont pas exhaustives):

grub> ls (hd0,2)/
 $Secure $Boot $AttrDef $MFT $Upcase $Volume Recovery
grub> ls (hd0,6)/
 boot/ dev/ etc/ home/ lib/ media/ mnt/ proc/ root/ run/ sys/ tmp/ usr/ var/ vmlinuz initrd.img

...où la barre oblique finale marque les répertoires.

grub> ls (hd0,3)/toto liste les éventuels sous-répertoires de /toto s'il existe

La commande cat permet de visualiser un fichier, en l'occurrence la version de la distribution GNU/Linux, si la partition précisée est une partition racine:

grub> cat (hd0,2)/etc/issue
 Debian GNU/Linux 10 \n \l

Tout cela doit permettre de repérer les partitions du système d'exploitation recherché et toute éventuelle partition consacrée au répertoire /boot.

3. Séquence de boot

Pour définir et monter une partition système / située sur la troisième partition primaire du premier disque (set ne semble pas obligatoire):

grub> set root=(hd0,3)

3.1 /boot est sur la partition racine /

La commande linux

La commande linux permet de fixer l'endroit de l'image linux à charger (rappel: [Tab] pour l'auto-complétion).

grub> linux (hd0,3)/boot/vmlinuz-4.19.0-5-amd64 root=/dev/sda3

...où root=/dev/sda3 (et non root=(hd0,3) !) est un paramètre passé à l'image vmlinuz (certains ajoutent encore ro (read-only).

commande initrd

La commande initrd fixe l'endroit du ramdisk initial à charger (rappel: [Tab] pour l'auto-complétion).

grub> initrd (hd0,3)/boot/initrd.img-4.19.0-5-amd64

Note: initrd peut nécessiter des modules, disponibles en /boot/grub/i386-pc

3.2 /boot est sur la partition autonome

Il se peut (certains l'encouragent) qu'une partition soit consacrée à /boot , par exemple la seconde.

La commande linux

La commande linux permet de fixer l'endroit de l'image linux à charger (rappel: [Tab] pour l'auto-complétion).

grub> linux (hd0,2)/vmlinuz-4.19.0-5-amd64 root=/dev/sda3

...où root=/dev/sda3 (et non root=(hd0,3) !) est un paramètre passé à l'image vmlinuz (certains ajoutent encore ro (read-only)).

commande initrd

La commande initrd fixe l'endroit du ramdisk initial à charger (rappel: [Tab] pour l'auto-complétion).

grub> initrd (hd0,2)/initrd.img-4.19.0-5-amd64

Note: initrd peut nécessiter des modules, disponibles en /boot/grub/i386-pc

boot

La commande boot lance enfin GNU/Linux (ou un éventuel autre système d'exploitation - je n'en dispose pas: pas pu tester):

grub> boot

Une fois booté, # grub-install /dev/sda devrait réinstaller sur le premier disque dur un grub bootable (pas /dev/sda1 qui signifierait la première partition), avec les indications qui ont manifestement permis de lancer votre système.

4. Exemples

4.1 /boot est un répertoire de la partition /

Exploration de l'ensemble des systèmes de fichiers d'un ordinateur (les explications suivent les réponses aux commandes):

grub> ls
 (hd0) (hd0,msdos4) (hd0,msdos3) (hd0,msdos2) (hd0,msdos1)

...grub2 a trouvé un disque dur contenant quatre partitions primaires.

grub> ls (hd0,msdos1)/
 Aucun système de fichiers connu détecté - La partition commence à 1024 Kio - Taille totale de 3850000 Kio

...aucun système de fichiers lisible sur une partition de 4Go, il s'agit probablement d'une partition d'échange swap.

grub> ls (hd0,msdos2)/
 boot/ dev/ etc/ home/ lib/ media/ mnt/ root/ sbin/ usr/ var/

...la seconde partition contient un ensemble de répertoires, typique d'un système UNIX: il s'agit plus que probablement d'une partition système.

grub> cat (hd0,msdos2)/etc/issue
 Debian 10 Buster \n \l

...récupération du nom et du numéro de version majeure de la distribution

grub> cat (hd0,msdos2)/etc/debian_version
 10.3

...récupération du numéro complet de version d'une distribution Debian

grub> cat (hd0,msdos2)/boot/
 grub/ initrd.img-4.19.0-5-amd64 vmlinuz-4.19.0-5-amd64 ...

...vérification de la présence des fichiers nécessaires dans le répertoire /boot

grub> ls (hd0,msdos3)/
 nana/ toto/

...la présence d'au moins un répertoire ressemblant à un nom de compte est le signe d'une partition /home

grub> ls (hd0,msdos4)/
 videos/ photos/ mp3/
...semble une partition de données supplémentaires.

Ces données nous montrent un système (racine / et /boot) concentré que la seconde partition (n'oubliez pas l'auto-complétion):

grub> set root=(hd0,2)
grub> linux (hd0,2)/boot/vmlinuz-4.19.0-5-amd64 root=/dev/sda2 ro
grub> initrd (hd0,2)/boot/initrd.img-4.19.0-5-amd64
grub> boot

4.2 /boot est sur une partition autonome

grub> ls
 (hd0,2) (hd0,msdos4) (hd0,msdos3) (hd0,msdos2) (hd0,msdos1)

grub> ls (hd0,msdos1)/
 [message d'erreur]

...aucun système de fichier lisible sur cette partition, il peut s'agir d'une partition d'échange swap.

grub> ls (hd0,msdos2)/
 grub/ vmlinuz-4.19.0-5-amd64 initrd.img-4.19.0-5-amd64

...la seconde partition contient les deux fichiers nécessaire au boot.

grub> ls (hd0,msdos3)/
 boot/ dev/ etc/ home/ lib/ media/ mnt/ root/ usr/ var/

...la troisième partition contient un ensemble de répertoires, typique d'un système UNIX: il semble s'agir d'une partition système. Le fait que /boot soit présent ne veut pas dire que le répertoire contienne les fichiers vm [Tab] et init [Tab] ; c'est là que se montera la partition /boot si le fichier /etc/fstab en dispose ainsi.

grub> cat /etc/fstab
 ...
/dev/sda3 /boot     ext4    defaults
 ...

...ce dont il semble.

grub> cat (hd0,msdos3)/etc/issue
 Debian 10 Buster \n \l
...distribution Debian

grub> ls (hd0,msdos4)/
 nana/ toto/
...la présence d'au moins un répertoire ressemblant à un nom de compte est le signe d'une partition /home.

Il en résulte que les partitions nécessaires sont la deuxième (/boot) et la troisième (racine: /):

grub> set root=(hd0,3)
grub> linux (hd0,2)/boot/vmlinuz-4.19.0-5-amd64 root=/dev/sda3 ro
grub> initrd (hd0,2)/boot/initrd.img-4.19.0-5-amd64
grub> boot

5. Modifier GRUB sur un système fonctionnant

Le fichier /boot/grub.cfg ne doit pas être édité: il est généré par la commande grub-mkconfig ou update-grub en utilisant les scripts contenus dans /etc/grub.d et le fichier de configuration /etc/default/grub, le seul à être éditable par des humains.

À suivre...