On sait paramétrer la création du menu Grub pour qu'il amorce directement, sans affichage du menu, sur une entrée définie par défaut. Mais on a plus de difficultés à modifier ce comportement pour faire amorcer le PC sur une autre entrée du menu. Et en cas de dysfonctionnement, on peut même avoir à amorcer le PC à partir d'un support amovible pour venir modifier les fichiers de gestion de Grub et pour exécuter update-grub.
Ceci m'a amené à écrire un script Grub pour modifier son comportement qui devient alors le suivant :
si la touche "ctrl" est enfoncée, le menu est présenté pour permettre à l'utilisateur de choisir une entrée
sinon, Grub amorce le PC directement avec le système qui a été préalablement défini.
Cette définition du système à utiliser sans affichage du menu nécessite la création du fichier /boot/grub/direct_boot.cfg
set uuid=<uuid_de_la_partition_racine>
set kernel=<chemin_accès_noyau>
set initrd=<chemin_accès_fichier_initrd>
set kernelopt="<paramètres_noyau>"
Les valeurs à utiliser sont celles qui apparaissent dans l'entrée du menu correspondant au système à utiliser
menuentry 'Le système à utiliser' --class ubuntu --class gnu-linux --class gnu --class os {
recordfail
set gfxpayload=$linux_gfx_mode
insmod gzio
insmod part_msdos
insmod ext2
set root='(hd0,msdos7)'
search --no-floppy --fs-uuid --set=root <uuid_de_la_partition_racine>
linux <chemin_accès_noyau> root=UUID=<uuid_de_la_partition_racine> <paramètres_noyau>
initrd <chemin_accès_fichier_initrd>
}
La présence d'espaces dans <paramètres_noyau> explique la présence des doubles " de l'exemple.
Pour changer le système à amorcer par défaut, il suffit de modifier les valeurs enregistrées dans le fichier /boot/grub/direct_boot.cfg, sans avoir à exécuter la commande update-grub.
Pour mettre en oeuvre ce fonctionnement, il faut
a) créer le fichier /etc/grub.d/06_custom avec le contenu ci-dessous
#! /bin/sh
set -e
cat << EOF
if ! keystatus --ctrl ; then
if [ -f $prefix/direct_boot.cfg ]; then
source $prefix/direct_boot.cfg
set gfxpayload=$linux_gfx_mode
insmod gzio
insmod part_msdos
insmod ext2
search --no-floppy --set=root --fs-uuid \${uuid}
linux \${kernel} root=UUID=\${uuid} \${kernelopt}
initrd \${initrd}
boot
fi
fi
EOF
b) marquer le fichier comme exécutable,
c) et exécuter update-grub.
Cependant avant d'exécuter update-grub, il est recommandé
a) de contrôler la bonne exécution par la commande
sudo grub-mkconfig -o fichier_de_contrôle
b) de vérifier le contenu du fichier de contrôle
c) de sauver le contenu actuel de /boot/grub/grub.cfg
d) de vérifier que l'on dispose bien des outils nécessaires pour amorcer le PC à partir d'un support amovible afin de pouvoir réinitialiser /boot/grub/grub.cfg en cas de catatrophe
Arbiel