A l’occasion de quelques sujets abordant la mise en place d’un amorçage classique (BIOS/legacy) tolérant aux pannes avec des disques en RAID logiciel, je me demandais comment y parvenir avec l’amorçage en UEFI. J’ai décidé de passer à la pratique, en voici le résultat. A cette occasion j’ai fait une découverte intéressante concernant grub-install en UEFI.
Avertissement : ceci n’a pas vocation à être un tutoriel détaillé mais plutôt un guide voire un simple retour d’expérience.
Pour rappel, pour amorcer en UEFI x86 64 bits (amd64), il faut :
- un PC ou Mac x86 64 bits (amd64) avec firmware compatible UEFI
- une partition système EFI (FAT) sur un des disques
- un chargeur compatible UEFI installé dans la partition système EFI
- une entrée d’amorçage pour ce chargeur dans les variables UEFI du firmware (NVRAM)
- ou, alternativement, un chargeur par défaut /EFI/boot/bootx64.efi dans la partition système EFI
Configuration d’essai :
PC 64 bits UEFI
Boot en UEFI activé
Pas d’option secure boot ni fast boot
Deux disques /dev/sda et /dev/sdb vides sans table de partition
Installateur Debian 7 Wheezy multiarch ou amd64 amorcé en UEFI (affiche le menu de grub)
Installation standard en mode texte.
Partitionnement des disques :
Choisir le partitionnement manuel pour le RAID.
Création d’une partition système EFI /dev/sda1 et /dev/sdb1 de préférence en première position sur chaque disque.
Création d’une partition RAID /dev/sda2 et /dev/sdb2 sur chaque disque.
Création d’un volume RAID 1 /dev/md0 avec les deux partitions RAID /dev/sda2 et /dev/sdb2.
Utilisation du volume RAID comme racine en ext4.
Installation du chargeur d’amorçage :
L’installateur ne propose pas lilo (elilo), seulement grub (grub-efi-amd64).
L’installateur a monté automatiquement la partition système EFI /dev/sda1 sur /boot/efi.
Contrairement à grub-pc, aucune question n’est posée concernant l’emplacement du chargeur. Celui-ci est installé d’office dans la partition système EFI montée sur /boot/efi.
L’installateur exécute la commande [mono]grub-install dummy[/mono] qui réalise les opérations suivantes :
- copie le chargeur dans la partition système EFI montée sur /boot/efi (/boot/efi/EFI/debian/grubx64.efi)
- supprime les entrées d’amorçage UEFI commençant par “debian” (insensible à la casse)
- crée une entrée d’amorçage UEFI nommée “debian” pour le chargeur et l’ajoute en premier dans l’ordre d’amorçage.
EDIT : suite à une installation de Jessie qui m’a effacé des entrées contenant mais ne commençant pas par “debian”, je soupçonne que [mono]grub-install[/mono] de cette version efface toute entrée dont le nom contient (et pas seulement commence par) “debian”.
Une fois l’installation terminée, les choses sérieuses commencent : il faut installer le chargeur sur l’autre disque pour pouvoir amorcer en cas de panne du premier disque.
Méthode 1 (réinstallation de grub) :
Non recommandée à cause de ses inconvénients.
Avec grub-efi-amd64 on ne peut pas se contenter d’exécuter [mono]grub-install /dev/sdb[/mono] comme avec grub-pc en mode BIOS/legacy car [mono]grub-install[/mono] installe le chargeur dans la partition système EFI montée sur /boot/grub sans tenir compte du périphérique passé en paramètre.
Démonter /dev/sda1 de /boot/efi.
Monter /dev/sdb1 sur /boot/efi.
Exécuter [mono]grub-install[/mono].
Cela installe le chargeur dans la partition système EFI /dev/sdb1 du second disque mais efface l’entrée d’amorçage UEFI créée à l’installation. Retour à la case départ.
Pour la recréer avec un nouveau nom ne contenant pas “debian”, il faut utiliser [mono]efibootmgr[/mono] qui permet de gérer les entrées d’amorçage UEFI :
Inconvénient : si [mono]grub-install[/mono] est à nouveau exécuté alors que /dev/sda1 est monté sur /boot/efi (par exemple à l’occasion d’une mise à jour de grub), les entrées d’amorçage UEFI contenant “debian” seront effacées et la nouvelle entrée “debian” pointera vers le premier disque, ce qui fera perdre la tolérance de panne de l’amorçage.
Solutions :
- Monter /dev/sdb2 sur /boot/efi de façon permanente en modifiant /etc/fstab.
- Créer une nouvelle entrée d’amorçage UEFI avec un nom ne contenant pas “debian” pour le second disque :
Lourd. Autant appliquer directement la deuxième méthode.
Méthode 2 (copie de grub) :
Monter temporairement /dev/sdb1 sur /mnt.
Copier /boot/efi/EFI/debian/grubx64.efi en /mnt/EFI/debian/grubx64.efi.
Créer une entrée d’amorçage UEFI pour chaque disque avec un nom ne contenant pas “debian” :
efibootmgr -v -c -L 'raid-linux-1' -l '\EFI\debian\grubx64.efi' -d /dev/sda -p 1
efibootmgr -v -c -L 'raid-linux-2' -l '\EFI\debian\grubx64.efi' -d /dev/sdb -p 1
Méthode 3 (chargeur UEFI par défaut) :
Peut être combinée avec la méthode 1 ou 2.
Monter temporairement /dev/sdb1 sur /mnt.
Copier /boot/efi/EFI/debian/grubx64.efi en /mnt/EFI/boot/bootx64.efi et /boot/efi/EFI/boot/bootx64.efi
Avantage : les disques sont amorçables même sans entrée d’amorçage UEFI.
Pour finir, tester la tolérance de panne de l’amorçage avec un disque manquant :
Eteindre la machine.
Enlever un disque.
Allumer la machine.
Le menu de grub doit s’afficher.
Ne pas démarrer le système sinon mdadm constatera l’absence d’un disque et le marquera manquant et il faudra le réintégrer et le resynchroniser.
Recommencer avec l’autre disque.