systemd-boot

Utiliser systemd-boot pour contourner les limites d’un UEFI tout pourri

Introduction

Un ami a acheté d’occasion un Lifebook E751 qu’il souhaitait passer sous Linux pour faire de la Musique Assistée par Ordinateur avec Ardour.

L’installation d’une Debian 11 n’a posé aucun problème... jusqu’au redémarrage.

Voici une prise de notes assez brouillonne de ce qui s’est passé et comment je m’en suis sorti, en espérant que ça puisse servir à quelqu’un !

Un bon firmware bien pourri

En fait, la sorte de BIOS/EFI bizarre sur cette machine a bien démarré sur la Debian une première fois. Mais plus après... Et bien-sûr, pas de shell UEFI pour s’en sortir à la main.

J’ai réinstallé GRUB2, ça redémarre bien une fois, puis après, même punition.

J’ai essayé de démarrer en mode MBR après avoir transformé la table de partitions de GPT en MSDOS. Même résultat. J’ai ensuite essayé avec GRUB-Legacy, avec toujours le même résultat.

Une solution de mise à jour de firmware encore plus pourrie

Bien-sûr, j’ai pensé mettre à jour le BIOS. Mais ces charmants industriels de chez Fujitsu imposent Windows et des programmes supplémentaires pour le mettre à jour. J’ai essayé en utilisant un live-USB Windows et je me suis arraché les cheveux en essayant d’installer leurs pré-requis.

Après avoir rêvé de différentes façons pour détruire cette machine, j’ai essayé de donner sa chance à systemd-boot, le programme d’amorçage de systemd pour UEFI.

Eh bien ça a fonctionné !

La procédure de chroot qui m’a sauvé

Pour commencer, il faut démarrer sur un systemdrescuecd en mode EFI pour avoir accès aux variables UEFI.

Ensuite on monte la partition racine :
# mount /dev/sda2 /mnt

Et on charge le module efivarfs qui donne accès à ces variables EFI dans /sys/firmware/efi/efivars/ :
# modprobe efivarfs

Ensuite on monte les systèmes de fichiers virtuels /dev/, /proc/ et /sys/ sur la racine de destination :
# for i in dev proc sys; do mount -o bind -v /${i} /mnt/${i}; done

Curieusement, /mnt/sys/firmware/efi/efivars/ était vide alors que /sys/firmware/efi/efivars/ contenait bien l’environnement EFI. J’ai contourné le problème sans finesse :
mount -o bind /sys/firmware/efi/efivars/ /mnt/sys/firmware/efi/efivars/

Après cela, nous pouvons utiliser la racine du système de destination comme racine, c’est à dire faire un chroot :
# chroot /mnt /bin/bash

Et monter /boot/efi/ pour accéder au système de fichiers sur la partition système EFI :
# mount -av

Il nous reste à installer systemd-boot en chargeur d’amorçage :
# bootctl --path=/boot/efi install

Et à paramétrer /boot/efi/loader/loader.conf :

timeout 1
default GRUB*

Puis /boot/efi/loader/entries/grub.conf  :

title      GRUBl
efi        /EFI/debian/grubx64.conf

À partir de là, la machine a bien voulu démarre plusieurs fois de suite sur la Debian.

Un peu de documentation