GRUB Multi-boot Mandriva 2009

Documentation
On trouve de la documentation sur GRUB aux adresses suivantes :
Sur le wiki de mandriva : http://wiki.mandriva.com/fr/Grub
Sur sa machine : /usr/share/doc/grub-doc
Sur sa console > info grub

GRUB : GRand Unified Bootloader
GRUB est le chargeur par défaut installé par Mandriva.
Le processus qui conduit de la mise sous tension de l'ordinateur jusqu'à l'apparition de l'écran de login de son gestionnaire de fenêtres préféré est une opération complexe (probablement la plus complexe de tout le fonctionnement de l'ordinateur) et met en branle de nombreuses étapes gérées par le BIOS, GRUB, les scripts d'init.
Toutes ces opérations agissent au plus près de la configuration matérielle, d'où sa difficulté.
Tout comme LILO, il y a avec GRUB un problème de vocabulaire.
En général, quand on parle de GRUB, on adresse le programme qui s'exécute automatiquement quand on allume son ordinateur.
Mais GRUB est plus que cela, c'est un programme qui s'exécute en ligne de commande et permet de manipuler le processus d'amorçage.

Partitionnement
Depuis l'acquisition de mon NAS, j'ai partitionné mes disques, en particulier celui qui accueille Linux pour y installer plusieurs versions, ce qui me permet d'installer une version 64 bit, une autre de 32 bits, une troisième pour faire des tests sur une nouvelle version. Toutes partagent le même /home .
En fonction des performances recherchées, j'utilise l'une ou l'autre.

partitions Linux

Le tableau suivant en donne les caractéristiques plus précises.
La colonne /dev/sda donne la numérotation des partitions pour fstab par exemple.
La colonne hd donne la numérotation pour GRUB.
A noter que la numérotation pour GRUB commence à 0 et que la première partition logique s'appelle toujours hd(0,4).

partitions Linux

Et mon disque Win$$$ avec XP :

partitions Win$$$

Programme d'amorçage 2009.1
Mandriva installe dans le dossier /boot les fichiers permettant à GRUB de charger le noyau (kernel) , soit:
config-2.6.29.1-desktop-4mnb et son lien symbolique config,
initrd-2.6.29.1-desktop-4mnb.img et son lien symbolique initrd.img,
kernel.h-2.6.29.1-desktop-4mnb et son lien symbolique kernel.h,
vmlinuz-2.6.29.1-desktop-4mnb et son lien symbolique vmlinuz,
etc...

Mandriva installe dans le dossier /boot/grub les fichiers de travail de GRUB, dont stage1, stage2 et menu.lst.
Mandriva installe dans le dossier /boot le fichier gfxmenu permettant à GRUB de démarrer en mode graphique.
Un système ne peut pas se charger si le MBR (Master Boot Record, càd le premier secteur de son disque) est vide.
Donc, l'installateur Mandriva va copier les fichiers stage 1 et suivants dans les premiers secteurs du disque et générer le fichier menu.lst avec les instructions pour que GRUB puisse continuer le chargement.

Exemple de fichier menu.lst, généré pour un système 2009.1, avec une racine L64 et /boot en hd(0,4):

timeout 30
default 0
color black/cyan yellow/cyan
gfxmenu (hd0,4)/gfxmenu

title Spring 2009-64
kernel (hd0,4)/vmlinuz BOOT_IMAGE=Spring_2009-64 root=UUID=81dddaa8-a35d-4218-ab42-12b257bc3fc7 splash=verbose resume=UUID=87e37347-05d6-4030-8f55-0ef2581ce929 vga=788
initrd (hd0,4)/initrd.img

title 64-linux-nonfb
kernel (hd0,4)/vmlinuz BOOT_IMAGE=64-linux-nonfb root=UUID=81dddaa8-a35d-4218-ab42-12b257bc3fc7 resume=UUID=87e37347-05d6-4030-8f55-0ef2581ce929
initrd (hd0,4)/initrd.img

title 64-failsafe
kernel (hd0,4)/vmlinuz BOOT_IMAGE=64-failsafe root=UUID=81dddaa8-a35d-4218-ab42-12b257bc3fc7 failsafe resume=UUID=87e37347-05d6-4030-8f55-0ef2581ce929
initrd (hd0,4)/initrd.img

title XP
root (hd1,0)
map (0x81) (0x80)
map (0x80) (0x81)
makeactive
chainloader +1

La directive timeout indique que GRUB attendra 30secondes avant de continuer son exécution.
La directive defaut indique que le système à charger au bout des 30 secondes est celui désigné par la première entrée.
Par défaut, GRUB affiche le menu des systèmes pouvant être chargés en mode texte, la directive color indique les couleurs des entrées du menu en mode normal et quand une entrée est sélectionnée.
La directive gfxmenu indique que le menu des systèmes pouvant être chargés est en mode graphique et que le fond d'écran se trouve sur la partition hd(0,4) soit sda5, dans l'archive gfxmenu.
Suivent les trois entrées générées par Mandriva pour le système Linux que l'on vient d'installer :
La directive title indique la chaîne de caractères qui apparaît dans le menu pour cette entrée.
la première entrée permet de charger le système nominal,
la deuxième entrée permet de démarrer le driver de la carte graphique sans « frame buffer »,
la troisième entrée permet de démarrer en mode dégradé.
Ces 3 entrées font toutes référence au même noyau (kernel) pointé par le lien symbolique vmlinuz.
La dernière entrée permet de charger un système non-Linux; il s'agit ici de Win$$$ XP qui est sur l'autre disque hd(1,0).
La directive chainloader +1 indique à GRUB d'aller charger le premier secteur du disque défini par les directives root et map.

Multi-boot
Dans l'exemple précédent, on voit plusieurs entrées vers des systèmes différents.
Quand j'ai voulu installer une version Mandriva 2009.1 en 32 bits et 64 bits sur les racines L32 et L64 avec une partition /boot commune, l'installateur a bien généré les systèmes mais en écrasant le contenu de /boot, car le noyau des 2 versions est le même.
Si j'avais installé une 2008.1 avec une 2009, il y aurait eu les fichiers correspondants aux 2 versions dans /boot. C'est le comportement que l'on observe lorsque « Mandriva update » fait la mise à jour du noyau avec une nouvelle version : on retrouve dans menu.lst une entrée avec chacun des noyaux.
Au fur et à mesure que l'on installe de nouveaux systèmes, le fichier menu.lst s'augmente de nouvelles entrées et l'on est jamais très sûr que l'on ne va pas le détruire accidentellement lors d'une installation.
Il est donc recommandé de garder une copie de ce fichier avant toute installation.
L'exemple du chargement de Win$$$ montre que GRUB peut effectuer le chargement de n'importe quel système avec la syntaxe simple :

title Nouveau Linux
root (hd0,x)
chainloader +1

où x indique la partition à charger.

GRUB généralisé
L'idée est donc d'avoir un bootloader fonction uniquement du partitionnement du disque, avec un GRUB général qui permet de charger n'importe quel système de chacune des partitions du disque.
Le fichier menu.lst devient donc :

# Démarrage automatique après 30 secs.
timeout 30
#Couleurs normal/selection du menu texte
color black/cyan yellow/cyan
#Démarrage en mode graphique
gfxmenu (hd0,4)/gfxmenu
# Démarrer par défaut, la première entrée.
default 0

# 1ère entrée : Mandriva 64 bits
title Linux 64bits
root (hd0,6)
# Chainage du chargeur GRUB depuis le premier secteur de la racine L64
chainloader +1

# 2ème entrée : Mandriva 32 bits
title Linux 32bits
root (hd0,0)
# Chainage du chargeur GRUB depuis le premier secteur de la racine L32
chainloader +1

# 3ème entrée : Mandriva version en test
title Linux Test
root (hd0,2)
# Chainage du chargeur GRUB depuis le premier secteur de la racine LTest
chainloader +1

# 4ème entrée : XP-SP3
title XP
root (hd1,0)
map (0x81) (0x80)
map (0x80) (0x81)
makeactive
# Chainage du chargeur XP depuis le premier secteur de la racine du deuxième disque
chainloader +1

Avec cette syntaxe, GRUB va charger le premier secteur de chaque partition. Il suffit maintenant de générer chaque système Linux en spécifiant d'installer le programme d'amorçage sur le premier secteur de la racine et non plus sur le MBR du disque.

amorçage GRUB

GRUB sur racine

Label de la racineracine

Entrées du GRUB local

Ce qui va générer le fichier /boot/grub/menu.lst sur sda7 :

timeout 30
color black/cyan yellow/cyan
gfxmenu (hd0,6)/boot/gfxmenu
default 0

title L64 Mandriva 2009 Spring
kernel (hd0,6)/boot/vmlinuz BOOT_IMAGE=L64_Mandriva_2009_Spring root=UUID=81dddaa8-a35d-4218-ab42-12b257bc3fc7  resume=UUID=87e37347-05d6-4030-8f55-0ef2581ce929 splash=verbose vga=788
initrd (hd0,6)/boot/initrd.img

title L64-nonfb
kernel (hd0,6)/boot/vmlinuz BOOT_IMAGE=L64-nonfb root=UUID=81dddaa8-a35d-4218-ab42-12b257bc3fc7  resume=UUID=87e37347-05d6-4030-8f55-0ef2581ce929
initrd (hd0,6)/boot/initrd.img

title L64-failsafe
kernel (hd0,6)/boot/vmlinuz BOOT_IMAGE=L64-failsafe root=UUID=81dddaa8-a35d-4218-ab42-12b257bc3fc7  failsafe
initrd (hd0,6)/boot/initrd.img

title XP
root (hd1,0)
map (0x81) (0x80)
map (0x80) (0x81)
makeactive
chainloader +1

title Retour
root (hd0,4)
configfile /grub/menu.lst

Cette dernière entrée permet de revenir au menu principal.

Résultat
Menu général:

GRUB menu général

Menu d'un système Linux 64bits installé dans la partition L64:

GRUB smenu du système généré

Marche à suivre
1) Partitionner son disque selon le nombre de systèmes que l'on souhaite installer.
Réserver une toute petite partition de quelque Mo pour abriter le dossier /boot/grub du menu général.
Dans mon exemple précédent, il s'agit de la partition BOOT, sda5 ou hd(0,4).

2) Initialiser GRUB sur le MBR du disque 0
La méthode la plus simple est de générer un système simple (GNOME) en installant le programme d'amorçage sur le MBR. C'est généralement la situation dans laquelle on se trouve.
Sinon, installer par ligne de commande (non testé) :
su
grub
> root hd(0,0)
> setup (hd0)

Se référer au manuel de GRUB pour plus de détail.

3) Initialiser menu.lst du menu général pour le disque 0
Si l'on a pris soin de spécifier la partition BOOT comme devant être /boot, à l'étape précédente, c'est déjà fait!
Ainsi l'installateur Mandriva va installer tous les fichiers nécessaires au chargement dans cette partition.
Il ne reste plus qu'à remplacer le menus.lst par celui décrit plus haut (avec des chainloader +1).
Maintenant on peut supprimer tous les fichiers installés dans /boot sauf gfxmenu et le répertoire grub.

4) Générer tous les systèmes
En respectant bien la procédure d'installation de GRUB dans le premier secteur de la racine.

Modification du fond d'écran du menu général
Avec la procédure ci-dessus, on recopie le fichier gfxmenu de la version 2009.1 dans la partition BOOT du ménu général. Ce fichier n'a pas à être modifié tant que le partitionnement du disque ne change pas.
On va donc conserver le même fond d'écran 2009 ad vitam aeternam, alors que les splashscreen des versions installées dans leurs partitions effectives vont évoluer au fil du temps.
Pour ceux qui voudraient personnaliser le fond d'écran du menu général, la procédure est décrite dans le wiki de Mandriva.
Grosso modo, faire en tant que root :
En adaptant le chemin en fonction de votre installation :

Décompresser l'archive :

cpio -i < /chemin vers/gfxmenu

changer l'image "back.jpg" par une autre (même format et dimensions) et de reconstruire l'archive :

ls | cpio -o > /chemin vers/gfxmenu

menu_général_custom

Il est pas beau mon petit pingouin?? Indépendant de tout fournisseur !! Mais il en tient un au coin de l'oeil.... avec une tapette !!

Avantages et inconvénients
Avantages :
On ne touche plus jamais au MBR du disque.
Chaque système est complètement indépendant des autres.

Inconvénients :
On passe par 2 menus pour charger un système.

A chacun de voir si ça vaut la manip....Pour moi, c'est déjà sur mon disque !!

Cet article a fait l'objet d'une ré-écriture dans le wiki de Mandriva.