Aller au contenu

Configurer l'image de démarrage par défaut dans Grub2

cover

Aujourd'hui, j'ai mis à jour mon serveur Fedora depuis la version 33 vers 38 mais tout ne s'est pas passé comme prévu.

J'ai OpenZFS d'intallé pour gérer mon stockage et la version actuelle de OpenZFS (2.2.2) n'est pas compatible avec le dernier kernel (6.7). J'étais coincé avec mon nouveau kernel et incapable d'accéder à mes données.

Pour référence, voici le message d'erreur que j'obtenais :

zfs list

Output :

The ZFS modules cannot be auto-loaded.
Try running 'modprobe zfs' as root to manually load them.

Et :

modprobe zfs

Output :

modprobe: FATAL: Module zfs not found in directory /lib/modules/6.7.3-100.fc38.x86_64

Troubleshooting

La première chose que j'ai faite a été de vérifier quelle version de kernel est supportée par la dernière version de OpenZFS (2.2.2) et j'ai découvert que la dernière version supportée de kernel est 6.6. Je l'ai manqué d'une version mineure.

Ce n'est pas grave, je peux juste installer le kernel précédent et démarrer dessus, non ?

Voyons quels sont les noyaux disponibles :

dnf --releasever=38 --showduplicates list kernel

Output :

Paquets disponibles
kernel.x86_64          6.2.9-300.fc38          fedora  
kernel.x86_64          6.7.3-100.fc38          pdates 

Installer le noyau précédent

Ce n'est pas vraiment ce à quoi je m'attendais. J'espérais voir la version précédente kernel 6.6 mais elle n'est pas là. Essayons d'installer la version 6.2.9 et voyons ce qui se passe :

dnf install kernel-6.2.9-300.fc38

Redémarrons et voyons si ça fonctionne.

uname -r

Output :

6.7.3-100.fc38.x86_64

Après avoir redémarré, je démarrais toujours avec le dernier kernel 6.7.

Branchons un écran et voyons ce qui se passe pendant le processus de démarrage.

Grub2

Pendant le processus de démarrage, j'ai obtenu le menu Grub2 et j'ai pu sélectionner la version précédente kernel 6.2.9 mais ce n'était pas l'image de démarrage par défaut. Je dois la sélectionner manuellement à chaque fois que je redémarre le serveur.

Résolution des problèmes (à nouveau)

Jetons un coup d'oeil à la configuration de Grub2 pour voir quelle est la configuration par défaut :

cat /etc/default/grub

Output :

GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="resume=/dev/mapper/fedora_nubs-swap rd.lvm.lv=fedora_nubs/root rd.lvm.lv=fedora_nubs/swap rhgb quiet"
GRUB_DISABLE_RECOVERY="true"
GRUB_ENABLE_BLSCFG=true

Hum. GRUB_DEFAULT=saved. On dirait que l'image de démarrage par défaut est sauvegardée quelque part. Jetons un coup d'oeil au fichier de configuration de Grub2 :

grep saved /etc/grub2.cfg

Output :

   set default="${saved_entry}"
if [ "${prev_saved_entry}" ]; then
  set saved_entry="${prev_saved_entry}"
  save_env saved_entry
  set prev_saved_entry=
  save_env prev_saved_entry
function savedefault {
    saved_entry="${chosen}"
    save_env saved_entry

Le fichier de configuration de grub2 est assez complexe et je ne veux pas y toucher, mais il semble qu'il définisse l'image de démarrage par défaut dans la variable saved_entry.

J'ai découvert qu'il existe un binaire pour travailler avec les variables d'environnement de grub2 : grub2-editenv.

grub2-editenv list

Output :

saved_entry=8bfb6e63623d4ee6aab1634ebafdd5d4-5.6.15-200.fc31.x86_64
kernelopts=root=/dev/mapper/fedora_nubs-root ro resume=/dev/mapper/fedora_nubs-swap rd.lvm.lv=fedora_nubs/root rd.lvm.lv=fedora_nubs/swap rhgb quiet systemd.unified_cgroup_hierarchy=0
boot_success=0
boot_indeterminate=1

5.6.15 ! C'est une vieille version du noyau. Je suppose que ma précédente mise à jour depuis Fedora 31 n'était pas aussi propre que je le pensais.

Comment je peux changer l'image de démarrage par défaut ? Et quelle est cette longue chaîne hexadécimale au début de la variable saved_entry ?

Changer l'image de démarrage par défaut

Nous devons d'abord trouver la liste des images de démarrage disponibles. J'ai trouvé un autre binaire pratique pour faire cela grubby.

grubby --info ALL

Output :

index=0
kernel="/boot/vmlinuz-6.7.3-100.fc38.x86_64"
args="ro resume=/dev/mapper/fedora_nubs-swap rd.lvm.lv=fedora_nubs/root rd.lvm.lv=fedora_nubs/swap rhgb quiet systemd.unified_cgroup_hierarchy=0"
root="/dev/mapper/fedora_nubs-root"
initrd="/boot/initramfs-6.7.3-100.fc38.x86_64.img"
title="Fedora Linux (6.7.3-100.fc38.x86_64) 38 (Server Edition)"
id="8bfb6e63623d4ee6aab1634ebafdd5d4-6.7.3-100.fc38.x86_64"

index=1
kernel="/boot/vmlinuz-6.5.12-100.fc37.x86_64"
args="ro resume=/dev/mapper/fedora_nubs-swap rd.lvm.lv=fedora_nubs/root rd.lvm.lv=fedora_nubs/swap rhgb quiet systemd.unified_cgroup_hierarchy=0"
root="/dev/mapper/fedora_nubs-root"
initrd="/boot/initramfs-6.5.12-100.fc37.x86_64.img"
title="Fedora Linux (6.5.12-100.fc37.x86_64) 37 (Server Edition)"
id="8bfb6e63623d4ee6aab1634ebafdd5d4-6.5.12-100.fc37.x86_64"

index=2
kernel="/boot/vmlinuz-6.2.9-300.fc38.x86_64"
args="ro resume=/dev/mapper/fedora_nubs-swap rd.lvm.lv=fedora_nubs/root rd.lvm.lv=fedora_nubs/swap rhgb quiet systemd.unified_cgroup_hierarchy=0"
root="/dev/mapper/fedora_nubs-root"
initrd="/boot/initramfs-6.2.9-300.fc38.x86_64.img"
title="Fedora Linux (6.2.9-300.fc38.x86_64) 38 (Server Edition)"
id="8bfb6e63623d4ee6aab1634ebafdd5d4-6.2.9-300.fc38.x86_64"

index=3
kernel="/boot/vmlinuz-0-rescue-8bfb6e63623d4ee6aab1634ebafdd5d4"
args="ro resume=/dev/mapper/fedora_nubs-swap rd.lvm.lv=fedora_nubs/root rd.lvm.lv=fedora_nubs/swap rhgb quiet systemd.unified_cgroup_hierarchy=0"
root="/dev/mapper/fedora_nubs-root"
initrd="/boot/initramfs-0-rescue-8bfb6e63623d4ee6aab1634ebafdd5d4.img"
title="Fedora (0-rescue-8bfb6e63623d4ee6aab1634ebafdd5d4) 30 (Thirty)"
id="8bfb6e63623d4ee6aab1634ebafdd5d4-0-rescue"

Attendez un peu. La liste de sortie est vraiment similaire à ce que j'ai sur mon moniteur pendant le processus de démarrage. Et le champ id a le même format que la variable saved_entry.

Je suppose que si je change la variable saved_entry par l'id de l'image de démarrage sur laquelle je veux démarrer, cela devrait fonctionner.

grub2-editenv - set saved_entry='8bfb6e63623d4ee6aab1634ebafdd5d4-6.2.9-300.fc38.x86_64'

Vérification de la variable saved_entry :

grub2-editenv list

Output :

saved_entry=8bfb6e63623d4ee6aab1634ebafdd5d4-6.2.9-300.fc38.x86_64
kernelopts=root=/dev/mapper/fedora_nubs-root ro resume=/dev/mapper/fedora_nubs-swap rd.lvm.lv=fedora_nubs/root rd.lvm.lv=fedora_nubs/swap rhgb quiet systemd.unified_cgroup_hierarchy=0
boot_success=1
boot_indeterminate=1

Ça a l'air pas mal. Il est temps de procéder au test final. Redémarrage du serveur...

Je vois le menu Grub2 et l'image sélectionnée par défaut est celle que j'ai définie. Ne bougez pas ... 5 ... 4 ... 3 ... 2 ... 1 ... 0.

Ca démarre !

Dernière vérification :

uname -r

Output :

6.2.9-300.fc38.x86_64

Et mon ZFS ?

zfs list

Output :

The ZFS modules cannot be auto-loaded.
Try running 'modprobe zfs' as root to manually load them.

Argh. J'ai oublié de réinstaller les modules OpenZFS pour le nouveau kernel. Faisons ça.

dnf install zfs
zfs list

Output :

NAME                           USED  AVAIL  REFER  MOUNTPOINT
poule                         3.64T  3.47T   141K  /poule
...

C'est vivant !

Conclusion

J'espère que ce guide vous aidera à configurer l'image de démarrage par défaut dans Grub2. C'est une tâche simple mais qui peut s'avérer délicate si vous ne savez pas où chercher. Soyez également très prudent lorsque vous jouez avec Grub2, vous pouvez facilement casser votre système. Ayez toujours un plan de secours (je ne l'ai pas fait ... YOLO).