Mise à jour : Debian 9.1
L'objectif est de disposer depuis la console Grub, avant que la partition et le répertoire /grub ne soient disponibles, de fonctionnalités telles que
clavier et affichage en français
affichage graphique
jeu de commandes supplémentaires par rapport à celles disponibles dans la console grub rescue
Cette personnalisation est décrite dans le cas d'un amorçage Bios/MBR
Références :
Sommaire
Au lieu d'utiliser la commande standard grub-install pour construire et installer les images boot.img et core.img dans le secteur de démarrage du périphérique, on utilise
la commande grub-mkimage avec les options -c et -m pour faire prendre en compte respectivement
un fichier de configuration (--config-file), succession de commandes grub pour modifier le clavier, l'affichage, etc ...
un disque mémoire (--memdisk), utilisable comme système de stockage arborescent, contenant les fichiers nécessaires à l'exécution du script de commande
la commande grub-bios-setup pour installer les images dans le secteur de démarrage du périphérique
Le fichier de configuration contient la suite des commandes grub à exécuter. Lorsque l'exécution du fichier de configuration est lancée, les paramètres root et prefix pointent vers le disque mémoire et son répertoire grub :
root=(memdisk)
prefix=(memdisk)/boot/grub
le contenu du disque mémoire est donc directement accessible dès le début du script.
- Le fichier de configuration ne doit pas contenir de lignes de commentaires.
- Dans l'exemple ci-dessous, des lignes de commentaire (commençant par #) sont présentes pour la compréhension, elles doivent être supprimées dans le fichier final. On peut utiliser la commande
$ sed -i '/#/d' grub.cfg
$ cat config.cfg
# Installation du mode graphique
insmod all_video
set gfxmode=auto
insmod gfxterm
insmod terminal
terminal_output gfxterm
# Installation du fond d'écran
insmod jpeg
insmod gfxterm_background
background_image /boot/grub/splash.png
# Sélection de la couleur du texte
set color_normal=white/black
set color_highlight=black/white
# Utilisation de la fonte française
insmod font
loadfont fr
# Utilisation des traductions françaises
insmod gettext
set locale_dir=(memdisk)/boot/grub/locale
set lang=fr
# Affichage message de bienvenue
echo " "
echo "Grub 2.0 - Linux Debian 9 Stretch"
echo " "
# Passage du clavier en disposition française
insmod keylayouts
insmod at_keyboard
terminal_input at_keyboard
keymap fr
Pour lancer la phase 2 (affichage du menu grub) automatiquement, ajouter à la fin du fichier précédent :
les paramètres root et prefix en fonction de l'emplacement de la partition root et du répertoire grub
la commande "normal" qui permet d'afficher le menu grub
Dans le cas d'une partition chiffrée, ajouter la commande cryptomount -a d'ouverture de la partition
Exemples :
set root=(hd0,msdos1)
set prefix=(hd0,msdos1)/boot/grub
insmod normal
normal
Cas d'une partition root chiffrée avec répertoire /boot/grub incluse, le mot de passe est demandé pour toutes les partitions chiffrées détectées par grub à l'issue de la commande cryptomount -a
cryptomount -a
set root=(crypto0)
set prefix=(crypto0)/boot/grub
insmod normal
normal
cryptomount -a
set root=(lvm/sda1-root)
set prefix=(lvm/sda1-boot)/grub
insmod normal
normal
L'objectif est de constituer un disque mémoire comprenant les fichiers
configuration du clavier en azerty
traduction française
affichage caractères français
Pour raison d'homogénéité avec la phase 2 de grub, les fichiers sont préparés dans l'arborescence /boot/grub existante. On suppose les répertoires d'installation par défaut, layouts, locales, fonts disponibles. Sinon les créer :
$ sudo mkdir /boot/grub/layouts /boot/grub/locale /boot/grub/fonts
Clavier azerty
Le fichier correspondant à la disposition azerty n'est pas installé en standard par grub2, mais il est possible de le générer. Le nom du fichier est arbitraire, l'extension est gkb.
$ sudo grub-kbdcomp -o /boot/grub/layouts/fr.gkb fr
Code de touche 0x54 inconnu
Code de touche 0x65 inconnu
Code de touche 0x7f inconnu
Ne pas tenir compte des erreurs "code de touche inconnu"
Traduction française
Le fichier de traduction française (fr.mo) est disponible en standard dans l'arborescence grub. Vérifier sa présence :
$ ls /boot/grub/locale/* |grep fr
/boot/grub/locale/fr.mo
Fonte pour caractères français
Par défaut, le fichier de fonte embarqué dans la phase 1 de grub est un fichier de petite taille et certains caractères français ne sont pas disponibles. Le fichier core.img étant limité en taille (0x78000 octets maximum), il n'est pas possible d'utiliser le fichier unicode.pf2 utilisé pendant la phase 2.
Une solution consiste extraire du fichier unicode complet, les caractères utiles : caractères ASCII, caractères semi-graphiques (contours d'encadrement), points de suspension (code 0x2026), ...). Note la gamme 0x0-0x-800, utilisée ci-dessous est probablement surabondante ... Le nom du fichier est arbitraire, l'extension est pf2.
$ sudo aptitude install ttf-unifont
$ sudo grub-mkfont --verbose --size=16 --range=0x0-0x800,0x2026-0x2016 --output=/boot/grub/fonts/fr.pf2 /usr/share/fonts/truetype/unifont/unifont.ttf
Font name: Unifont Regular 16
Max width: 16
Max height: 16
Font ascent: 14
Font descent: 2
Number of glyph: 2339
Papier peint
Il est possible d'incorporer un papier peint au format png ou jpeg, par exemple :
$ sudo cp /usr/share/images/desktop-base/desktop-grub.png /boot/grub/splash.png
Afin de profiter des chemins par défaut des commandes, le disque mémoire est créé avec l'arborescence standard :
$ mkdir -p ./boot/grub/{layouts,locale,fonts}
$ cp /boot/grub/layouts/fr.gkb boot/grub/layouts/
Ajout de la traduction française
$ cp /boot/grub/locale/fr.mo boot/grub/locale/
Ajout de la fonte française
$ cp /boot/grub/fonts/fr.pf2 boot/grub/fonts/
Ajout de l'image de fond
$ cp /boot/grub/splash.png boot/grub/splash.png
On peut vérifier l'arborescence :
$ tree ./boot
./boot
└── grub
├── fonts
│ └── fr.pf2
├── layouts
│ └── fr.gkb
├── locale
│ └── fr.mo
└── splash.png
Créer le disque mémoire au format tar (le nom du fichier est libre, l'extension est tar)
$ tar -vcf memdisk.tar boot/*
boot/grub/
boot/grub/locale/
boot/grub/locale/fr.mo
boot/grub/layouts/
boot/grub/layouts/fr.gkb
boot/grub/fonts/
boot/grub/fonts/fr.pf2
boot/grub/splash.png
Les modules dont on souhaite disposer dans la phase 1 seront ajoutés à la commande grub-mkimage :
'ext2' 'part_msdos' 'biosdisk' 'tar' 'memdisk'
Modules utilisés par config.cfg dans l'exemple ci-dessus
'echo' 'keylayouts' 'at_keyboard' 'font' 'gfxterm' 'all_video' 'terminal' 'png' 'jpeg' 'gfxterm_background'
Utilitaires pour faciliter l'utilisation de la console grub
'reboot' 'cat' 'help' 'minicmd' 'videoinfo' 'linux'
Créer core.img avec la commande grub-mkimage :
$ sudo grub-mkimage --verbose \
--directory '/usr/lib/grub/i386-pc' \
--output '/boot/grub/i386-pc/core.img' \
--format 'i386-pc' \
--compression 'auto' \
--config './config.cfg' \
--memdisk 'memdisk.tar' \
'ext2' 'part_msdos' 'biosdisk' 'tar' 'memdisk' \
'echo' 'keylayouts' 'at_keyboard' 'font' 'gfxterm' 'all_video' 'terminal' 'png' 'jpeg' 'gfxterm_background' \
'reboot' 'cat' 'help' 'minicmd' 'videoinfo' 'linux'
Cas d'une partition chiffrée : ajouter les modules
'cryptodisk' 'luks' 'gcry_rijndael' 'gcry_sha512'
Cas d'une partition chiffrée avec volumes logiques : ajouter
'lvm'
Installer les images dans le secteur de démarrage du disque avec la commande grub-bios-setup :
$ sudo grub-bios-setup --verbose --directory='/boot/grub/i386-pc' --device-map='/boot/grub/device.map' '/dev/sda'