Agrandir un disque sous Linux avec LVM, sans redémarrer
Une VM dont le /var sature : étendre le disque côté hyperviseur, faire voir le nouvel espace au noyau, repousser la partition, puis pvresize, lvextend et resize2fs ou xfs_growfs. Avec les pièges.
La supervision remonte un /var à 94 %. La machine est une VM, son disque est un fichier posé sur une baie, et
il reste des téraoctets de libre sur le datastore. Sur le papier, c’est cinq minutes de travail. Dans les faits,
c’est l’opération qui fait transpirer, parce qu’elle touche à la table de partitions d’un serveur en production.
Bonne nouvelle : LVM a été inventé exactement pour ça. Mauvaise nouvelle : LVM ne s’occupe que de l’étage du milieu. Au-dessus et en dessous, il faut mettre les mains.
L’empilement, étage par étage
Section intitulée « L’empilement, étage par étage »Un volume logique, c’est un jeu de poupées russes. Chaque étage ignore ce qui se passe sous lui tant qu’on ne le lui a pas dit explicitement, et c’est pour cette raison que la manipulation compte six commandes au lieu d’une.
| Étage | Ce que c’est | Ce qui l’agrandit |
|---|---|---|
| Disque virtuel | Le VHDX ou le VMDK, vu par le système comme /dev/sda |
L’hyperviseur |
| Partition | /dev/sda5, de type 8e (Linux LVM) |
growpart, fdisk, parted |
| Volume physique (PV) | La carte que LVM pose sur la partition | pvresize |
| Groupe de volumes (VG) | La réserve d’espace commune | pvresize ou vgextend |
| Volume logique (LV) | /dev/vg-sys/var, la « partition » vue par l’admin |
lvextend |
| Système de fichiers | ext4 ou XFS, posé dans le LV | resize2fs, xfs_growfs |
Autrement dit : on remonte les étages un par un, du plus bas au plus haut, et on vérifie à chaque palier.
Prérequis
Section intitulée « Prérequis »- Un accès root sur la machine.
- Une sauvegarde récente et restaurable. Pas un snapshot : une vraie sauvegarde, sur un autre support.
- L’inventaire avant travaux, conservé ailleurs que sur la machine :
lsblkdf -hTpvs ; vgs ; lvsfdisk -l /dev/sdaCe dernier affichage est le plus important : notez les secteurs de début de chaque partition. Si la suite tourne mal, c’est la seule information qui permet de reconstruire la table à l’identique.
1. Étendre le disque côté hyperviseur
Section intitulée « 1. Étendre le disque côté hyperviseur »L’opération est la même partout : on ouvre les paramètres de la VM, on va sur le disque dur, on saisit la nouvelle taille. Sur un contrôleur SCSI virtuel, la VM peut rester allumée. Sur un vieux disque raccroché à un contrôleur IDE, l’hyperviseur exigera un arrêt.
Un disque virtuel ne se réduit pas. Et la valeur saisie est la taille totale visée, pas l’espace ajouté : confusion classique, suivie d’un refus de l’hyperviseur.
2. Faire voir le nouvel espace au noyau
Section intitulée « 2. Faire voir le nouvel espace au noyau »Le disque fait désormais 500 Go côté hyperviseur, et le système en voit toujours 300. Rien d’anormal : le noyau ne relit pas la géométrie d’un disque tout seul. On le lui demande :
lsblk /dev/sda
# cible connue (contrôleur:canal:cible:LUN)echo 1 > /sys/class/scsi_device/0:0:0:0/device/rescan
# variante large quand on ne sait pas lequelfor h in /sys/class/scsi_host/host*/scan ; do echo "- - -" > "$h" ; done
lsblk /dev/sdaSur un contrôleur paravirtualisé (virtio), la nouvelle taille est en général prise en compte sans rien faire :
vérifiez simplement avec lsblk. Et si, après le rescan, le disque affiche toujours son ancienne taille, ne
cherchez pas une demi-heure : redémarrez, c’est plus rapide.
3. Repousser la partition
Section intitulée « 3. Repousser la partition »La voie courte : growpart
Section intitulée « La voie courte : growpart »Tant que la partition LVM est la dernière du disque, growpart fait tout le travail : il recalcule le secteur
de fin, réécrit l’entrée et demande au noyau de la relire, sans démonter quoi que ce soit.
# Debian / Ubuntuapt install cloud-guest-utils# RHEL / Rocky / Oracle Linux / CentOSdnf install cloud-utils-growpart
growpart /dev/sda 5lsblk /dev/sdaNotez l’espace entre le disque et le numéro de partition : growpart /dev/sda 5, et non /dev/sda5.
La voie longue : fdisk sur un vieux MBR
Section intitulée « La voie longue : fdisk sur un vieux MBR »Le cas pénible, c’est la table MBR héritée : une partition étendue n°2 qui contient une partition logique n°5
de type LVM. growpart ne sait pas repousser un conteneur étendu. Il faut supprimer les deux entrées et les
recréer exactement au même point de départ, avec une fin plus lointaine.
L’enchaînement dans fdisk /dev/sda :
p: afficher la table et recopier les secteurs de début quelque part.d, puis2: supprimer la partition étendue.n,e, numéro2, le même premier secteur qu’avant, dernier secteur laissé par défaut.d, puis5: supprimer la logique quefdiska recréée au passage et qui ne correspond plus à rien.n,l: recréer une partition logique, dernier secteur par défaut.xpuisb: mode expert, replacer le début des données de la n°5 sur son secteur d’origine, puisrpour revenir en mode normal.t,5,8e: redonner le type Linux LVM, quefdiska remis à83en recréant la partition.p: comparer ligne à ligne avec ce que vous avez noté à l’étape 1.w: écrire.
fdisk se termine presque toujours par un « échec de relecture de la table de partitions : périphérique ou
ressource occupé ». C’est attendu : les partitions sont en cours d’utilisation. Essayez partprobe /dev/sda ou
partx -u /dev/sda ; si le noyau refuse encore, seul un redémarrage prendra la nouvelle table. C’est la seule
étape de toute la procédure qui coûte une coupure.
4. Étendre le volume physique, puis le volume logique
Section intitulée « 4. Étendre le volume physique, puis le volume logique »LVM, lui, n’est au courant de rien. On le prévient :
pvresize /dev/sda5pvsvgsLa colonne VFree du vgs doit afficher l’espace gagné. S’il reste à zéro, la partition n’a pas réellement
grandi aux yeux du noyau : retour à l’étape 3.
Ensuite, on donne cet espace au volume logique qui sature :
lvextend -l +100%FREE /dev/vg-sys/var# ou une quantité préciselvextend -L +150G /dev/vg-sys/var5. Étendre le système de fichiers
Section intitulée « 5. Étendre le système de fichiers »Dernier étage, et celui qu’on oublie : le volume logique est plus grand, mais le système de fichiers posé
dedans occupe toujours son ancienne surface. df -h ne bougera pas tant que vous n’aurez pas fait ceci :
# ext2 / ext3 / ext4, à chaud, volume montéresize2fs /dev/vg-sys/var
# XFS, à chaud, en passant le point de montagexfs_growfs /varPlus simple encore, quand fsadm est présent : lvextend -r enchaîne les deux opérations.
lvextend -r -l +100%FREE /dev/vg-sys/varVérifier, puis redémarrer quand ça vous arrange
Section intitulée « Vérifier, puis redémarrer quand ça vous arrange »df -hT /varlsblkvgs ; lvsEt surtout, planifiez un redémarrage dans la foulée, à une heure que vous choisissez. Une table de partitions approximative ne se manifeste qu’au démarrage suivant : autant que ce démarrage ait lieu un mardi à 18 h, avec vous devant l’écran et la sauvegarde sous la main, plutôt qu’un dimanche soir après une coupure électrique.
Pour aller plus loin
Section intitulée « Pour aller plus loin »- Quand la VM ne redémarre plus après une intervention : Restaurer une VM cassée par une mise à jour non supportée.
- Le premier consommateur de disque sur un serveur Linux moderne, et comment le tenir : Démarrer avec Docker sur un serveur.
- Le deuxième, souvent : MySQL, les tâches d’administration qui reviennent tout le temps.
- Les pages
man lvextend,man pvresizeetman growpartdétaillent toutes les options citées ici.