RSS Tags

C'est toi le titre


Comment et pourquoi copier la partition de boot (EFI) d'un raid-1 sous Linux avec mdadm

Martin Kirchgessner, 2023-11-05

Tags : linux  in_french 


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 :

  1. utiliser l'option --metadata 1.0 de mdadm - 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.
  2. la copie à la main (plus ou moins automatisée, selon les religions). Une fois qu'on a tout installé sur sda1, elle consiste à créer sdb1 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.