rss logo

Comment étendre un RAID1 mdadm en RAID5 sur un système UEFI

Figure de Ghostbusters II représentant le RAID dans mdadm.

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 !

Illustration des problèmes de démarrage dans les environnements virtualisés (VMware et Proxmox) après la migration d'un système vers RAID5, montrant les différents menus de démarrage, le mode de secours GRUB et les écrans de sélection de démarrage EFI.
Problèmes de démarrage après une migration RAID5 sur VMware et Proxmox, nécessitant une sélection manuelle du démarrage EFI..

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) :
Diagramme illustrant le schéma de partitionnement RAID1 avec des partitions système EFI, des partitions racine ext4 et des partitions d'échange sur deux disques (sda et sdb), ainsi qu'un disque supplémentaire de 20 Go non alloué (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 :
Diagramme illustrant la transition de RAID1 à RAID5 avec l'ajout d'un troisième disque (sdc), comprenant une partition EFI, une partition RAID 18G et une partition d'échange RAID 2G.
  • 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 :
Diagramme montrant la conversion de RAID1 en RAID5, incluant maintenant une partition EFI sur le troisième disque (sdc), avec des partitions RAID synchronisées pour l'espace système et l'espace d'échange.
  • 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 :
Diagram illustrating the final RAID5 configuration, with three disks (sda, sdb, sdc) synchronized, including EFI partitions, RAID5 for the system, and RAID1 for swap.
  • 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 :
Configuration RAID5 finale avec trois disques synchronisés (sda, sdb, sdc), incluant les partitions EFI, RAID5 pour la partition système, et RAID5 pour la partition swap.

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 :
Diagramme illustrant une configuration RAID1 avec des partitions LVM, y compris des partitions EFI, des volumes logiques pour boot, root, usr, var, tmp, home et swap, sur deux disques synchronisés (sda et sdb), avec un disque supplémentaire non alloué (sdc).
  • 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
Creative Commons License
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.

Contact :

contact mail address