Comment et pourquoi copier la partition de boot (EFI) d'un raid-1 sous Linux avec mdadm
Martin Kirchgessner, 2023-11-05
On m'a posé la question par e-mail ; tant qu'a rédiger une réponse je me suis dit que ça pouvait être partagé ici.
Sur un serveur Linux, nous avons deux disques installés en RAID1 logiciel avec mdadm. Donc Linux gère la copie intégrale des deux disques. Tout ? Il y a pourtant une différence :
sda 8:0 0 931,5G 0 disk
├─sda1 8:1 0 500M 0 part /boot/efi
├─sda2 8:2 0 500M 0 part
│ └─md0 9:0 0 499M 0 raid1 /boot
└─sda3 8:3 0 930G 0 part
└─md1 9:1 0 929,8G 0 raid1 /
sdb 8:16 0 931,5G 0 disk
├─sdb1 8:17 0 500M 0 part
├─sdb2 8:18 0 500M 0 part
│ └─md0 9:0 0 499M 0 raid1 /boot
└─sdb3 8:19 0 930G 0 part
└─md1 9:1 0 929,8G 0 raid1 /
D'où la question de mon collègue :
C'est quoi la différence entre la partition /boot/efi de sda et "raid1 /boot" de /md0 ? Devrai-je créer une nouveau volume raid qui mette /boot/efi sur les deux disques ? ou le /boot suffit ? L'idée c'est que le pc boot sur un des deux disques et pas sur un seul
⚙ La différence entre /boot/efi et /boot
/boot/efi
ne sert qu'au BIOS.
Elle s'appelle EFI à cause du standard UEFI.
Vous vous souvenez peut-être d'avoir déjà réglé dans le BIOS l'ordre de démarrage des disques ?
C'est parce qu'au démarrage, le BIOS va gratter les disques dans l'ordre donné,
à la recherche d'une partition compatible EFI au début de chaque disque.
La première trouvée à gagné :
c'est pour ça que c'est la première du disque, et c'est aussi comme ça qu'on peut démarrer sur une clé USB.
Dans notre cas, /boot
est une brave partition Linux.
C'est le répertoire où on met ce qui est nécessaire au démarrage du Linux en question : le noyau et un peu de config associée.
La machine en question monte donc md0
sur /boot
puis sda1
sur /boot/efi
.
Note |
---|
/boot peut être directement la partition de démarrage, car de toute façon ce qui intéresse le BIOS se trouve dans un répertoire EFI dans la partition qu'il trouve. |
🌶️ La subtilité
Le BIOS ne sait lire que le FAT32.
Donc sda1
est formatée en FAT32.
Les autres partitions sont de type "Linux RAID" ce qui créé les /dev/mdX
(ce sont md0
et md1
qu'on formate en ext4).
C'est à dire que Linux gère la copie... ce qui suppose d'avoir un Linux qui tourne.
En fait le BIOS ne lance pas Linux, il lance Grub. C'est Grub qui sait comment lire le raid et ext4, et vraiment lancer le système. Il peut lancer autre chose que Linux (ceux qui multibootent savent), d'ailleurs même les Mac pratiquent l'UEFI.
Bref, un BIOS boote toujours avec un seul disque. Mais puisqu'on s'est embêtés à faire un RAID1, est-ce qu'on ne pourrait pas s'arranger pour qu'il ait toujours deux disques prêts à démarrer ?
Eh bien oui :
🖇️ Redondance de la partition EFI
Il y a deux techniques :
- utiliser l'option
--metadata 1.0
demdadm
- cf. https://unix.stackexchange.com/a/325229 . Les meta v1 ont la particularité d'être à la fin de la partition. Ça tombe bien, le BIOS ne va pas chercher loin : il lit les disques par le début comme si c'était des cassettes. Donc avec cette option on créé/dev/md0
, que l'on formate en FAT32 et qui peut servir directement de/boot
et voilà. Tant que le BIOS la trouve en début de disque, il n'y verra que du feu : l'ordre des partitions est important. - la copie à la main (plus ou moins automatisée, selon les religions). Une fois qu'on a tout installé sur
sda1
, elle consiste à créersdb1
en tant que partition FAT32, la monter sur/boot/efi2
, et faire
rsync -t --recursive --delete /boot/efi/ /boot/efi2/
La technique 1 ne peut pas se faire depuis l'installeur ubuntu (à ma connaissance), donc notre serveur est parti pour la technique 2.
A l'occasion je découvre LE wiki "Linux Raid" qui à l'air très recommandable, et qui m'apprend que les disques durs récents utilisent pour certains une technique appelée SMR qui marche vraiment mal en RAID. Je confirme, c'est arrivé au serveur en question 😬.
Comme quoi, on en apprend tous les jours.