rss logo

Comment mettre en place un RAID1 mdadm avec un boot UEFI

Logo Debian

UEFI est aujourd'hui le nouveau standard qui se charge entre autres de démarrer les systèmes d'exploitation, il succède au vieillissant BIOS. En informatique, les évolutions sont constantes et impliquent des changements ce qui provoque sueurs froides, moustaches mouillées et maux de têtes. Par exemple, mettre en place un RAID1 logiciel avec UEFI sur un système GNU/Linux nécessite pas mal de paramétrages par rapport à ce qu'il était nécessaire de faire avec BIOS. Et c'est justement ce que nous allons voir ici dans cet article.

Installation de Debian

Partitionnement des disques

Nous allons commencer à partir d'une nouvelle installation de Debian avec le RAID activé. Des partitions RAID devront être assignées à chacune des partitions des disques sauf pour les partitions EFI (nous les déclarerons en RAID plus tard).

  • Pendant l'installation, configurer les deux disques comme suit:
    • Partition 1 (EFI): EFI 50MB
    • Partition 2 (OS): RAID
    • Partition 3 (swap): RAID
  • Puis, choisir Configurer le RAID avec gestion logicielle :
Interface de partitionnement de Debian montrant deux disques avec des partitions EFI et RAID, ainsi que l’option Configurer le RAID logiciel sélectionnée
Configuration des partitions RAID logiciel pendant l’installation de Debian.
  • Après cette étape les disques devraient ressembler à ça :
Schéma de partitionnement RAID 1 pour une installation Debian en UEFI, montrant deux disques avec des partitions EFI distinctes et des partitions système et swap en miroir
Schéma de partitionnement RAID 1 pour une installation Debian en UEFI, avec des partitions système EFI distinctes et des partitions système et swap en miroir.

Création du RAID mdadm

  • Sélectionner Créer un périphérique multidisques :
Menu de configuration du RAID logiciel de Debian avec l’option Créer un périphérique MD sélectionnée
Sélection de l’option permettant de créer un nouveau périphérique MD pendant la configuration du RAID logiciel sous Debian.
  • Puis choisir les deux partition de 20Go :
Écran de configuration du RAID 1 sous Debian montrant /dev/sda2 et /dev/sdb2 sélectionnés comme périphériques actifs de l’ensemble
Sélection des deux partitions de 20 Go comme périphériques actifs de l’ensemble RAID 1.
  • Répéter l'opération pour les deux partitions de 2Go :
Écran de configuration du RAID 1 sous Debian montrant /dev/sda3 et /dev/sdb3 sélectionnés comme périphériques actifs de l’ensemble RAID dédié au swap
Sélection des deux partitions d’environ 1,4 Go comme périphériques actifs de l’ensemble RAID 1 dédié au swap.
  • Assigner les partitions de 20Go / (root) au périphérique RAID1 de 20Go et la swap au périphérique 2Go :
Écran de partitionnement de Debian montrant un périphérique RAID 1 de 20 Go formaté en ext4 pour le système de fichiers racine et un périphérique RAID 1 de 1,4 Go configuré comme espace d’échange
Schéma de partitionnement final sous Debian avec un périphérique RAID 1 de 20 Go pour le système de fichiers racine et un périphérique RAID 1 de 1,4 Go pour l’espace d’échange.
  • À la fin de l'installation, notre système devrait être partitionné de cette façon :
Schéma de partitionnement RAID 1 final montrant des partitions système EFI distinctes ainsi que les partitions racine ext4 et swap en miroir sur /dev/sda et /dev/sdb
Schéma de partitionnement RAID 1 final avec des partitions système EFI distinctes et les partitions racine et swap en miroir.

Post-Installation

Maintenant notre système peut correctement démarrer, mais il n'est pas pleinement redondant car le disque sdb n'a pas sa partition EFI correctement paramétrée, donc voyons comment remédier à cela.

  • Tout d'abord, déterminons où se trouve la partition /boot/efi :
root@host:~# mount | grep '/boot/efi'
/dev/sda1 on /boot/efi type vfat (rw,relatime,fmask=0077,dmask=0077,codepage=437,iocharset=ascii,shortname=mixed,utf8,errors=remount-ro)
  • Puis, on effectue une copie de la partition /boot/efi vers /dev/sdb1:
root@host:~# dd if=/dev/sda1 of=/dev/sdb1
  • Utiliser la commande efibootmgr pour lister les entrées de démarrage EFI :
root@host:~# efibootmgr -v | grep -i debian
Boot0004* debian HD(1,GPT,f7fb28ea-172c-4583-baf9-f973e675a849,0x800,0x17800)/File(\EFI\debian\shimx64.efi)
  • Si il n'y a qu'une seule entrée, alors en ajouter une deuxième pour sdb :
root@host:~# efibootmgr --create --disk /dev/sdb --part 1 --label "debian2" --loader "\EFI\debian\shimx64.efi"
BootCurrent: 0004
BootOrder: 0006,0004,0000,0001,0002,0003,0005
Boot0000* EFI Virtual disk (0.0)
Boot0001* EFI VMware Virtual IDE CDROM Drive (IDE 0:0)
Boot0002* EFI Network
Boot0003* EFI Internal Shell (Unsupported option)
Boot0004* debian
Boot0005* EFI Virtual disk (1.0)
Boot0006* debian2
  • Verifier ques les partitions IDs matchent avec les boot IDs:
root@host:~# ls -l /dev/disk/by-partuuid/
total 0
lrwxrwxrwx 1 root root 10 Nov  7 21:07 4e50a3f1-fdb6-44c3-9c8e-e4b16f582d4e -> ../../sdb2
lrwxrwxrwx 1 root root 10 Nov  7 21:07 955255b5-cc20-40cc-a084-2b372e7d7675 -> ../../sda3
lrwxrwxrwx 1 root root 10 Nov  7 21:07 b893954d-b857-4a33-9b1f-d886da46b4bf -> ../../sdb3
lrwxrwxrwx 1 root root 10 Nov  7 21:07 b9d9b6db-3721-4a0c-aee8-a7283ecf39ce -> ../../sda2
lrwxrwxrwx 1 root root 10 Nov  7 21:09 eb36f2b9-c679-4f18-b076-e868a50f5a4c -> ../../sdb1
lrwxrwxrwx 1 root root 10 Nov  7 21:07 f7fb28ea-172c-4583-baf9-f973e675a849 -> ../../sda1
root@host:~# efibootmgr -v
BootCurrent: 0004
BootOrder: 0006,0004,0000,0001,0002,0003,0005
Boot0000* EFI Virtual disk (0.0)	PciRoot(0x0)/Pci(0x15,0x0)/Pci(0x0,0x0)/SCSI(0,0)
Boot0001* EFI VMware Virtual IDE CDROM Drive (IDE 0:0)	PciRoot(0x0)/Pci(0x7,0x1)/Ata(0,0,0)
Boot0002* EFI Network	PciRoot(0x0)/Pci(0x16,0x0)/Pci(0x0,0x0)/MAC(005056802b14,1)
Boot0003* EFI Internal Shell (Unsupported option)	MemoryMapped(11,0xeb59018,0xf07e017)/FvFile(c57ad6b7-0515-40a8-9d21-551652854e37)
Boot0004* debian	HD(1,GPT,f7fb28ea-172c-4583-baf9-f973e675a849,0x800,0x17800)/File(\EFI\debian\shimx64.efi)
Boot0005* EFI Virtual disk (1.0)	PciRoot(0x0)/Pci(0x15,0x0)/Pci(0x0,0x0)/SCSI(1,0)
Boot0006* debian2	HD(1,GPT,eb36f2b9-c679-4f18-b076-e868a50f5a4c,0x800,0x17800)/File(\EFI\debian\shimx64.efi)
  • Si nécessaire, on pourra supprimer une entrée (par exemple si les IDs ne matchent pas), exemple ici avec l'entrée 0006 :
root@host:~# efibootmgr -B -b 0006
  • Si nécessaire, on pourra ajouter une entrée (par exemple si les IDs ne matchent pas) :
root@host:~# efibootmgr --create --disk /dev/sdb --part 1 --label "debian2" --loader "\EFI\debian\shimx64.efi"
  • Maintenant, la configuration du RAID1 avec mdadm doit maintenant ressembler à ça :
Schéma RAID 1 montrant des partitions système EFI distinctes sur /dev/sda1 et /dev/sdb1, ainsi que les partitions racine ext4 et swap en miroir sur /dev/sda et /dev/sdb
Configuration RAID 1 avec des partitions système EFI distinctes et les partitions racine et swap en miroir sur les deux disques.

Notre système est maintenant redondant, car même si un disque venait à défaillir, le système serait toujours en mesure de démarrer. Cependant, nos partitions EFI ne se synchronisent pas; et c'est ce que nous allons mettre en place juste après.

Activation du RAID mdadm pour les partitions EFI

  • D'abord créer une nouvelle partition mdadm pour /boot/efi sans le disque sda1 (on a besoin de conserver les données qui se trouvent à l'intérieur). (Note: metadata 1.0 est nécessaire pour booter en EFI) :
root@host:~# mdadm --create /dev/md100 --level 1 --raid-disks 2 --metadata 1.0 /dev/sdb1 missing
mdadm: partition table exists on /dev/sdb1
Continue creating array? yes
mdadm: array /dev/md100 started.
  • Formater la nouvelle partition RAID en FAT32 :
root@host:~# mkfs.fat -F32 /dev/md100
  • Copier le contenu de la partition /dev/sda1 vers le RAID mdadm :
root@host:~# mkdir /tmp/RAID; mount /dev/md100 /tmp/RAID
root@host:~# apt update && apt install rsync
root@host:~# rsync -av --progress /boot/efi/ /tmp/RAID/
  • Maintenant, ajouter la partition /dev/sda1 au RAID mdadm:
root@host:~# umount /dev/sda1
root@host:~# mdadm --manage /dev/md100 --add /dev/sda1
mdadm: added /dev/sda1
  • Éditer le fichier de configuration /etc/fstab et remplacer le UUID associé au /boot/efi avec le nouvel UUID (en utilisant blkid /dev/md100) ou directement en précisant /dev/md100 :
UUID=0848963c-06bb-4f8b-9531-7a8bd2dee947 /               ext4    errors=remount-ro 0       1
# /boot/efi was on /dev/sda1 during installation
#OLD : UUID=D849-15E6  /boot/efi       vfat    umask=0077      0       1
/dev/md100  /boot/efi       vfat    umask=0077      0       1
# swap was on /dev/md102 during installation
UUID=8225ac96-677e-4fae-8f6b-28eac6c15a74 none            swap    sw              0       0
  • Ajouter la configuration de /dev/md100 dans le fichier mdadm.conf :
root@host:~# mdadm --detail --scan | grep 100 >> /etc/mdadm/mdadm.conf
  • Mettre à jour l'image initramfs (image de boot) :
root@host:~# update-initramfs -u
update-initramfs: Generating /boot/initrd.img-6.1.0-18-amd64
  • Vérifier l'état des raid mdadm :
root@host:~# cat /proc/mdstat
md100 : active raid1 sda1[2] sdb1[0]
      48064 blocks super 1.0 [2/2] [UU]
      
md0 : active raid1 sdb2[1] sda2[0]
      18537472 blocks super 1.2 [2/2] [UU]

md1 : active (auto-read-only) raid1 sda3[0] sdb3[1]
      2363392 blocks super 1.2 [2/2] [UU]
      	resync=PENDING
      
unused devices: <none>

💡 Note : Comme mentionné dans une discussion sur Stack Exchange (https://unix.stackexchange.com), l'array RAID swap md1 restera dans l'état PENDING jusqu'à ce qu'il commencera à être utilisé. En d'autres termes, il ne passera pas à l'état actif tant que le système n'aura pas besoin d'écrire dessus.

  • Terminé! Nous avons donc un système UEFI RAID1 totalement redondant et fonctionnel :
Schéma RAID 1 entièrement redondant montrant les partitions EFI en miroir dans /dev/md100, les partitions racine ext4 en miroir dans /dev/md0 et les partitions swap en miroir dans /dev/md1 sur /dev/sda et /dev/sdb
Configuration UEFI RAID 1 entièrement redondante avec les partitions EFI, racine et swap en miroir sur les deux disques.

Gérer l'écriture sur la partition EFI avant le démarrage

Comme expliqué dans cet excellent article : https://outflux.net/blog/, il peut arriver que l'UEFI écrive ou mette à jour (un fichier BootOptionCache.dat) à l'intérieur de la partition ESP (par exemple, lors d'une mise à jour du firmware), ce qui signifie écrire avant que le RAID mdadm ne soit assemblé et provoque la corruption du RAID de la partition ESP. Pour gérer cela, je vais utiliser sa solution, qui consiste à exécuter une resynchronisation du RAID ESP à chaque démarrage du système.

  • Modifier le fichier /etc/fstab pour désactiver le montage automatique de /dev/md100 :
UUID=0848963c-06bb-4f8b-9531-7a8bd2dee947 /               ext4    errors=remount-ro 0       1
/dev/md100  /boot/efi       vfat    umask=0077,noauto,defaults      0       0
# swap was on /dev/md102 during installation
UUID=8225ac96-677e-4fae-8f6b-28eac6c15a74 none            swap    sw              0       0
  • Modifier le fichier /etc/mdadm/mdadm.conf et désactiver la construction automatique du RAID pour la parition EFI :
#OLD ENTRY: ARRAY /dev/md100 meta=1.0 name=debian:100 UUID=11111111-2222-3333-4444-555555555555
ARRAY <ignore> meta=1.0 name=debian:100 UUID=11111111-2222-3333-4444-555555555555
  • Créer un fichier /etc/systemd/system/mdadm_esp.service :
[Unit]
Description=Resync /boot/efi RAID
DefaultDependencies=no
After=local-fs.target

[Service]
Type=oneshot
ExecStart=/sbin/mdadm -A /dev/md100 --uuid=11111111-2222-3333-4444-555555555555 --update=resync
ExecStart=/bin/mount /boot/efi
RemainAfterExit=yes

[Install]
WantedBy=sysinit.target
  • Activer le service mdadm_esp :
root@host:~# systemctl enable mdadm_esp.service
  • Mettre à jour l'initramfs :
root@host:~# update-initramfs -u