Personnalisation Console Grub - Amorçage Bios/MBR

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

Cette personnalisation est décrite dans le cas d'un amorçage Bios/MBR

Références :

Sommaire

1 - Principe

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

Voir : grub-how-to-4-memdisk-and-loopback.html

2 - Fichier de configuration

2.1 - Principe

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.

2.2 - Exemple

$ 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

2.3 - Affichage du menu grub

Pour lancer la phase 2 (affichage du menu grub) automatiquement, ajouter à la fin du fichier précédent :

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
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

3 - Disque mémoire

3.1 - Fichiers

L'objectif est de constituer un disque mémoire comprenant les fichiers

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

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"

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

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

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

3.2 - Arborescence

$ mkdir -p ./boot/grub/{layouts,locale,fonts}
$ cp /boot/grub/layouts/fr.gkb boot/grub/layouts/
$ cp /boot/grub/locale/fr.mo boot/grub/locale/
$ cp /boot/grub/fonts/fr.pf2 boot/grub/fonts/
$ 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

3.3 - Création

$ 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

4 - Création et installation des images

4.1 - Liste des modules

Les modules dont on souhaite disposer dans la phase 1 seront ajoutés à la commande grub-mkimage :

'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'

4.2 - Création de core.img

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'
'cryptodisk' 'luks' 'gcry_rijndael' 'gcry_sha512'
'lvm' 

4.3 - Installation

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'