Soit une machine, deux disques durs, des volumes RAID 1, pas d'usage de LVM (c'est pour les faibles/chiens, il faut croire :/ ). On veut redimensionner à la baisse (réduire la taille quoi) un volume RAID afin de récupérer de l'espace pour créer une nouvelle partition. Évidemment, on ne veut subir aucune perte de données. Pour ce faire, il faut bien évidemment que la taille finale de la partition redimensionnée soit supérieure à la taille totale des données qui y sont stockées. L'opération se fait à chaud, avec le système GNU/Linux installé sur la machine en cours d'exécution, pas de live.
Voilà ce que donne un cfdisk sur l'un des disques (le deuxième est identique) :
Nom Ind. Partition S. Fic. [Étiq.] Taille (Mo)
-------------------------------------------------------------------------------------------------------------------
Inutilisable 1,05 *
sda1 Amorce Primaire ext4 [boot] 999,30 *
sda2 Primaire linux_raid_m [mdresize:0] 10000,27 *
sda3 Primaire linux_raid_m [mdresize:1] 8998,46 *
sda4 Primaire swap 1475,77 *
« Inutilisable » est de l'espace libre mais on a le droit à 4 partitions primaires avec une table des partition MBR ; Deuxième partition (sda2) : système ; Troisième : données.
Ici, c'est la partition sda3 (qui forme, avec sdb3 la grappe RAID 1 md1) que nous voulons redimensionner pour la passer d'environ 9G à environ 7G.
/dev/md1 8,3G 147M 7,7G 2% /home
Voici les différentes étapes pour y parvenir :
1) umount /dev/md1
2) e2fsck -f /dev/md1
3) On réduit la taille du système de fichiers : resize2fs /dev/md1 7G
4) On réduit la taille du conteneur, c'est-à-dire le volume RAID : mdadm --grow /dev/md1 --size=7G
5a) On sort la première partition de la grappe RAID : mdadm /dev/md1 --fail /dev/sda3 --remove /dev/sda3
6a) On redimensionne la partition (ici : sda3) avec fdisk ou (mon préféré) cfdisk : d (supprimer) - [ 3 -] n (nouvelle) - p (primaire) - 7500M - debut - type : DA (ou FD, "l'ancien" « linux raid autodetect ») - w (écrire). Oui, 7500M est supérieur aux 7G désirés mais c'est volontaire : être sûr que la partition ne soit pas plus petite que le conteneur RAID qu'elle va recevoir. Si vous avez une table des partitions GPT, il suffit d'utiliser gdisk pour cette étape, ça marche tout pareil : d - 3 - n - 3 - +7500M - DA - w . Les autres étapes restent inchangées
7a) On reintègre la partition à la grappe RAID : mdadm -a /dev/md1 /dev/sda3
8a) On attend le resync RAID. Pour voir la progression : watch cat /proc/mdstat
On recommence les étapes 5 à 8 avec la deuxième partition qui constitue md1) :
5b) mdadm /dev/md1 --fail /dev/sdb3 --remove /dev/sdb3
6b) cfdisk - d - [ 3 -] n - p - 7500 - debut - type : DA - écrire
7b) mdadm -a /dev/md1 /dev/sdb3
8b) Attente resync RAID
Note : oui, on pourrait être plus bourrin c'est-à-dire stopper le RAID et modifier directement la taille des deux partitions, sans resync.
9) On démonte le RAID sinon la prochaine étape ne peut pas fonctionner (ressource occupée) : mdadm --stop /dev/md1
10) On informe le noyau que les tables des partitions ont changées, sans rebooter bien sûr (cette commande fait partie du package parted chez Debian) : partprobe . La commande « blockdev --rereadpt » (package util-linux) fait le job tout aussi bien.
11) Si on tente de monter le RAID, mdadm nous informera que les superblocks sont endommagés et qu'il ne peut donc pas assembler la grappe. Nous allons réécrire les headers : mdadm --create /dev/md1 --level=1 --raid-devices=2 /dev/sda3 /dev/sdb3
mdadm nous informe que : « /dev/sda3 appears to be part of a raid array ; /dev/sdb3 appears to be part of a raid array ; /dev/sda3 appears to contain an ext2fs file system ; /dev/sdb3 appears to contain an ext2fs file system », ce qui est une bonne chose.
12) On actualise mdadm.conf pour que tout fonctionne au prochain reboot : mdadm --detail --scan >> /etc/mdadm/mdadm.conf
Attention : penser à effacer le(s) doublon(s) à la mano dans mdadm.conf. Penser également à mettre à jour fstab ou crypttab s'ils utilisent l'UUID de la grappe RAID comme identifier (ls -lh /dev/disk/by-uuid pour trouver le nouvel UUID de la grappe RAID). Évidemment, si la grappe RAID redimensionnée héberge le système GNU/Linux, il faut reconstruire l'initramfs : update-initramfs -u
13) e2fsck -f /dev/md1
Si jamais le message suivant s'affiche :
« La taille du système de fichiers (selon le superbloc) est de 1835008 blocs
La taille physique du périphérique est de 1830368 blocs
Le superbloc ou la table des partitions est peut-être corrompue !
abort ? » -> répondre : n
14) resize2fs /dev/md1
15) N'est pas utile mais par sécurité : e2fsck -f /dev/md1
On ajuste la taille du conteneur ainsi que la taille du système de fichiers à celle de la partition :
16) mdadm --grow /dev/md1 -z max
17) resize2fs /dev/md1
Résultat :
Nom Ind. Partition S. Fic. [Étiq.] Taille (Mo)
------------------------------------------------------------------------------------------------------------------
Inutilisable 1,05 *
sda1 Amorce Primaire ext4 [boot] 999,30 *
sda2 Primaire linux_raid_m [mdresize:0] 10000,27 *
sda3 Primaire linux_raid_m [mdresize:1] 7501,46 *
Inutilisable 1497,01 *
sda4 Primaire swap 1475,77 *
/dev/md1 6,9G 142M 6,4G 3% /home
Autre ressource intéressante :
http://www.howtoforge.com/how-to-resize-raid-partitions-shrink-and-grow-software-raid