Linux sans magie #43 — Étendre une partition et son filesystem sans confondre les étapes

Comprendre pourquoi agrandir un disque Linux ne suffit pas, identifier les couches puis étendre une partition GPT et son filesystem ext4 de manière contrôlée.

Un système Linux manque d'espace disque. La capacité du support de stockage est augmentée, mais df -h annonce toujours la même capacité.

Le disque a pourtant bien grandi. Ce n'est pas contradictoire : le disque, la partition et le filesystem sont trois objets distincts. Leur taille ne change pas nécessairement ensemble.

Après avoir expliqué les tables de partitions dans le #41 et leur gestion avec fdisk et parted dans le #42, nous allons suivre le chemin de l'espace supplémentaire jusqu'aux applications.

Pourquoi df n'affiche pas la nouvelle capacité

Prenons un système Linux disposant d'un disque de 100 GiB, d'une partition GPT de 80 GiB et d'un filesystem ext4 occupant cette partition.

La capacité du disque passe à 150 GiB. Linux peut détecter 150 GiB tout en conservant une partition de 80 GiB. Le filesystem, lui, ne peut pas utiliser l'espace situé en dehors de sa partition.

disque : 150 GiB
  ├── partition GPT : 80 GiB
  │     └── filesystem ext4 : ~80 GiB
  └── espace non partitionné

L'extension doit donc traverser les couches :

capacité du disque
        ↓
limite de la partition
        ↓
taille du filesystem
        ↓
espace visible par les applications

Le symbole ~ rappelle que la capacité utile affichée dépend des métadonnées et réserves du filesystem.

Première vérification : quelle couche a réellement grandi ?

Avant toute écriture :

lsblk -o NAME,PATH,TYPE,SIZE,FSTYPE,MOUNTPOINTS
df -hT

lsblk décrit les block devices et leur organisation ; df décrit l'espace des filesystems montés.

Pour consulter la table du disque identifié :

sudo parted /dev/sdX unit MiB print free

/dev/sdX est un placeholder. Il ne faut jamais le remplacer en se fondant uniquement sur un exemple : le disque peut être nommé /dev/vdX ou /dev/nvmeXnY.

La commande print free permet de vérifier si de l'espace non alloué suit la partition. Cette relation est essentielle : étendre une partition ne revient pas à déplacer les partitions situées derrière elle.

L'ordre des opérations est déterminant

Dans le cas simple d'une partition finale et d'un filesystem direct, trois changements sont possibles :

1. La plateforme augmente la capacité du disque. 2. L'administrateur étend la limite de la dernière partition dans l'espace contigu libre. 3. Le filesystem est agrandi avec son outil spécifique.

Ne confondez pas ces étapes avec un redimensionnement LVM, un volume chiffré LUKS ou un RAID. Dans ces architectures, d'autres objets se trouvent entre le disque et le filesystem.

La sauvegarde et la validation des dépendances sont nécessaires avant toute modification réelle de partition.

Pourquoi les outils de filesystem diffèrent

FilesystemOutil d'extensionParticularité
ext4resize2fsLe device doit exposer la capacité supplémentaire
XFSxfs_growfsCroissance d'un filesystem monté
ext4 sur LVMlvextend puis resize2fsLe Logical Volume doit aussi grandir

Un outil de partitionnement ne formate ni n'agrandit automatiquement le filesystem. De même, resize2fs ne change pas lui-même la taille de la partition.

XFS n'accepte pas de réduction en place, contrairement à certains scénarios ext4 hors ligne. Il serait donc dangereux de déduire une procédure de réduction d'une procédure d'extension.

Mise en pratique : scénario GPT et ext4

Nous allons illustrer un cas simplifié : une unique partition ext4 sur un disque GPT, suivie d'espace disponible.

Prérequis : Linux récent, parted, losetup, e2fsprogs, lsblk et findmnt, avec des privilèges sudo et des loop devices autorisés. Durée indicative : 30 à 45 minutes.

Objectif vérifiable : augmenter un support de 256 à 384 MiB, conserver le début de la partition, étendre ext4 et retrouver un fichier témoin intact.

Un fichier image sert uniquement de cible reproductible. Ne transposez pas automatiquement ces commandes sur un disque hébergeant des données réelles.

Étape 1 — Créer un support et sa partition

LAB_DIR="$(mktemp -d)"
IMG="$LAB_DIR/disk.img"
truncate -s 256M "$IMG"
sudo parted -s "$IMG" mklabel gpt
sudo parted -s "$IMG" unit MiB mkpart primary ext4 1 200
sudo parted -s "$IMG" unit MiB print

Nous avons créé une table GPT et une partition qui commence à 1 MiB et se termine vers 200 MiB. mkpart définit la partition ; le mot ext4 ne crée pas de filesystem.

Étape 2 — Créer ext4 et déposer un témoin

LOOP="$(sudo losetup --find --show --partscan "$IMG")"
sudo udevadm settle
PART="${LOOP}p1"
test -b "$PART" || { echo "Partition non détectée" >&2; exit 1; }
sudo mkfs.ext4 "$PART"
mkdir "$LAB_DIR/mnt"
sudo mount "$PART" "$LAB_DIR/mnt"
printf 'données avant extension\n' | sudo tee "$LAB_DIR/mnt/temoin.txt" >/dev/null
df -hT "$LAB_DIR/mnt"

Le loop device représente l'image comme un block device. Sa partition doit apparaître sous un nom tel que /dev/loop0p1, mais le numéro varie selon l'hôte.

mkfs.ext4 est destructif sur sa cible. Il est ici réservé à la partition neuve créée par l'exercice. L'écriture du témoin rendra visible la conservation des données.

Étape 3 — Libérer la partition

sudo umount "$LAB_DIR/mnt"
sudo losetup -d "$LOOP"

Si le démontage échoue avec target is busy, identifiez les processus qui utilisent encore le filesystem : ne forcez pas le démontage. C'est précisément le diagnostic étudié dans le #40.

Étape 4 — Étendre le disque et la partition

truncate -s 384M "$IMG"
sudo parted -s -f "$IMG" unit MiB print free
sudo parted -s -f "$IMG" resizepart 1 360MiB
sudo parted -s "$IMG" unit MiB print

L'augmentation du fichier image laisse d'abord la partition inchangée. resizepart étend ensuite sa limite jusqu'à 360 MiB.

Une particularité de GPT mérite attention : une copie de son header est stockée en fin de disque. Lorsqu'un support grandit, cette copie peut devoir être replacée. Dans GNU Parted, -f accepte en mode script certaines corrections proposées par l'outil. Son emploi dans cet exemple est réservé à l'image créée pour le test ; il ne constitue pas une recommandation d'accepter automatiquement ces modifications en production.

Vérifiez que le début de la partition reste à 1 MiB et que seule sa fin augmente. Si la table est incohérente ou si l'espace libre n'est pas contigu, arrêtez la procédure.

Étape 5 — Étendre le filesystem ext4

Nous reconnectons le support modifié :

LOOP="$(sudo losetup --find --show --partscan "$IMG")"
sudo udevadm settle
PART="${LOOP}p1"
test -b "$PART" || { echo "Partition non détectée" >&2; exit 1; }
sudo e2fsck -f "$PART"
sudo resize2fs "$PART"

e2fsck vérifie le filesystem démonté et peut apporter des corrections. N'exécutez pas cette commande sur un filesystem monté en écriture. resize2fs utilise ensuite la taille de la partition disponible.

Si e2fsck signale un problème non résolu ou si une commande échoue, ne passez pas à l'étape suivante comme si de rien n'était.

Étape 6 — Vérifier le résultat

sudo mount "$PART" "$LAB_DIR/mnt"
lsblk -o NAME,SIZE,TYPE,FSTYPE "$LOOP"
df -hT "$LAB_DIR/mnt"
sudo cat "$LAB_DIR/mnt/temoin.txt"

Le disque doit mesurer 384 MiB, la partition doit être plus grande qu'avant l'extension et le filesystem monté doit afficher une capacité accrue.

Le témoin doit toujours contenir données avant extension. Ce dernier contrôle confirme une conservation élémentaire des données, pas l'intégrité exhaustive d'un système de production.

Procédure de diagnostic reproductible

Si df reste inchangé après augmentation du disque :

1. Vérifier le support

lsblk -o NAME,TYPE,SIZE

Si sa taille n'a pas changé, examinez d'abord la détection de capacité côté système et plateforme.

2. Examiner la table

sudo parted /dev/sdX print free

Vérifiez l'espace libre contigu et la position de la dernière partition.

3. Identifier le filesystem

lsblk -f
findmnt

Ne lancez pas resize2fs sur XFS ou sur le mauvais objet.

4. Contrôler la capacité finale

df -hT

La taille de la partition et celle du filesystem peuvent différer. Une extension de partition seule n'augmente pas automatiquement les données utilisables.

Sécurité

Une erreur de device lors de mkfs, resizepart ou d'une opération de table peut rendre un volume inaccessible. Faites correspondre les devices avec l'inventaire de la plateforme, les montages et les services hébergés.

Avant un changement réel, définissez une fenêtre de maintenance lorsque nécessaire, confirmez l'existence d'une sauvegarde restaurable, notez le début de chaque partition et prévoyez les conséquences d'un éventuel redémarrage.

Coûts

Les utilitaires Linux utilisés ne facturent pas l'extension. En revanche, une augmentation de volume cloud ou de stockage provisionné peut augmenter la facture, de même que les sauvegardes et snapshots. Les tarifs dépendent du fournisseur et du service concernés.

Limites et points de vigilance

Le scénario suppose une partition GPT finale suivie d'espace libre, un filesystem ext4 direct et aucun LVM, RAID ou chiffrement intermédiaire. Selon le matériel, le contrôleur ou le type de stockage, des étapes de détection et de relecture de table supplémentaires peuvent être nécessaires.

Les commandes du cas pratique ne sont pas une recette générique pour un disque système. Ce texte n'affirme pas qu'une exécution de ce scénario a été validée sur toutes les distributions.

Rollback et nettoyage

Après vérification, démontez le filesystem et détachez le loop device :

sudo umount "$LAB_DIR/mnt"
sudo losetup -d "$LOOP"
rmdir "$LAB_DIR/mnt"
rm -- "$IMG"
rmdir -- "$LAB_DIR"

Vérifiez les variables avant suppression et n'utilisez pas de nettoyage récursif. Sur un système réel, revenir à une taille plus petite ne constitue pas un rollback simple : la stratégie de restauration doit être préparée avant l'extension.

Références officielles

Conclusion

Agrandir le disque, agrandir sa partition et agrandir le filesystem sont des changements distincts. lsblk, parted et df permettent de voir précisément où l'extension s'est arrêtée.

La bonne méthode consiste à examiner chaque couche, préserver le début de la partition, utiliser l'outil propre au filesystem et vérifier les données après l'intervention.

Dans le #44, nous ajouterons une couche devenue courante en administration Linux : LVM, avec ses Physical Volumes, Volume Groups et Logical Volumes.