Ridimensionare un volume RAID

Scenario: due dischi da 2Tb partizionati con parted in modalità GPT, per ogni disco una sola partizione che occupa l'intero spazio disponibile. Le due partizioni sono assemblate come volume raid5 (due dischi su tre, quindi lavora in modalità degradata).

Obiettivo: si vuole allocare spazio per creare altre partizioni.

Anzitutto si rimpicciolisce il filesystem ext4. Lo facciamo un po' più piccolo di quello che dovrà essere il risultato finale:

umount /dev/md1
e2fsck -f /dev/md1
resize2fs /dev/md1 3.5T

Si verifica la dimensione in kilobyte del volume md1:

mdadm --detail /dev/md1
Array size: 3907023872
...

Si rimpicciolisce il volume md1; bisogna indicare la dimensione da occupare per ogni disco, il numero di kilobyte deve essere multiplo di 64. La dimensione risultante deve essere un po' superiore alla dimensione del filesystem in esso contenuto:

mdadm --grow /dev/md1 --size=1905891000

Si verifica che la dimensione sia diminuita:

mdadm --detail /dev/md1
Array size: 3811781632
...

Si cambia la dimensione della partizione, creandola un po' più grande del volume md1 che contiene. L'operazione deve essere fatta sui due dischi /dev/sdb e /dev/sdc.

parted /dev/sdb
print
rm 1
mkpart primary 1049kB 1958GB
quit

Dopo un reboot si tenta di assemblare il device md1, ma fallisce:

mdadm --assemble --scan -f /dev/md1
...
mdadm: failed to add /dev/sdb1 to /dev/md1: Invalid argument
mdadm: failed to add /dev/sdc1 to /dev/md1: Invalid argument

In effetti ricostruiamo il volume md1, ma con il parametro --assume-clean non verrà inizializzato e manterrà il suo contenuto precedente:

mdadm --create /dev/md1 -l5 -n3 --assume-clean /dev/sdb1 /dev/sdc1 missing
e2fsck -f /dev/md1

A questo punto possiamo espandere il volume md1 per occupare tutto lo spazio delle partizioni:

mdadm --grow /dev/md1 --size=max

Infine espandiamo il filesystem in modo che occupi tutto il volume md1:

resize2fs /dev/md1
e2fsck -f /dev/md1