Twitter YouTube SoundCloud LinkedIn

Tiennot blog

Au secours, Grub me rend fou !

Lundi 21 avril 2014, 20:43 (par guilhem)

Amis linuxiens, nous allons étudier aujourd'hui LE programme indispensable à tout système GNU/Linux : Grub, l'amorceur universel. Nous allons voir en particulier comment booter depuis la ligne de commande du programme...

Passer en ligne de commande

Pour passer en ligne de commande sous Grub au démarrage de la machine, attendre quelques instants que le menu s'affiche, et appuyer sur la touche C. Vous arrivez alors sur une interface façon shell, où vous pouvez saisir des commandes. Attention, le clavier est en qwerty !

Comment démarre Linux ?

Pour bien comprendre la suite, il est nécessaire de vous expliquer le démarrage du noyau Linux. Lorsque Grub doit charger un système d'exploitation, il va chercher deux éléments : le initrd et l'image du noyau. Le premier fichier correspond à une image de la RAM telle qu'elle doit être initialisée au démarrage. Elle offre alors un système extrêmement minimal, dont le but va être de lancer l'image noyau correspondante. Le système est amorcé.

Il faut donc donner deux paramètres à Grub : l'emplacement de l'image à charger, et celui du initrd. Pour booter, Grub va alors copier en mémoire RAM le contenu du fichier initrd, en lui passant le chemin vers le fichier d'image à charger. Le initrd va ensuite lancer cette image.

Allons-y, bootons !

La première commande fondamentale, vous la connaissez sûrement : c'est le ls ! En tapant simplement ls dans le prompt s'affiche la liste des partitions reconnues par Grub. Vous obtenez quelque chose de la forme :


grub> ls
(hd0) (hd0, msdos1) (hd0, msdos2) (hd1) (hd1, msdos1) (hd1, msdos2)

Les noms peuvent légèrement différer chez vous. Nous voyons ici que nous avons deux disques (hd0) et (hd1), avec sur chaque disque deux partitions :

- (hd0, msdos1) et (hd0, msdos2) sur le disque (hd0)
- (hd1, msdos1) et (hd1, msdos2) sur le disque (hd1)

Il est possible aussi de faire un ls sur une partition, pour en voir le contenu :


grub> ls (hd1, msdos1)/
grub initramfs-linux-fallback.img initramfs-linux.img vmlinuz-linux

Encore une fois, les noms peuvent un peu différer. Notamment, il est possible que vous ayez plusieurs images en même temps. Dans mon cas, le fichier initrd se nomme initramfs-linux.img, et l'image du noyau est le fichier vmlinuz-linux.

Nous allons commencer par dire à grub sur quelle partition se trouvent les fichiers à charger. Pour cela, il faut affecter son nom à la variable root :


grub> root=(hd1,msdos1)

Ensuite, il faut spécifier le fichier du noyau à lancer. Cela se fait au moyen de la commande... linux ! Essayons :


grub> linux /vmlinuz-linux root=/dev/sdb2

Notez le paramètre root dans la ligne de commande, spécifiant au noyau linux quelle partition monter en /. Le nom de celle-ci suit cette fois-ci les conventions propres à Linux (donc /dev/sd*).

Enfin, il faut spécifier à Grub le chemin vers le fichier initrd à copier en mémoire RAM.


grub> initrd /initramfs-linux.img

Et à présent, le système peut démarrer.


grub> boot

Normalement, vous devriez voir votre noyau démarrer.

Et grub-rescue ?

Je préfère anticiper, et vous dire deux mots sur grub-rescue avant de voir arriver les questions en rafale ;-)

Grub est composé en fait de deux parties distinctes : le « pré-amorceur » (ce n'est pas le terme officiel) et le programme proprement dit. Le pré-amorceur se trouve sur les 512 premiers octets du disque dur (MBR), et ne doit donc pas dépasser cette taille. Ses fonctionnalités sont donc très limitées, et la plupart du temps, il se contente de charger le programme complet, qui se trouve sur la partition /boot du disque.

Cependant, il peut arriver parfois que le pré-amorceur ne trouve pas le programme complet, pour des raisons diverses (partition supprimée, ...). Dans ce cas, il passe en mode rescue, et propose un invite de commandes minimaliste. Ou plutot ultra minimaliste. Comprenez bien, vous n'avez que quatre commandes : le ls, set et unset, et insmod.

Vous comprenez alors aisément qu'il n'est pas possible de réaliser les manipulations décrites dans le grub-rescue. Et de toute façon, ce n'est pas sa vocation : son but est de pouvoir diagnostiquer pourquoi il n'est pas possible de charger le programme complet...

Commentaires