Vous êtes sur la page 1sur 8

Le chargeur GRUB2

Introduction
Le projet GRUB2 n'est pas une continuité du projet GRUB, dit « Legacy » mais le développement
d'un nouveau produit. Il vise à une plus grande portabilité sur de nombreuses architectures
matérielles.

Le fichier exécuté au boot du système et qui configure GRUB s'appelle maintenant grub.cfg.

Source : http://grub.enbug.org/grub.cfg.fr
Au chargement de GRUB 2, le fichier grub.cfg est lu. Celui-ci contient toutes les informations
pour que GRUB 2 agisse tel que l'utilisateur le souhaite et construise un menu de chargement.
GRUB 2 utilise un nouveau langage de script, semblable à Bash, afin de générer ce fichier de menu.
Éditer manuellement ce fichier est inutile et non recommandé : il est entièrement reconstruit à
l'aide de plusieurs scripts à chaque exécution de update-grub2 ou de grub-mkconfig. Pour
modifier grub.cfg, modifiez les scripts de génération situés dans le dossier /etc/grub.d ou
les options de GRUB 2 dans /etc/default/grub.
Utilisez les commandes update-grub2 ou grub-mkconfig pour regénérer le menu de GRUB
2 après chaque modification des fichiers de configuration.

Construction du fichier grub.cfg


Le fichier grub.cfg est toujours localisé dans /boot/grub.
La commande grub-mkconfig produit le fichier de configuration grub.cfg.
La comande update-grub régénère après modification de la configuration.

Extrait du fichier grub.cfg


Vous constatez que si cela n'est pas du shell bash, cela y ressemble beaucoup.
#
# DO NOT EDIT THIS FILE
#
# It is automatically generated by /usr/sbin/grub-mkconfig
using templates
# from /etc/grub.d and settings from /etc/default/grub
#
### BEGIN /etc/grub.d/00_header ###
if [ -s $prefix/grubenv ]; then
load_env
fi
set default="0"
if [ ${prev_saved_entry} ]; then
set saved_entry=${prev_saved_entry}
save_env saved_entry
set prev_saved_entry=
save_env prev_saved_entry

Page 1
Le chargeur GRUB2

set boot_once=true
fi

Le fichier /etc/default/grub

Il contient des définitions de variables dont nous devinons aisément qu'elles correspondent aux
anciennes directives globales du fichier menu.lst (« grub.conf »).

# If you change this file, run 'update-grub' afterwards to


update
# /boot/grub/grub.cfg.
GRUB_DEFAULT=0
#GRUB_HIDDEN_TIMEOUT=0
GRUB_HIDDEN_TIMEOUT_QUIET=true
GRUB_TIMEOUT=10
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo
Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""
# Uncomment to disable graphical terminal (grub-pc only)
#GRUB_TERMINAL=console
# The resolution used on graphical terminal
# note that you can use only modes which your graphic card
supports via VBE
# you can see them in real GRUB with the command `vbeinfo'
#GRUB_GFXMODE=640x480
# Uncomment if you don't want GRUB to pass "root=UUID=xxx"
parameter to Linux
#GRUB_DISABLE_LINUX_UUID=true
# Uncomment to disable generation of recovery mode menu
entries
#GRUB_DISABLE_LINUX_RECOVERY="true"
# Uncomment to get a beep at grub start
#GRUB_INIT_TUNE="480 440 1"

Variable Définition
GRUB_DEFAULT Le système qu'il faut charger par défaut. Cela peut être
un nombre, la ligne nommant le système ("ligne
complète") ou "saved" pour charger le dernier système
chargé correctement par grub2.
GRUB_HIDDEN_TIMEOUT Ce paramètre permet de dire combien de temps l'écran
reste sans que le menu soit affiché. Dans cet intervalle,
l'utilisateur peut appuyer sur n'importe quelle touche
pour faire apparaître le menu. Cette option n'est valide

Page 2
Le chargeur GRUB2

que si l'ordinateur n'abrite qu'un seul OS.


GRUB_HIDDEN_TIMEOUT_QUIET Si cette variable est à true, l'écran affiché par l'écran
précédent reste vierge, sinon un compteur est affiché.
GRUB_TIMEOUT Définit un timeout si l'option
« GRUB_HIDDEN_TIMEOUT » est désactivée. La
valeur -1 signifie pas de timeout. L'utilisateur doit
valider son choix.
GRUB_DISTRIBUTOR Cette variable permet de définir la forme des lignes de
menu concernant votre distribution Linux. Rappelons
la sortie standard de la commande lsb.
$ lsb_release -i -s 2> /dev/null || echo Debian
Ubuntu
GRUB_CMDLINE_LINUX_DEFAULT Ces deux variables permettent de définir des
GRUB_CMDLINE_LINUX paramètres du noyau comme le permettait la directive
kernel de GRUB Legacy.
GRUB_TERMINAL Cette clause désactive le mode graphique.
GRUB_GFXMODE Cette clause définit la résolution graphique de la
console.
GRUB_DISABLE_LINUX_UUID Cette clause permet de ne pas passer le paramètre
root=UUID=xxx au noyau. Rappelons que ce
paramètre qui existe sur la ligne kernel de GRUB
Legacy définit le « root file system » de Linux.
GRUB_DISABLE_LINUX_RECOVERY Cette clause empèche la génération des lignes
« Recovery » dans le menu de démarrage de Grub.
GRUB_INIT_TUNE Cette clause active un « beep » avant l'affichage du
menu.

Le répertoire /etc/grub.d
Le répertoire /etc/grub.d contient des scripts qui peuvent être personnalisés par l'administrateur pour
ajouter de nouvelles entrées au menu proposé par GRUB. Les scripts sont exécutés dans l'ordre de
leur numérotation. La commande update-grub doit être exécutée après que ce répertoire ait été
modifié.
$ ls
00_header 10_linux 30_os-prober README
05_debian_theme 20_memtest86+ 40_custom

Les scripts sont exécutés dans l'ordre de leur numérotation.

00_header positionne les paramètres de GRUB2 comme le terminal et les valeurs définis dans
/etc/default/grub.

05_debian_theme charge la « splash image », la couleur du texte.

10_linux recherche les systèmes Linux installés. il utilise pour cela le répertoire /boot qui contient

Page 3
Le chargeur GRUB2

les noyaux. Pour ne plus proposer un noyau, il faut le retirer de /boot.


Pour réaliser cette opération, il faut utiliser la commande qui retire le paquet correspondant au
noyau que vous souhaitez supprimer. L'exemple suivant est réalisé sur Ubuntu 10.04.

# dpkg -l

ii linux-image-2.6.32-24-generic 2.6.32-24.43
Linux kernel image for version 2.6.32 on x86
ii linux-image-2.6.32-25-generic 2.6.32-25.45
Linux kernel image for version 2.6.32 on x86

# apt-get remove linux-image-2.6.32-24-generic
depmod........

DKMS: uninstall Completed.
Running postrm hook script /usr/sbin/update-grub.
Generating grub.cfg ...
Found linux image: /boot/vmlinuz-2.6.32-25-generic
Found initrd image: /boot/initrd.img-2.6.32-25-generic
Found memtest86+ image: /memtest86+.bin
Found Windows Recovery Environment (loader) on /dev/sda2
done
The link /vmlinuz.old is a damaged link
Removing symbolic link vmlinuz.old
you may need to re-run your boot loader[grub]
The link /initrd.img.old is a damaged link
Removing symbolic link initrd.img.old
you may need to re-run your boot loader[grub]

20_memtest86+ recherche le fichier /boot/memtest86+ et l'inclut automatiquement dans le menu. Il


n'y a pas de variable prévue das /etc/default/grub pour l'inhiber. La solution proposée est de retirer
le droit d'endossement au script et,bien entendu, d'exécuter update-grub.

30_os-prober recherche les systèmes d'exploitation, dont Windows, en appelant la commande


os-prober.

40_custom
Dans la distribution Ubuntu, le script 40_custom permet d'ajouter des entrées dans le menu de
GRUB.

$ cat 40_custom
#!/bin/sh
exec tail -n +3 $0
# This file provides an easy way to add custom menu entries.
Simply type the
# menu entries you want to add after this comment. Be careful

Page 4
Le chargeur GRUB2

not to change
# the 'exec tail' line above.
La structure d'une entrée à ajouter dans le fichier 40_custom est de la forme :

menuentry "titre de l'entrée (ancien title)" {


directives de chargement de l'OS
}
Parmi les directives, nous pouvons en mentionner quelques unes qui reprennent ce à quoi nous
étions habitués dans GRUB Legacy.
GRUB 2 GRUB Legacy
set root=(hdx,y)1 root=(hdx,y-1)
linux kernel
initrd initrd

On trouve toujours chainloader, typiquement utilisée pour booter Windows.

Quelques exemples tirés de la documentation de GRUB2

A sample entry copied from the grub.cfg and altered by the user might look like this:
menuentry "My Default Karmic" {
set root=(hd0,1)
search --no-floppy --fs-uuid --set cb201140-52f8-4449-9a95-749b27b58ce8
linux /boot/vmlinuz-2.6.31-11-generic root=UUID=cb201140-52f8-4449-9a95-
749b27b58ce8 ro quiet splash
initrd /boot/initrd.img-2.6.31-11-generic
}

A sample entry for a hard drive version of SystemRescueCD installed per the instructions on the
web site (on sda8).
menuentry "System Rescue CD" {
set root=(hd0,8)
linux /sysrcd/rescuecd subdir=sysrcd setkmap=us
initrd /sysrcd/initram.igz
}
A sample entry for chainloading to another GRUB bootloader.
menuentry "Grub 1 Bootloader" {
set root=(hd0,8)
chainloader +1
}
Le tableau qui suit présente la totalité des directives possibles dans un menu défini par menuentry. Il
est accessible sur :
http://www.gnu.org/software/grub/manual/html_node/Command_002dline-and-menu-entry-
commands.html#Command_002dline-and-menu-entry-commands

1 Dans GRUB2, la numérotation des disques commencent toujours à 0 mais celles des partitions démarre maintenant à
1.

Page 5
Le chargeur GRUB2

* acpi: Load ACPI tables


* badram: Filter out bad regions of RAM
* blocklist: Print a block list
* boot: Start up your operating system
* cat: Show the contents of a file
* chainloader: Chain-load another boot loader
* cmp: Compare two files
* configfile: Load a configuration file
* cpuid: Check for CPU features
* crc: Calculate CRC32 checksums
* date: Display or set current date and time
* drivemap: Map a drive to another
* echo: Display a line of text
* export: Export an environment variable
* gettext: Translate a string
* gptsync: Fill an MBR based on GPT entries
* halt: Shut down your computer
* help: Show help messages
* initrd: Load a Linux initrd
* initrd16: Load a Linux initrd (16-bit mode)
* insmod: Insert a module
* keystatus: Check key modifier status
* linux: Load a Linux kernel
* linux16: Load a Linux kernel (16-bit mode)
* ls: List devices or files
* parttool: Modify partition table entries
* password: Set a clear-text password
* password_pbkdf2: Set a hashed password
* play: Play a tune
* pxe_unload: Unload the PXE environment
* reboot: Reboot your computer
* search: Search devices by file, label, or UUID
* sendkey: Emulate keystrokes
* set: Set an environment variable
* unset: Unset an environment variable
* uppermem: Set the upper memory size

Outre celles déjà rencontrées (linux, initrd, set), nous noterons particulièrement :
insmod Cette commande permet de charger l'un des nombreux modules du répertoire
/boot/grub.
$ ls *mod
915resolution.mod cmp.mod
gcry_arcfour.mod gfxterm.mod ls.mod
part_sun.mod search_label.mod usbms.mod

password_pbkdf2 Cette commande permet d'associer un mot de passe à un utilisateur.


password_pbkdf2 utilisateur mot de passe

Page 6
Le chargeur GRUB2

Il faut préalablement créer les noms d'utilisateur pour lesquels vous allez créer le
mot de passe. Cela se fait avec la commande set superusers="user1" (cf. ajout
d'un mot de passe dans un menu).

C'est la commande grub-mkpasswd-pbkdf2 qui génère le mot de passe.


# grub-mkpasswd-pbkdf2
Enter password:
Reenter password:
Your PBKDF2 is
grub.pbkdf2.sha512.10000.E9C5C0818881D3C983D834595D45D2AEE3
422200994C59E4CF716B2C53FC7765BEAB0295900BB1F0CF2FAF3F
04D9D0E4396E483AFEE47DA09EA0AB052D3ED6B2.CBF335AD5CC
C7A166AB24E7E40E2AA93C6396B3359C1769557981647ECD318BD7
F8F1ED78961487E812C3B7D2AD2778099DF8C0BDF296B18338217B
34ADAFC2E

search Vette commande recherche un périphérique par son nom, son label ou son
UUID.

Ajout d'une entrée dans le fichier 40_custom


Le fichier 40_custom a été modifié pour ajouter une entrée permettant de booter le système Ubuntu
d'une clé bootable. Il est nécessaire de dire, par souci de simplicité, que si vous exécutez la
commande update-grub après avoir branché votre clé, le script 10_linux fait le nécessaire car il
détecte le système installé sur la clé.

menuentry "Ubuntu sur clef bootable" {


insmod ext2
set root=(hd1,2)
search --no-floppy --fs-uuid --set 25b1b64d-f1cb-47cf-9ae3-
e0578d177319
linux /boot/vmlinuz-2.6.32-25-generic root=UUID=25b1b64d-f1cb-
47cf-9ae3-e0578d177319 ro quiet splash
initrd /boot/initrd.img-2.6.32-25-generic
}

# update-grub
Generating grub.cfg ...
Found linux image: /boot/vmlinuz-2.6.32-25-generic
Found initrd image: /boot/initrd.img-2.6.32-25-generic
Found memtest86+ image: /memtest86+.bin
Found Windows Recovery Environment (loader) on /dev/sda2
done

Page 7
Le chargeur GRUB2

Ajout d'un mot de passe dans un menu

# cat /etc/grub.d/40_custom
#!/bin/sh
exec tail -n +3 $0
# This file provides an easy way to add custom menu entries.
Simply type the
# menu entries you want to add after this comment. Be careful
not to change
# the 'exec tail' line above.
set superusers="gilles"
password_pbkdf2 gilles
grub.pbkdf2.sha512.10000.E9C5C0818881D3C983D834595D45D2AEE3422
200994C59E4CF716B2C53FC7765BEAB0295900BB1F0CF2FAF3F04D9D0E4396
E483AFEE47DA09EA0AB052D3ED6B2.CBF335AD5CCC7A166AB24E7E40E2AA93
C6396B3359C1769557981647ECD318BD7F8F1ED78961487E812C3B7D2AD277
8099DF8C0BDF296B18338217B34ADAFC2E
menuentry "Ubuntu sur clef bootable" {
insmod ext2
set root=(hd1,2)
search --no-floppy --fs-uuid --set 25b1b64d-f1cb-47cf-9ae3-
e0578d177319
linux /boot/vmlinuz-2.6.32-25-generic root=UUID=25b1b64d-f1cb-
47cf-9ae3-e0578d177319 ro quiet splash
initrd /boot/initrd.img-2.6.32-25-generic
}
Comme dans GRUB Legacy, il n'est possible d'entrer en mode édition pendant le boot qu'après
avoir saisi le nom et le mot de passe défini par set superusers et password_pbkdf2.
Sur l'écran apparaît :
Saisir le nom de l 'utilisateur :
gilles
Saisir le mot de passe :
xxxxx

Références
http://doc.ubuntu-fr.org/grub2
https://help.ubuntu.com/community/Grub2
http://www.gnu.org/software/grub/
https://wiki.ubuntu.com/Grub2
http://www.gnu.org/software/grub/manual/html_node/

Page 8

Vous aimerez peut-être aussi