Grub2 - Personnalisation Phase 2

La personnalisation de Grub concerne :

Note : Le terme "entrée de menu " ou "entrée" désigne le système d'exploitation à lancer.

Avant toute modification de Grub, il est recommandé de sauvegarder ses fichiers critiques et de savoir redémarrer un système sur lequel Grub n'est plus fonctionnel. Tester les solutions décrites sur une machine virtuelle avant de les mettre en œuvre sur un système réel est également une très bonne idée.

1 - Principe

Les modifications peuvent être introduites de plusieurs façons  

  • 00_header : sélection du mode d'affichage et de la fonte

  • 05_theme : couleur du texte

  • 10_linux : génération des entrées correspondant au linux utilisé sur la partition courante

  • 30_os-prober : recherche des systèmes d'exploitation sur le système et génération des entrées correspondantes

  • 40_custom : modèle de fichier utilisé pour inclure des lignes dans le fichier de configuration final "grub.cfg"

Les personnalisations décrites ci-dessus sont applicables séparément ou simultanément.

2 - Présentation

2.1 - Mode d'affichage

Par défaut, le mode et la résolution de l'affichage sont définis automatiquement pendant le démarrage de grub. Le mode graphique VESA est le mode par défaut. En cas d'échec, l'affichage s'effectue en mode texte VGA.

2.1.1 Affichage en mode texte

Pour forcer le mode texte, dans le fichier /etc/default/grub, décommenter la ligne

#GRUB_TERMINAL=console

2.1.2 Affichage en mode graphique

Pour connaitre la résolution utilisée et les résolutions disponibles, ouvrir une console grub (voir grub-ligne de commande ). Redémarrer le système et lorsque le menu se présente : taper c pour accéder à la console.

Dans la console, saisir

set pager=1
vbeinfo

Une étoile indique la ligne correspondant à la résolution courante : 

.....
* 0x142 640 x 480 x 32 (2560) Couleur directe, masque : 8/8/8/8
.....

Dans le cas présent (virtualbox), la résolution est de 640 x 480 x 32, mais il est possible de choisir une des autres résolutions affichées, par exemple : 1280x1024x24.

Pour cela,

nano /etc/default/grub.cfg 
GRUB_GFXMODE=1280x1024x24
# update-grub
$ cat /boot/grub/grub.cfg |grep "set gfxmode"
set gfxmode=1280x1024x24

Redémarrer pour visualiser le changement de résolution.

Pour revenir au mode automatique, commenter à nouveau la ligne GRUB_GFXMODE dans le fichier /etc/default/grub et remettre à jour grub.cfg avec update-grub.

2.2 - Image de fond

Il est possible d'afficher une image de fond dans le menu Grub sous réserve que le mode graphique soit activé (voir ci-dessus).

Sur Jessie,  l'image de fond par défaut est :

/usr/share/images/desktop-base/lines-grub.png

Pour changer l'image de fond, plusieurs méthodes sont possibles. L'une d'entre elles consiste à placer l'image souhaitée dans le répertoire /boot/grub. Lors de la mise à jour du fichier grub.cfg par la commande update-grub, cette image sera prise en priorité et remplacera l'image par défaut. Le nom du fichier est libre, l'extension doit correspondre au format de l'image. Les formats acceptés sont entre autres jpeg et png. Grub assurant la mise à l'échelle de l'image, il n'est pas nécessaire d'adapter la résolution de l'image à celle de l'écran.

Mettre en place l'image :

# mv mon_image.png /boot/grub/splash.png 

Puis mettre à jour grub.cfg :

# update-grub

On peut vérifier que l'image a bien été prise en compte :

$ cat /boot/grub/grub.cfg |grep background_image
if background_image /boot/grub/splash.png; then

L'instruction background_image charge l'image souhaitée : /boot/grub/splash.png qui apparaîtra en fond d'écran au prochain redémarrage.

2.3 - Fonte

unicode est la fonte par défaut. Pour utiliser une nouvelle fonte, il faut au préalable la convertir dans le format pf2, puis la référencer dans le fichier /etc/default/grub.

La commande grub-mkfont permet d'effectuer la conversion. Dans l'exemple ci-dessous, la fonte DroidSerif-BoldItalic.ttf est convertie au format pf2, taille 12. Le nom et la destination de la fonte sont libres. Ne pas tenir compte des avertissements affichés (....inconnue ...)

# grub-mkfont --output=/boot/grub/ma_fonte.pf2 --size=12 /usr/share/fonts/truetype/droid/DroidSerif-BoldItalic.ttf 
fonctionnalité gsub 0x63636d70 inconnue (ccmp)
fonctionnalité gsub 0x63636d70 inconnue (ccmp)
fonctionnalité gsub 0x63636d70 inconnue (ccmp)

Ouvrir le fichier /etc/default/grub :

# nano /etc/default/grub

et y ajouter la ligne suivante

GRUB_FONT=/boot/grub/fonts/ma_fonte.pf2

où /boot/grub/fonts/ma_fonte.pf2 est l'emplacement de la fonte créée précédemment.

Mettre à jour grub.cfg :

# aptitude update

Vérifier si souhaité la bonne prise en compte de la fonte dans le fichier :

$ cat /boot/grub/grub.cfg |grep loadfont
if loadfont /boot/grub/fonts/ma_fonte.pf2 ; then

et redémarrer la machine pour visualiser le résultat.

Pour revenir à la fonte initiale, commenter la ligne GRUB_FONT dans le ficher /etc/default/grub, et remettre à jour grub.cfg avec update-grub.

2.4 - Couleurs du texte

2.4.1 - Principe

Les couleurs sont redéfinissables, avec les commandes :

set color_normal=couleur/couleur_fond 
set menu_color_normal=couleur/couleur_fond
set menu_color_highlight=couleur/couleur_fond

dans lesquelles couleur désigne la couleur du texte et couleur_fond désigne la couleur du fond. Par convention, la couleur de fond "black" indique l'absence de couleur (transparence).

La liste des couleurs supportées par grub est :

black
blue
brown
cyan
dark-gray
green
light-cyan
light-blue
light-green
light-gray
light-magenta
light-red
magenta
red
white
yellow

2.4.2 Test

Pour tester les différentes combinaisons, rebooter, lors de l'affichage du menu, ouvrir une console grub en tapant c et utiliser les commandes précédentes. Par exemple :

grub >set menu_color_normal=blue/black
grub >set menu_color_highlight=black/white

2.4.3 Intégration dans le fichier grub.cfg

Les commandes de définition de couleur doivent être intégrées dans le fichier de configuration grub.cfg. Deux possibilités : 

Créer un fichier 05_debian_theme_custom à partir du fichier exemple 40_custom et y intégrer les lignes de commandes, l'objectif étant d'obtenir un fichier du type :

$ cat /etc/grub.d/05_debian_theme_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.

# Couleur du texte de la console
set color_normal=black/black

# Couleurs du texte des entrées
set menu_color_normal=blue/black
set menu_color_highlight=black/white

Vérifier l'intégration dans grub.cfg

$ cat /boot/grub/grub.cfg |grep menu_color
  set menu_color_normal=cyan/blue
  set menu_color_highlight=white/blue
set color_normal=black/black
set menu_color_normal=blue/black set menu_color_highlight=black/white

Les deux premières lignes correspondent à la définition du thème par défaut. Les  lignes suivantes correspondent aux couleurs souhaitées et prendront le pas sur les précédentes.

2.5 - Changement de disposition du clavier

Par défaut, la disposition du clavier, dans la console grub, est qwerty. La méthode décrite ci-dessous permet de modifier la disposition du clavier pendant la phase 2 de grub.

# mkdir /boot/grub/layouts
# grub-kbdcomp -o /boot/grub/layouts/FR.gkb fr
# echo "GRUB_TERMINAL_INPUT=at_keyboard" >>/etc/default/grub
# cat <<EOF>>/etc/grub.d/40_custom
insmod keylayouts
keymap FR
EOF
# update-grub

Le clavier de la console grub sera directement en français.

Limitations :

La modification de la disposition du clavier n'interviendra que si le répertoire grub est accessible, ce qui n'est pas le cas pendant la phase 1 de grub, par exemple, lors de la demande du mot de passe lorsque la partition de boot est chiffrée. Dans ce cas, il faudra embarquer les modifications ci-dessus dans l'image grub : voir Grub2 - Personnalisation Phase 1

3 - Lancement des entrées

Par défaut, Grub se positionne sur la première entrée et, si l'utilisateur n'a pas d'action sur le clavier, la lance automatiquement après 5 secondes, 

3.1 - Temps d'attente

Pour modifier la valeur du temps d'attente avant le lancement automatique, changer, dans le fichier /etc/default/grub, la valeur du paramètre

GRUB_TIMEOUT=5

Puis mettre à jour le fichier grub.cfg avec update-grub.

Note : Si la valeur est négative, le lancement automatique n'a pas lieu et le menu reste affiché jusqu'à ce que l'opérateur valide une entrée.

La valeur choisie apparaît dans le fichier grub.cfg :

# cat /boot/grub/grub.cfg |grep "set timeout="
set timeout=-1
set timeout=4
set timeout=4

3.2 - Sélection de la dernière ligne utilisée

Pour que Grub mémorise la dernière entrée utilisée et la sélectionne au démarrage suivant, ajouter / remplacer dans le fichier /etc/default/grub les lignes suivantes :

GRUB_DEFAULT=saved
GRUB_SAVEDEFAULT=true

Mettre à jour grub.cfg

# update-grub

Les lignes du menu suivies de la commande "savedefault" seront mémorisées : 

$ cat /boot/grub/grub.cfg |grep -A1 "menuentry "
menuentry 'Debian GNU/Linux' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-01b8371d-5c59-4bfb-8316-6ad493618513' {
savedefault
--
menuentry 'Debian GNU/Linux, avec Linux 3.16.0-4-amd64' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.16.0-4-amd64-advanced-01b8371d-5c59-4bfb-8316-6ad493618513' {
savedefault
--
menuentry 'Debian GNU/Linux, with Linux 3.16.0-4-amd64 (recovery mode)' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.16.0-4-amd64-recovery-01b8371d-5c59-4bfb-8316-6ad493618513' {
load_video

Après redémarrage, on peut vérifier que la dernière entrée est stockée dans le fichier grubenv :

$ cat /boot/grub/grubenv |head -2
# GRUB Environment Block
saved_entry=gnulinux-simple-01b8371d-5c59-4bfb-8316-6ad493618513

4 - Affichage et contenu des entrées

4.1 - Entrées générées par /etc/grub.d/10_linux

Le script /etc/grub.d/10_linux génère les entrées correspondant aux noyaux linux installés sur la partition courante. Ce script est activé lors de la mise à jour du fichier grub.cfg par la commande update-grub. Par défaut, un système de sous-menu et une entrée recovery sont générés.

4.1.1 Affichage console linux

Voir Affichage console.

4.1.2 Suppression sous-menu

Pour supprimer la génération du sous-menu, éditer le fichier /etc/default/grub et ajouter la ligne :

GRUB_DISABLE_SUBMENU="y"

Noter que les valeurs true ou yes ou y sans guillemets ne fonctionnent pas!

4.1.3 Suppression menu de secours

Pour supprimer la génération du menu de secours, (obtenu à partir du menu standard en remplaçant dans la ligne vmlinuz "ro quiet" par "ro single"), éditer le fichier /etc/default/grub et décommenter la ligne

GRUB_DISABLE_RECOVERY="true"

4.1.4 Suppression 10_linux

Pour empêcher la génération des entrées linux de la partition courante, ôter au script 10_linux les droits d'exécution :

# chmod -x /etc/grub.d/10_linux 

4.2 - Entrées générées par /etc/grub.d/30_os-prober

Le script /etc/grub.d/30_os-prober recherche les systèmes d'exploitation et les fichiers de configuration grub.cfg présents sur le système et génère les lignes de menu correspondantes. Lorsque Grub est installé sur plusieurs partitions, il en résulte un menu à plusieurs niveaux avec des entrées redondantes.

4.2.1 Suppression des entrées redondantes

Pour éviter les entrées redondantes, il suffit de ne conserver la fonction os-prober que sur une seule partition, celle sur laquelle se trouve le grub utilisé lors du boot. Pour supprimer la fonction os-prober sur les autres partitions : se rendre sur chacune de ces partitions, éditer le fichier /etc/default/grub et y ajouter la ligne :

GRUB_DISABLE_OS_PROBER=true

Régénérer dans chaque partition le fichier grub.cfg correspondant avec update-grub. Lorsque toutes les partitions ont été traitées, revenir à la partition initiale et générer le grub.cfg final.

4.2.2 Suppression des différents niveaux

os_prober chaîne les fichiers grub.cfg trouvés dans les autres partitions. Si cet effet n'est pas souhaité, il suffit  de supprimer les fichiers grub.cfg des autres partitions, après avoir vérifié que cela ne pose pas de problème de lancement (Il n'est plus possible de personnaliser les entrées correspondantes). grub n'est alors plus nécessaire et peut être désinstallé.

4.3 - Entrées personnalisées générées par /etc.grub.d/40_custom

Le script 40_custom donne la possibilité de maîtriser totalement les entrées (ordre des lignes, intitulé, contenu, ..), soit en complément, soit en remplacement de celles générées par 10_linux et 30_os-prober. Il suffit d'y inclure les entrées telles qu'elles doivent apparaitre dans le menu grub.cfg.

Dans l'exemple fictif ci-dessous, 5 entrées sont prévues : 
  1. Debian, en utilisant les liens vmlinuz et initird.img à la racine de la partition
  2. Windows XP, en utilisant la fonction de chaînage
  3. Windows 7, en utilisant la fonction de chaînage
  4. un iso installateur debian, en utilisant un noyau et une image situés en /media-hd/
  5. un chaînage vers un fichier grub.cfg situé sur une autre partition
Les entrées 1,2 et 3 sont mémorisées (fonction GRUB_SAVEDEFAULT). Si une entrée ne doit pas être mémorisée, commenter la ligne "savedefault" correspondante.

Les noms et numéros de partition sont arbitraires et doivent être adaptés à la situation.

# Entrée 1 - Linux Debian sur partition 2, label "jessie"

menuentry "Linux Debian Jessie" {
savedefault
insmod ext2
insmod part_msdos
search --set=root --label jessie --hint hd0,msdos2
echo "chargement de linux"
linux /vmlinuz set root=LABEL=jessie ro quiet
echo "chargement de initrd.img"
initrd /initrd.img
}

# Entrée 2 - Windows XP sur partition 3, label "windows_xp"

menuentry "Windows XP" { savedefault
insmod ntfs
insmod part_msdos
search --set=root --label windows_xp --hint hd0,msdos3 ntldr /ntldr
# Note : ntldr /ntldr peut-être remplacé par chainloader +1
}
# Entrée 3 - Windows 7 sur partition 4, label "windows_7"

menuentry "Windows 7" { savedefault
insmod ntfs insmod part_msdos
search --set=root --label windows_7 --hint hd0,msdos4 ntldr /bootmgr
# Note : ntldr /bootmgr peut-être remplacé par chainloader +1
}

# Entrée 4 - Installateur Jessie sur partition 1, label "grub"

menuentry "Debian Jessie installer" { search --set=root --label grub --hint hd0,msdos1 linux /hd-media/vmlinuz initrd /hd-media/initrd.gz }

# Entrée 5 - Fichier configuration grub sur partition 8, label "OS1"

menuentry "OS using grub2" { insmod xfs search --set=root --label OS1 --hint hd0,msdos8 configfile /boot/grub/grub.cfg }

Pour utiliser les identifiants de partition type UUID, à la place des étiquettes de partition, remplacer

Pour utiliser les identifiants de partition type "device " de grub et linux, utiliser

5 - Partition de boot chiffrée

Lorsque le boot se situe sur une partition chiffrée, ajouter dans /etc/default/grub

GRUB_ENABLE_CRYPTODISK=y

Puis mettre à jour grub.cfg :

# update-grub

Annexes

1 - Exemple de fichier /etc/grub.d/05_debian_theme_custom

Le fichier est téléchargeable ici. Le modifier en fonction des besoins, puis le rendre exécutable et donner les droits "root", avant de le déplacer dans le dossier /etc/default.grub.d/. Terminer en mettant grub à jour :

# chmod +751 40_custom
# chown root:root 40_custom
# cp /etc/grub.d/40_custom /etc/grub.d/40_custom.BU
# mv 40_custom /etc/grub.d/
# update-grub

2 - Exemple de fichier/etc/grub.d/40_custom

Le fichier 40_custom avec le contenu défini plus haut est disponible ici. Après l'avoir téléchargé et adapté, le rendre exécutable et donner les droits "root", avant de le déplacer dans le dossier /etc/default.grub.d, comme indiqué plus haut (05_debian_theme_custom).

3 - Exemple de fichier /etc/default/grub

Ce fichier est téléchargeable ici. Le modifier en tant que de besoin, lui donner les droits "root", avant de le déplacer dans le dossier /etc/default/, terminer en mettant grub à jour (voir ci-dessus) (inutile de rendre le fichier exécutable).

4 - Liste de paramètres reconnus dans /etc/default/grub

$ grep "export GRUB"  -B2 -A40 /usr/sbin/grub-mkconfig
# These are defined in this script, export them here so that user can
# override them.
export GRUB_DEVICE \
GRUB_DEVICE_UUID \
GRUB_DEVICE_BOOT \
GRUB_DEVICE_BOOT_UUID \
GRUB_FS \
GRUB_FONT \
GRUB_PRELOAD_MODULES \
GRUB_ACTUAL_DEFAULT

# These are optional, user-defined variables.
export GRUB_DEFAULT \
GRUB_HIDDEN_TIMEOUT \
GRUB_HIDDEN_TIMEOUT_QUIET \
GRUB_TIMEOUT \
GRUB_TIMEOUT_STYLE \
GRUB_DEFAULT_BUTTON \
GRUB_HIDDEN_TIMEOUT_BUTTON \
GRUB_TIMEOUT_BUTTON \
GRUB_TIMEOUT_STYLE_BUTTON \
GRUB_BUTTON_CMOS_ADDRESS \
GRUB_BUTTON_CMOS_CLEAN \
GRUB_DISTRIBUTOR \
GRUB_CMDLINE_LINUX \
GRUB_CMDLINE_LINUX_DEFAULT \
GRUB_CMDLINE_XEN \
GRUB_CMDLINE_XEN_DEFAULT \
GRUB_CMDLINE_LINUX_XEN_REPLACE \
GRUB_CMDLINE_LINUX_XEN_REPLACE_DEFAULT \
GRUB_CMDLINE_NETBSD \
GRUB_CMDLINE_NETBSD_DEFAULT \
GRUB_CMDLINE_GNUMACH \
GRUB_TERMINAL_INPUT \
GRUB_TERMINAL_OUTPUT \
GRUB_SERIAL_COMMAND \
GRUB_DISABLE_LINUX_UUID \
GRUB_DISABLE_RECOVERY \
GRUB_VIDEO_BACKEND \
GRUB_GFXMODE \
GRUB_BACKGROUND \
GRUB_THEME \
GRUB_GFXPAYLOAD_LINUX \
GRUB_DISABLE_OS_PROBER \
GRUB_INIT_TUNE \
GRUB_SAVEDEFAULT \
GRUB_ENABLE_CRYPTODISK \
GRUB_BADRAM \
GRUB_OS_PROBER_SKIP_LIST \
GRUB_DISABLE_SUBMENU \
GRUB_RECORDFAIL_TIMEOUT \
GRUB_RECOVERY_TITLE