RAID logiciel Linux et amorçage en UEFI

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.

Salut, j’ai utilisé la méthode 2.

Elle a fonctionné jusqu’au test de reprise :
J’ai débranché un disque, le boot fonctionnait toujours. Je le rebranche puis je débranche le second… je boot sur le bios. Je rebranche le premier disque et plus rien. Du coup je ne peux plus booter du tout.

Il y a quelque chose que je n’ai pas saisi là !! :013

J’avais bien les entrées UEFI !!

Les partitions FAT sont présentes, que se passe-t-il ? Je sèche :’(

Il y a bien un problème avec la méthode 2. Quand on débranche un disque, l’entrée disparaît (pour toujours :mrgreen: ). J’ai ce problème sur deux machines totalement différentes (cartes mère ASUS).

Donc le mieux est de faire son installation depuis un boot UEFI (j’ai utilisé Rufus (windows) pour préparer ma clé USB avec l’iso de debian, je suis curieux de savoir comment tu l’avais préparé Pascal ?).
L’installeur en mode UEFI installe les paquets grub-efi et le système est bootable immédiatement. Comme dit ci-dessus, il ne vous reste qu’à :
créer sur votre partition FAT, le répertoire /boot/efi/EFI/boot (à côté du répertoire debian créé par l’installateur)
et on fait la copie suivante :

cp /boot/efi/EFI/debian/grubx64.efi /boot/efi/EFI/boot/bootx64.efi

Si comme moi sur l’une de mes deux machines, l’installateur (toujours en mode UEFI) ne parvient pas à paramétrer le réseau lors de votre installation, alors bon courage. Personnellement je suis reparti d’une installation classique pour ensuite réinstaller completement grub en chroot. Ca à fonctionner mais je me suis un peu arracher les cheveux quand même.

Merci Pascal pour ce post.

Même marque dont probablement même base de firmware UEFI. J’avais cru comprendre d’après ta photo d’écran que les entrées d’amorçage UEFI étaient encore présentes après avoir débranché et rebranché les disques ? Si les entrées relatives à un disque sont supprimées lorsque le disque n’est plus présent, cela peut s’expliquer par une volonté de “nettoyage” des entrées d’amorçage supposées obsolètes. C’est quand même embêtant car cela empêche d’utiliser différents disques alternativement.

Pour installer une image ISO hybride sur une clé USB ou un disque j’utilise simplement [mono]dd[/mono].

Qu’entends-tu par installation classique, et pourquoi en chroot ?

Installation classique dans le sens où je ne boot pas sur la clé en mode UEFI mais en legacy. J’ai fais mon installation sans grub. Ensuite j’ai démarré sur un live, j’ai chroot le système pour installer grub-efi. Mais de toute manière ça doit normalement bien se passer, j’ai fais ça car la prise en charge réseau ne fonctionnait pas avec l’installation en mode UEFI.

Ah non, elles ont disparu et ne réapparaissent pas. Comme tu dis, je pense qu’il doit faire “le ménage”. Mais c’est très con.

Le selecteur de boot ressemble désormais à ça :

Tu aurais pu installer grub-pc et démarrer en legacy.

Tu confirmes bien que le réseau fonctionne dans l’installateur en legacy mais pas en EFI ? Cela m’étonne beaucoup. Et dans le système installé ?

Donc tu avais pris la photo précédente avant de débrancher les disques ?

Je suppose que les deux entrées étiquetées “UEFI OS” correspondent aux chargeurs par défaut.

Oui c’est vraia aussi.

[quote]Tu confirmes bien que le réseau fonctionne dans l’installateur en legacy mais pas en EFI ? Cela m’étonne beaucoup. Et dans le système installé ?
[/quote]
Oui exactement. Et dans le système installé ça fonctionne impec. J’ai passé plusieurs heures à chercher sans trouver… Les demandes DHCP parvenaient bien à mon serveur qui renvoyait bien un IP disponible. La configuration en fixe ne fonctionnait pas non plus.

[quote]
Donc tu avais pris la photo précédente avant de débrancher les disques ?[/quote]
La première photo oui.

Tout à fait.