[Linux] Augmenter la taille d’un volume physique LVM

En installant votre VM sous Linux, vous avez pris soin d’utiliser LVM afin de pouvoir gérer les partitions plus facilement, ou juste pour utiliser sa super fonctionnalité qui permet de faire des snapshots des partitions. C’est mon cas, et on doit dire que les snapshots sont très utiles pour avoir des sauvegardes cohérentes, et ce, même si des fichiers sont modifiés pendant que votre tarball de sauvegarde est en train d’être généré.

Problème : il arrive un moment ou vous vous rendez compte que votre image disque est devenue trop petite. Vous l’agrandissez alors, mais LVM n’utilise pas automatiquement le nouvel espace libre.

Deux solutions :

  • Vous créez une deuxième partition LVM (et donc un nouveau volume physique (PV)) en utilisant l’espace libre puis vous l’assignez à votre groupe de volumes (VG) ;
  • Ou alors, si comme moi, vous aimez que ce soit propre (et franchement, deux partitions LVM côte-à-côte, c’est pas ce qu’il y a de plus propre), vous agrandissez la partition LVM existante et son volume physique (PV).

Ici, nous allons voir la deuxième solution.

Attention : nous allons modifier la table de partitionnement du disque ainsi que la structure de notre groupe de volume (VG) LVM. Il s’agit d’opérations risquées qui peuvent conduire à une perte de données. Prenez donc au préalable toutes les mesures qui vous paraîtront nécessaires (sauvegarde des données, snapshot de votre VM …).

Modifier de votre image disque

Si ce n’est pas déjà fait, nous allons commencer par agrandir notre image disque. Cette étape ne sera pas expliquée en détail dans ce tuto, mais est généralement relativement simple. Pour un Proxmox ou un ESXi, il suffit d’aller dans les paramètres de votre VM, puis de la rebooter pour appliquer la modification (UPDATE 13/12/2018 : les versions récentes de Proxmox ne nécessitent plus de reboot). Si vous utilisez VirtualBox, j’ai détaillé la procédure dans ce tuto.

Modification de la taille de la partition LVM

N’ayant pas de système avec une table de partition GPT sous la main, je détaillerais ici la procédure avec la commande fdisk, valable uniquement pour les tables de partition DOS (ce qui reste le plus courant sur les VM, à moins qu’elles soient en UEFI).

Nous allons commencer par identifier le volume physique (PV) que nous voulons agrandir. Pour cela, utilisez la commande pvs :

# pvs
  PV         VG      Fmt  Attr PSize  PFree
  /dev/sda2  vg-root lvm2 a--  13,69g 500,00m
  /dev/sdb1  vg-data lvm2 a--  60,00g   4,49g

Dans mon cas, je dispose de deux volumes physiques (PV) sur deux disques différents. En effet, pour des raisons de facilité de sauvegarde, j’ai séparer le système des données sur deux images disques différentes.

Ici, j’ai agrandi mon image disque contenant les données, passant de 60 Go à 150 Go. La partition à agrandir sera donc /dev/sdb1. On ouvre alors fdisk, puis on affiche la table de partition en tapant « p » :

# fdisk /dev/sdb

Bienvenue dans fdisk (util-linux 2.29.2).
Les modifications resteront en mémoire jusqu'à écriture.
Soyez prudent avant d'utiliser la commande d'écriture.


Commande (m pour l'aide) : p
Disque /dev/sdb : 150 GiB, 161061273600 octets, 314572800 secteurs
Unités : secteur de 1 × 512 = 512 octets
Taille de secteur (logique / physique) : 512 octets / 512 octets
taille d'E/S (minimale / optimale) : 512 octets / 512 octets
Type d'étiquette de disque : dos
Identifiant de disque : 0x3b8c5844

Périphérique Amorçage Début       Fin  Secteurs Taille Id Type
/dev/sdb1              2048 125829119 125827072    60G 8e LVM Linux

Ici, mon disque ne contient qu’une seule partition (la partition LVM), ce qui facilite un peu la chose. Mais il se peut que vous ayez d’autres partitions (comme la /boot si il s’agit de votre disque principal). On va donc noter les valeurs en rouge : le numéro de la partition (« 1 » dans mon cas, vu que c’est la seule) et son premier secteur (ici, « 2048 »).

Au passage, la partition LVM doit-être la dernière, sinon on ne pourra pas l’agrandir.

On vérifie qu’il y a bien de l’espace libre en tapant « F » :

Commande (m pour l'aide) : F
Espace non partitionné /dev/sdb : 90 GiB, 96636764160 octets, 188743680 secteurs
Unités : secteur de 1 × 512 = 512 octets
Taille de secteur (logique / physique) : 512 octets / 512 octets

    Début       Fin  Secteurs Taille
125829120 314572799 188743680    90G

Ici, je dispose bien de 90 Go non-partitionnés, tout est donc bon, pour l’instant.

fdisk ne nous permettant pas de redimensionner les partitions, nous allons donc la supprimer pour la recréer.

Ne vous inquiétez pas, la suppression d’une partition ne supprime que sa référence dans la table de partitionnement, les données sont toujours présentes sur le disque et ne sont pas effacées. En recréant la partition avec le même secteur de début, nous retrouveront donc toutes les données déjà présentes. De plus, fdisk n’effectue pas les modifications immédiatement : il met juste à jour sa représentation interne des partitions, et effectuera réellement les modifications à la fin, lorsque nous aurons terminé.

Afin de supprimer la partition, taper « d » puis le numéro de partition, si vous y êtes invité :

Commande (m pour l'aide) : d
Partition 1 sélectionnée
La partition 1 a été supprimée.

Puis on recréer la partition. Tapez « n ». Lorsqu’on vous demande le type de partition, tapez « p » (primaire) si son numéro était compris entre 1 et 4, ou « e » (étendue) si son numéro était supérieur ou égal à 5. Ensuite, lorsque vous y êtes invité, entrez son numéro ainsi que le premier secteur (nous les avons notés plus haut). Validez la valeur par défaut pour le dernier secteur, ce qui devrait permettre d’utiliser tout l’espace disponible. Enfin, si on vous demande de supprimer la signature de la partition existante, répondez Non.

Récapitulons : (les valeurs en rouge sont celles que nous avons notés plus haut)

Commande (m pour l'aide) : n
Type de partition
   p   primaire (0 primaire, 0 étendue, 4 libre)
   e   étendue (conteneur pour partitions logiques)
Sélectionnez (p par défaut) : p
Numéro de partition (1-4, 1 par défaut) : 1
Premier secteur (2048-314572799, 2048 par défaut) : 2048
Dernier secteur, +secteurs ou +taille{K,M,G,T,P} (2048-314572799, 314572799 par défaut) :

Une nouvelle partition 1 de type « Linux » et de taille 150 GiB a été créée.
La partition #1 contient une signature LVM2_member.

Voulez-vous supprimer la signature ? [O]ui/[N]on : n

Affichons la nouvelle table de partition :

Commande (m pour l'aide) : p
Disque /dev/sdb : 150 GiB, 161061273600 octets, 314572800 secteurs
Unités : secteur de 1 × 512 = 512 octets
Taille de secteur (logique / physique) : 512 octets / 512 octets
taille d'E/S (minimale / optimale) : 512 octets / 512 octets
Type d'étiquette de disque : dos
Identifiant de disque : 0x3b8c5844

Périphérique Amorçage Début       Fin  Secteurs Taille Id Type
/dev/sdb1              2048 314572799 314570752   150G 83 Linux

Tout va bien à l’exception du type de partition. Par défaut, fdisk créer une partition de type « Linux » (id : 83). Les partitions LVM sont de type « LVM Linux » (id : 8e).

Pour corriger cela, nous allons donc taper « t » puis lui indiquer que nous voulons que notre partition n°1 soit de type « 8e » (LVM).

Commande (m pour l'aide) : t

Partition 1 sélectionnée
Type de partition (taper L pour afficher tous les types) : 8e
Type de partition « Linux » modifié en « Linux LVM ».

On affiche de nouveau la table de partition :

Commande (m pour l'aide) : p
Disque /dev/sdb : 150 GiB, 161061273600 octets, 314572800 secteurs
Unités : secteur de 1 × 512 = 512 octets
Taille de secteur (logique / physique) : 512 octets / 512 octets
taille d'E/S (minimale / optimale) : 512 octets / 512 octets
Type d'étiquette de disque : dos
Identifiant de disque : 0x3b8c5844

Périphérique Amorçage Début       Fin  Secteurs Taille Id Type
/dev/sdb1              2048 314572799 314570752   150G 8e LVM Linux

Tout semble bon, ce coup-ci ! Nous demandons donc à fdisk d’effectuer les modifications sur le disque en tapant « w ».

Commande (m pour l'aide) : w
La table de partitions a été altérée.
Appel d'ioctl() pour relire la table de partitions.
Échec de relecture de la table de partitions.: Périphérique ou ressource occupé

Le noyau continue à utiliser l'ancienne table. La nouvelle sera utilisée lors du prochain démarrage ou après avoir exécuté partprobe(8) ou kpartx(8).

fdisk nous dit que la table de partition n’a pas pu être rechargée par le noyau après sa modification. C’est normal, des partitions sont montées sur ce disque.

On reboot donc la VM pour prendre en compte la nouvelle table de partition.

Mise à jour du volume physique

Regardons la taille de nos volumes physiques (PV) :

# pvs
  PV         VG      Fmt  Attr PSize  PFree
  /dev/sda2  vg-root lvm2 a--  13,69g 500,00m
  /dev/sdb1  vg-data lvm2 a--  60,00g   4,49g

Il fait toujours 60 Go. C’est normal, il faut dire à LVM que nous avons agrandi sa partition :

# pvresize /dev/sdb1
  Physical volume "/dev/sdb1" changed
  1 physical volume(s) resized / 0 physical volume(s) not resized

On vérifie à nouveau la taille de notre volume physique (PV) :

# pvs
  PV         VG      Fmt  Attr PSize   PFree
  /dev/sda2  vg-root lvm2 a--   13,69g 500,00m
  /dev/sdb1  vg-data lvm2 a--  150,00g  94,49g

Il fait bien désormais 150 Go. On vérifie notre groupe de volume (VG) :

# vgs
  VG      #PV #LV #SN Attr   VSize   VFree
  vg-data   1   2   1 wz--n- 150,00g  94,49g
  vg-root   1   2   0 wz--n-  13,69g 500,00m

Nickel ! Il a automatiquement pris en compte l’espace supplémentaire.

Si vous le souhaitez, il ne vous reste plus qu’à ajouter l’espace à vos volumes logiques (LV). Dans mon cas, je vais ajouter 20 Go à mon /home (je garde de l’espace libre pour les snapshots).

# lvresize --resizefs --size +20G /dev/mapper/vg--data-home
  Size of logical volume vg-data/home changed from 40,00 GiB (10239 extents) to 60,00 GiB (15359 extents).
  Logical volume vg-data/home successfully resized.
resize2fs 1.43.4 (31-Jan-2017)
Le système de fichiers de /dev/mapper/vg--data-home est monté sur /home ; le changement de taille doit être effectué en ligne
old_desc_blocks = 3, new_desc_blocks = 4
Le système de fichiers sur /dev/mapper/vg--data-home a maintenant une taille de 15727616 blocs (4k).

Et voilà ! Il a même fait le changement pendant que la partition était montée et utilisée par des programmes. C’est magique LVM, hein ? 🙂

7 réponses sur “[Linux] Augmenter la taille d’un volume physique LVM”

  1. Bonjour. Merci pour cet article.
    De mon côté, j’ai 3 partitions (sur un seul disque physique) :
    /dev/sda1 * 2048 499711 497664 243M 83 Linux
    /dev/sda2 501758 67106815 66605058 31,8G 5 Étendue
    /dev/sda5 501760 67106815 66605056 31,8G 8e LVM Linux

    Je souhaite agrandir la partition /dev/sda5.
    Pas de problème pour la supprimer. Par contre, dès que je veux la recréer (commande « n » puis « l » car elle est numérotée « 5 »), je reçois l’erreur suivante :

    « Valeur hors limites »

    En effet, je ne peux pas choisir de premier secteur en dehors de cette plage : 503806-67106815

    Savez-vous ce qui pose problème ?

    Merci beaucoup !

    1. Dans ce cas, à la place de la partie « Modifier de votre image disque », il faut étendre la taille du volume sur la baie. La procédure à suivre dépends de la baie que vous utilisez.

      Si le volume est monté dans un hyperviseur, il faudra peut-être lancer un rescan des volumes, voir redémarrer la VM pour que la nouvelle taille soit prise en compte.

      Si le volume iSCSI est monté directement sur la machine Linux, il faut le rescanner, généralement à l’aide de cette commande :

      # iscsiadm -m node --targetname -R

      Linux doit ensuite voir l’espace supplémentaire, et vous pouvez continuer à la partie « Modification de la taille de la partition LVM » 🙂

  2. merci bien.
    Suivant la version de fdisk vous n’aurez pas forcement l’option F, qui affiche la taille de la zone FREE. Utilisez alors la commande :
    #parted /dev/sda print free

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.