Comment étendre un RAID1 mdadm en RAID5 sur un système UEFI
- Mise à jour le 15 févr. 2025
J'ai déjà expliqué comment créer un RAID1 sur un système UEFI avec mdadm sous Debian. Vous pouvez retrouver ce merveilleux tutoriel ici. Je vais maintenant expliquer comment étendre un RAID1 mdadm sur un système UEFI en RAID5, car il est courant d'avoir besoin de plus d'espace disque au fil du temps.
Dans cet article, je suppose qu'un RAID1 UEFI, configuré avec deux disques de 20G, est déjà parfaitement fonctionnel. Un troisième disque de 20G sera ajouté pour former un RAID5.
Et comme je suis de bonne humeur, je vais vous montrer comment le faire avec et sans LVM (oui, oui, ne me remerciez pas ! En fait, si, vous pouvez le faire… 😊).
⚠️Avant toute chose, comme toujours lorsqu'il s'agit de configuration de disques, il est essentiel de réaliser une sauvegarde. Les données seront tout simplement irrécupérables si le serveur redémarre pendant le processus (très long !) de conversion de RAID1 en RAID5. Vous voila prévenu !⚠️
Est-ce que ça fonctionne?
J'ai effectué plusieurs tests lors de la rédaction de cet article. En effet, après avoir migré la partition root (qui inclut ici la partition /boot/) vers un RAID5, le système ne démarrait plus normalement et basculait en mode de récupération GRUB. Ce qui est étrange, c'est que le système démarre normalement si l'on entre d'abord dans le menu de démarrage UEFI et que l'on sélectionne manuellement l'une des partitions de démarrage EFI. J'ai observé ce comportement sur VMware ESXi et Proxmox VE. Heureusement, cela semble fonctionner hors machine virtuelle : j'ai testé avec succès sur un Dell PowerEdge T630. Si vous avez une explication, je serais ravi de l'entendre !

En résumé, faites toujours des sauvegardes. Idéalement, testez avant de passer en production.
Maintenant que vous êtes prévenu, passons au tutoriel !
Ajout du nouveau disque
Comme expliqué dans l’introduction, nous commençons avec un RAID1 UEFI fonctionnel.
- Notre configuration disque est la suivante : deux disques (sda et sdb) configurés en RAID1 et un nouveau disque ajouté (sdc) :

Conversion du RAID1 en RAID5
- Identifier le nouveau disque afin d'éviter d'en supprimer un existant. Ici, nous avons notre disque sdc sans partition configurée, ce qui indique qu'il s'agit bien de notre nouveau disque :
root@host:~# fdisk -l
Disk /dev/sda: 20 GiB, 21474836480 bytes, 41943040 sectors
Disk model: Virtual disk
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: F89D780E-776F-4CFF-A096-2F13B8435BE4
Device Start End Sectors Size Type
/dev/sda1 2048 98303 96256 47M EFI System
/dev/sda2 98304 39159807 39061504 18.6G Linux RAID
/dev/sda3 39159808 41940991 2781184 1.3G Linux RAID
Disk /dev/sdb: 20 GiB, 21474836480 bytes, 41943040 sectors
Disk model: Virtual disk
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 580CC43C-5BED-45D4-B2B5-FD460A3EC1A1
Device Start End Sectors Size Type
/dev/sdb1 2048 98303 96256 47M EFI System
/dev/sdb2 98304 39159807 39061504 18.6G Linux RAID
/dev/sdb3 39159808 41940991 2781184 1.3G Linux RAID
Disk /dev/sdc: 20 GiB, 21474836480 bytes, 41943040 sectors
Disk model: Virtual disk
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
- Une autre manière d'identifier le nouveau disque est d'utiliser la commande cat /proc/mdstat. Ici, nous voyons nos RAID pour sda et sdb :
root@host:~# cat /proc/mdstat
Personalities : [raid1] [linear] [multipath] [raid0] [raid6] [raid5] [raid4] [raid10]
md100 : active raid1 sda1[0] sdb1[2]
48064 blocks super 1.0 [2/2] [UU]
md1 : active (auto-read-only) raid1 sda3[0] sdb3[1]
1388544 blocks super 1.2 [2/2] [UU]
md0 : active raid1 sda2[1] sdb2[0]
19513344 blocks super 1.2 [2/2] [UU]
- Installer l’outil gdisk :
root@host:~# apt update && apt install gdisk
- Copier le schéma des partitions de sdb vers sdc en utilisant gdisk :
root@host:~# sgdisk /dev/sdb -R /dev/sdc
- Régénérer un GUID pour le disque sdc afin d’éviter qu’il ait le même que sdb copié précédemment :
root@host:~# sgdisk -G /dev/sdc
- Après ces commandes, les partitions de notre disque sdc devraient être définies :

- Ajouter une entrée EFI nommée debian3 pour la partition EFI du disque sdc :
root@host:~# efibootmgr --create --disk /dev/sdc --part 1 --label "debian3" --loader "\EFI\debian\shimx64.efi"
- Ajouter le disque sdc1 à l’array RAID1 md100. Notez que nous ne convertissons pas notre partition UEFI en RAID5, car le système de démarrage n'est pas capable de lire une partition RAID5 :
root@host:~# mdadm --grow /dev/md100 --raid-devices=3 --add /dev/sdc1
- Notre array md100 est maintenant un RAID1 composé de trois partitions :

- Cette commande convertit l’array en RAID5 et ajoute la partition sdc2 à l’array md0 (SYSTEM). (Optionnel, mais envisagez d’utiliser l’option --backup-file ce qui pourrait aider en cas de crash système durant l’opération) :
root@host:~# mdadm --grow /dev/md0 --raid-device=3 --level=5 -a /dev/sdc2
- Vérifier la progression du reshaping (⚠️ Ne pas redémarrer le système tant que le reshaping est en cours ⚠️) :
root@host:~# cat /proc/mdstat
cat /proc/mdstat
Personalities : [raid1] [linear] [multipath] [raid0] [raid6] [raid5] [raid4] [raid10]
md100 : active raid1 sdc1[3] sdb1[0] sda1[2]
48064 blocks super 1.0 [3/3] [UUU]
md1 : active (auto-read-only) raid1 sda3[0] sdb3[1]
1388544 blocks super 1.2 [2/2] [UU]
md0 : active raid5 sdc2[2] sda2[0] sdb2[1]
19513344 blocks super 1.2 level 5, 64k chunk, algorithm 2 [3/3] [UUU]
[>....................] reshape = 0.3% (77596/19513344) finish=37.5min speed=8621K/sec
- Notre array md0 est maintenant un RAID5 composé de trois partitions :

- Faire de même avec la partition sdc3 sur l’array md1 (SWAP) :
root@host:~# mdadm --grow /dev/md1 --raid-device=3 --level=5 -a /dev/sdc3
- Notre array md1 est maintenant également un RAID5 avec trois disques :

Redimensionner les partitions
Redimensionner le système de fichiers
- Une fois le reshaping terminé, redimensionner le système de fichiers pour s’adapter à la nouvelle taille (exemple ici avec le système de fichiers ext4) :
root@host:~# resize2fs /dev/md0
- Vérifier que la nouvelle taille a bien été prise en compte :
root@host:~# df -h
Filesystem Size Used Avail Use% Mounted on
udev 1.9G 0 1.9G 0% /dev
tmpfs 392M 700K 391M 1% /run
/dev/md0 37G 2.3G 33G 7% /
tmpfs 2.0G 0 2.0G 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
/dev/md100 47M 5.9M 41M 13% /boot/efi
tmpfs 392M 0 392M 0% /run/user/0
tmpfs 392M 0 392M 0% /run/user/1000
Redimensionner le Swap
Pour la partition swap, il est nécessaire de la désactiver puis de la recréer. Cette modification implique de mettre à jour les entrées dans /etc/fstab et /etc/mdadm/mdadm.conf.
- Désactiver le swap :
root@host:~# swapoff /dev/md1
- Créer une nouvelle partition swap prenant en compte la nouvelle taille, et copier le nouvel UUID :
root@host:~# mkswap /dev/md1
mkswap: /dev/md1: warning: wiping old swap signature.
Setting up swapspace version 1, size = 2.6 GiB (2843734016 bytes)
no label, UUID=dfefc270-893d-4c77-930e-94d2985c9ab3
- Notez que l’on peut récupérer l’UUID avec la commande blkid :
root@host:~# blkid /dev/md1
/dev/md1: UUID="dfefc270-893d-4c77-930e-94d2985c9ab3" TYPE="swap"
- Modifier le fichier /etc/fstab et mettre à jour l’entrée du swap en y incluant le nouvel UUID :
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# systemd generates mount units based on this file, see systemd.mount(5).
# Please run 'systemctl daemon-reload' after making changes here.
#
# <file system> <mount point> <type> <options> <dump> <pass>
# / was on /dev/md0 during installation
UUID=869d77af-e5b0-4f17-bfd8-79245b6915d6 / ext4 errors=remount-ro 0 1
# /boot/efi was on /dev/sda1 during installation
#UUID=4FE8-AC32 /boot/efi vfat umask=0077 0 1
#/dev/md100 /boot/efi vfat umask=0077 0 1
/dev/md100 /boot/efi vfat umask=0077,noauto,defaults 0 1
# swap was on /dev/md1 during installation
#OLD SWAP ENTRY: UUID=42f44cc3-025d-4a22-8510-647ff25338de none swap sw 0 0
UUID=dfefc270-893d-4c77-930e-94d2985c9ab3 none swap sw 0 0
#/dev/sr0 /media/cdrom0 udf,iso9660 user,noauto 0 0
- Ensuite, modifier le fichier /etc/initramfs-tools/conf.d/resume et remplacer l’UUID comme pour le fichier /etc/fstab :
RESUME=UUID=dfefc270-893d-4c77-930e-94d2985c9ab3
- Générer une nouvelle image initramfs pour appliquer les modifications :
root@host:~# update-initramfs -u
- Activer le swap :
root@host:~# swapon /dev/md1
- Vérifier la taille du swap :
root@host:~# swapon --show
NAME TYPE SIZE USED PRIO
/dev/md1 partition 2.6G 0B -2
Avec LVM
C’est pratiquement la même chose, à la différence que nous devons utiliser la commande pvresize pour que notre LVM prenne en compte le nouvel espace. Comme on peut le voir, LVM apporte une grande flexibilité.
- Supposons que nous ayons cette configuration LVM :

- Copier le schéma des partitions de sdb vers sdc en utilisant gdisk :
root@host:~# sgdisk /dev/sdb -R /dev/sdc
- Régénérer un GUID pour le disque sdc afin d’éviter qu’il ait le même que celui de sdb copié précédemment :
root@host:~# sgdisk -G /dev/sdc
- Ajouter une entrée EFI nommée debian3 pour la partition EFI du disque sdc :
root@host:~# efibootmgr --create --disk /dev/sdc --part 1 --label "debian3" --loader "\EFI\debian\shimx64.efi"
- Ajouter la partition sdc1 à l’array RAID1 md100 :
root@host:~# mdadm --grow /dev/md100 --raid-devices=3 --add /dev/sdc1
- Ajouter la partition sdc2 et convertir l’array en RAID5 :
root@host:~# mdadm --grow /dev/md0 --raid-device=3 --level=5 -a /dev/sdc2
- Vérifier la progression du reshaping (⚠️ Ne pas redémarrer le système tant que le reshaping est en cours ⚠️) :
root@host:~# cat /proc/mdstat
- Une fois le reshaping terminé, étendre le LVM :
root@host:~# pvresize /dev/md0
- Redimensionner le système de fichiers de chaque volume logique que vous souhaitez agrandir :
root@host:~# lvextend -r -L+2G /dev/mapper/vgos-lvhome