(Modifié le 13/04/2019)

LVM (Logical Volume Manager)

LVM (Logical Volume Manager) permet de gérer des partitions logiques, et non pas physiques, ce qui a notamment comme avantage de pouvoir plus facilement modifier leur taille.

Pré-requis

Partition non formatée

Il faut disposer d’une partition non formatée. Dans notre cas, il s’agit de /dev/sda9, qui dispose d’un peu plus de 300 Go de libres. Cette partition sera utilisée principalement pour gérer des images de machines virtuelles créées avec KVM.

# fdisk -l /dev/sda

Disk /dev/sda: 750.2 GB, 750156374016 bytes
255 têtes, 63 secteurs/piste, 91201 cylindres, total 1465149168 secteurs
Unités = secteurs de 1 * 512 = 512 octets
Taille de secteur (logique / physique) : 512 octets / 4096 octets
taille d'E/S (minimale / optimale) : 4096 octets / 4096 octets
Identifiant de disque : 0x73a05bd4

Périphérique Amorce  Début        Fin      Blocs     Id  Système
/dev/sda1   *        2048   102402047    51200000    7  HPFS/NTFS/exFAT
/dev/sda2       102402048   204802047    51200000    7  HPFS/NTFS/exFAT
/dev/sda3       204804094  1465147391   630171649    5  Étendue
La partition 3 ne débute pas sur une frontière de cylindre physique.
/dev/sda5       204804096   284803071    39999488   83  Linux
/dev/sda6       284805120   294567935     4881408   82  partition d'échange Linux / Solaris
/dev/sda7       294569984   392224767    48827392   83  Linux
/dev/sda8       392226816   802082815   204928000   83  Linux
/dev/sda9       802084864  1465147391   331531264   83  Linux

Installation du package LVM

Sur une distribution de type Debian/Ubuntu

sudo apt install lvm2

Création du volume physique PV

La mise en place de volumes logiques est un modèle à trois couches :

  • Volume physique
  • Volume groupe
  • Volume logique
# pvcreate /dev/sda9
  Writing physical volume data to disk "/dev/sda9"
  Physical volume "/dev/sda9" successfully created

On peut lister les volumes physiques avec la commande pvdisplay. Exemple :

# pvdisplay
  "/dev/sda9" is a new physical volume of "316,17 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sda9
  VG Name               
  PV Size               316,17 GiB
  Allocatable           NO
  PE Size               0   
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               ReKoL9-gneB-DXfg-5MpV-pKyP-n5Rl-TRdnXh

Création du Volume Groupe VG

Avant de pouvoir créer des volumes logiques, il faut avoir créé un Volume Group. Ceci s’effectue via la commande vgcreate. La syntaxe est la suivante :

vgcreate NOM-du-VG NOM-Du-PV

Exemple :

# vgcreate vmvg /dev/sda9
  Volume group "vmvg" successfully created

On peut vérifier que cela est répercuté au niveau du volume physique. Le paramètre VG Name est maintenant renseigné :

Informations via la commande vgdisplay. Par exemple :

# vgdisplay vmvg
  --- Volume group ---
  VG Name               vmvg
  System ID             
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  1
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                0
  Open LV               0
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               316,17 GiB
  PE Size               4,00 MiB
  Total PE              80940
  Alloc PE / Size       0 / 0   
  Free  PE / Size       80940 / 316,17 GiB
  VG UUID               kd3LKL-tMjA-eIq4-EhMs-LdWV-LFVl-2rBhk1

Création d’un volume logique LV

A ce niveau, il est possible de créer des volumes logiques sur notre VG, via la commande lvcreate, avec la syntaxe :

lvcreate -L[taille] -n[nom-du-lv] [nom-du-vg]

Dans notre exemple, ce serait :

lvcreate -L8000 -n vm_debian6 vmvg
 Logical volume "vm_wheezy" created

Cette commande créera un volume logique de 8 Go sur le volume groupe vmvg, et nommé vm_debian6.

On peut avoir la liste des LV créés avec la commande lvscan :

# lvscan
  ACTIVE            '/dev/vmvg/vm_wheezy' [7,81 GiB] inherit

La commande lvdisplay pour les détails d’un volume logique :

# lvdisplay
  --- Logical volume ---
  LV Path                /dev/vmvg/vm_wheezy
  LV Name                vm_wheezy
  VG Name                vmvg
  LV UUID                bOAd1B-Xg0e-Unj3-onj2-IZUY-k654-tqdvtd
  LV Write Access        read/write
  LV Creation host, time portable-vli, 2012-11-22 16:53:41 +0100
  LV Status              available
  # open                 0
  LV Size                7,81 GiB
  Current LE             2000
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           252:0

Les volumes logiques sont prêts à être utilisés par virt-manager…

Quelques commandes utiles

pvscan : liste les différents volumes physiques disponibles

# pvscan
  PV /dev/sda9   VG vmvg   lvm2 [316,17 GiB / 300,55 GiB free]
  Total: 1 [316,17 GiB] / in use: 1 [316,17 GiB] / in no VG: 0 [0   ]

vgscan : liste les différents volume groups

# vgscan
  Reading all physical volumes.  This may take a while...
  Found volume group "vmvg" using metadata type lvm2

lvscan : liste les différents volumes logiques

# lvscan 
  ACTIVE            '/dev/vmvg/vm_wheezy' [7,81 GiB] inherit
  ACTIVE            '/dev/vmvg/vm_debian6' [7,81 GiB] inherit

Supprimer un volume logique LV

Pour supprimer un volume logique, il suffit d’utiliser la commande lvremove, une fois que le volume logique est démonté. Exemple :

# lvscan
  ACTIVE            '/dev/vmvg/vm_wheezy' [7,81 GiB] inherit
  ACTIVE            '/dev/vmvg/vm_debian6' [7,81 GiB] inherit
  ACTIVE            '/dev/vmvg/vm_seven' [15,62 GiB] inherit
# lvremove /dev/vmvg/vm_wheezy 
Do you really want to remove active logical volume vm_wheezy? [y/n]:
  Logical volume "vm_wheezy" successfully removed
# lvscan
  ACTIVE            '/dev/vmvg/vm_debian6' [7,81 GiB] inherit
  ACTIVE            '/dev/vmvg/vm_seven' [15,62 GiB] inherit

Formatage du volume logique LV

Afin de pouvoir monter le volume logique, il est nécessaire de le formater auparavant, via les commandes mkfs. Par exemple, pour formater en ext4, on utilisera la commande :

mkfs -t ext4 /dev/vmvg/Vol1

On peut ensuite monter le volume comme une partition “normale” :

mkdir /Essai1
mount /dev/mvg/Vol1 /Essai1
df -h

Augmenter la taille d’une partition LVM

L’un des avantages principaux des volumes logiques est de permettre de redimensionner la partition “à la volée” ou presque, beaucoup plus facilement et sans perte de données par rapport à une partition physique.

Pour ce faire, il est possible d’utiliser la commande lvextend. Par exemple :

lvextend -L 12G /dev/vmvg/Vol1

va étendre la taille du volume logique à 12 GB.

lvextend -L +1G /dev/vmvg/Vol1

va ajouter 1 GB au volume logique. Il faut ensuite retailler le file system qui repose sur ce volume logique :

lvextend -l +1125 /dev/vmvg/Vol1

va ajouter le reste disponible du “volume groupe” (Free PE/Size) au volume logique. Il faut ensuite retailler le file system qui repose sur ce volume logique :

umount /dev/vmvg/Vol1
e2fsck -f /dev/vmvg/Vol1
resize2fs /dev/vmvg/Vol1
mount /dev/vmvg/Vol1

Réduire la taille d’une partition LVM

Nous vous montrons ici comment réduire un volume ou une partition LVM sous Linux en redimensionnant d’abord le système de fichiers, puis le volume logique.
Dans cet exemple, nous allons travailler sur la réduction du volume logique /var/centos/var de 10 Go à 5 Go.

Vue d’ensemble de Logical Volume Manager (LVM)

Avant de travailler à travers le processus de redimensionnement, il est important que vous compreniez d’abord quelques concepts de base autour des volumes physiques, des groupes de volumes, des volumes logiques et du système de fichiers.

  • Volume physique (PV) : Ceci peut être créé sur un disque physique entier (pensez à /dev/sda) ou sur une partition Linux.
  • Groupe de volume (VG) : Il est composé d’au moins un ou plusieurs volumes physiques.
  • Volume logique (LV) : C’est ce qu’on appelle parfois la partition, elle se trouve à l’intérieur d’un groupe de volume et a un système de fichiers écrit sur elle.
  • Système de fichiers : Un système de fichiers tel que ext4 sera sur le volume logique.

Comment diminuer ou rétrécir le volume logique

Pour diminuer la taille d’une partition LVM, vous devez d’abord diminuer le système de fichiers afin d’éviter une éventuelle corruption des données. Comme il est possible que cela se produise si vous entrez la commande incorrectement, il est fortement recommandé que vous ayez une sauvegarde complète de vos données avant de continuer. Réduire un volume logique vous donnera plus d’espace dans le groupe de volume, ce qui signifie que vous pourriez plutôt étendre un autre volume logique avec ce nouvel espace trouvé.

La première étape dépendra si vous cherchez à réduire le volume d’une racine LVM ou d’un volume non racine.
Réduire le volume d’une racine
Le volume de la racine serait typiquement le volume logique qui est monté sur /. Vous ne pouvez pas le démonter pour le rétrécir car il est utilisé par le système d’exploitation en cours d’exécution, ce qui signifie que vous devrez d’abord démarrer à partir d’un Live CD pour le faire.

Réduire un volume non racinaire
Alternativement, si le volume que vous réduisez est un volume non racine, c’est-à-dire tout autre volume non monté à la racine du système de fichiers, vous pouvez démonter le volume comme indiqué ci-dessous pour continuer. Veuillez noter que lorsque vous démontez le volume, les données ne seront pas disponibles, vous devrez peut-être planifier un temps d’arrêt et arrêter d’exécuter les applications qui utilisent les données avant de les démonter. Démonter en spécifiant soit le volume logique, soit l’emplacement où il est actuellement monté, dans l’exemple ci-dessous nous spécifions le volume logique qui peut être trouvé dans /dev/(vg-name)/(lv-name).

umount /dev/centos/var

Toutes les étapes suivantes s’appliquent maintenant à un volume racinaire ou non racinaire.
Avant de pouvoir tenter de réduire la taille d’un volume LVM, vous devez d’abord exécuter une vérification du système de fichiers. Si vous ne le faites pas, vous obtiendrez un message d’erreur et vous ne pourrez pas continuer. C’est une étape nécessaire car le redimensionnement d’un système de fichiers en mauvais état peut entraîner une corruption des données. L’option -f permet d’exécuter la vérification même si le système de fichiers semble propre, tandis que l’option -y suppose que toutes les questions sont répondues par l’affirmative et répondra si on lui demande de résoudre un problème.

e2fsck -fy /dev/centos/var

Ensuite, vous devez rétrécir le système de fichiers, pour être sûr, nous allons rétrécir le système de fichiers plus bas que ce à quoi le volume logique va rétrécir. C’est parce que nous ne voulons pas réduire accidentellement le volume logique à une taille inférieure à celle du système de fichiers à l’étape suivante, car cela peut entraîner la corruption et la perte de données. Ne t’inquiète pas, on récupérera l’espace à la fin.
La commande ci-dessous réduira la taille totale du système de fichiers de sorte qu’il ne soit que de 4G, notez que quelle que soit la taille que vous spécifiez de réduire à vous doit avoir en espace libre dans le système de fichiers sinon vous devez d’abord supprimer les données.

resize2fs /dev/centos/var 4G

Une fois le système de fichiers réduit, on peut réduire la taille du volume logique avec la commande lvreduce. Réduisez-le à la taille que vous voulez que le volume soit, comme spécifié par l’indicateur -L. Au lieu de cela, si vous voulez réduire d’une taille spécifiée, mettez simplement un - devant la taille. Les deux sont indiqués ci-dessous pour être complets, mais vous n’avez besoin d’en exécuter qu’un seul.

Pour réduire à 5G

lvreduce -L 5G /dev/vg/nom-disque

Réduire de 5G

lvreduce -L -5G /dev/vg/nom-disque

Une fois que vous exécutez la commande lvreduce, vous recevrez un avertissement vous indiquant la taille que vous avez choisi de réduire pour ainsi utiliser ceci comme une chance de confirmer que vous réduisez le volume logique à une taille qui n’est PAS plus petite que la taille à laquelle vous avez précédemment réduit le système de fichiers. Une fois que vous avez confirmé, il vous suffit d’entrer’y’ et d’appuyer sur’enter’.

Une fois que le volume logique a été réduit à la taille requise, exécutez resize2fs sur le volume car cela permettra d’étendre le système de fichiers pour utiliser tout l’espace disponible dans le volume logique. Cela permet d’utiliser tout l’espace libre restant afin qu’aucun espace ne soit gaspillé à partir du moment où nous avons précédemment réduit le système de fichiers à une taille inférieure à celle du volume logique.

resize2fs /dev/centos/var

Il ne reste plus qu’à monter le volume. S’il s’agit d’un volume racine et que vous travaillez dans un Live CD, redémarrez simplement dans votre système d’exploitation Linux principal.
S’il s’agissait d’un volume non racine et que vous l’avez démonté pour compléter la réduction, il suffit de le remonter. Vous pouvez le faire avec’mount -a’ en supposant que vous avez la configuration déjà définie dans /etc/fstab, sinon spécifiez le volume logique et où il doit être monté. Ici, nous montons manuellement sur /mnt juste pour tester.

mount /dev/centos/centos/var /mnt

Après avoir redémarré le système d’exploitation principal ou terminé le montage, vérifiez l’espace affiché avec la commande’df’ pour confirmer qu’il a été réduit comme prévu.

[root@CentOS7 /]# df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root  9.8G  1.4G  8.5G  14% /
devtmpfs                 908M     0  908M   0% /dev
tmpfs                    914M     0  914M   0% /dev/shm
tmpfs                    914M  8.6M  905M   1% /run
tmpfs                    914M     0  914M   0% /sys/fs/cgroup
/dev/sda1                497M   96M  402M  20% /boot
/dev/mapper/centos-var  4.8G   20M  4.6G   1% /mnt

Synthèse

Les commandes (exécution en mode su)

Pour lister tous les périphériques visibles :

lvmdiskscan

Pour afficher les PVs créés :

pvdisplay
pvs

Pour créer un disque physique :

pvcreate /dev/sdb

Pour agrandir le PV à la totalité du disque physique (/dev/sdb

pvresize /dev/sdb

Pour savoir quels PVs sont utilisés et par qui :

pvs -o+pv_used

Pour déplacer les données d’un PV vers un autre du même VG :

pvmove /dev/sdb /dev/sdc

Pour supprimer un PV non utilisé d’un VG :

vgreduce vg01 /dev/sdb

Pour supprimer un PV de LVM :

pvremove /dev/sdb

Pour créer un VG (vg01) dans le PV /dev/sdb :

vgcreate vg01 /dev/sdb

Pour afficher les VGs créés :

vgdisplay
vgs

Pour renommer un VG :

vgrename vg01 Newvg01

Pour ajouter un PV à un VG :

vgextend vg01 /dev/sdc

Pour créer un LV de 5GB (lv01) dans le VG vg01 :

lvcreate -L 5G -n lv01 vg01

Pour créer un LV en prenant la totalité de l’espace disponible :

lvcreate -l 100%FREE -n lv01 vg01

Pour créer un LV en prenant seulement 5% du VG :

lvcreate -l 5%VG -n lv01 vg01

Pour afficher les LV créés :

lvdisplay
lvs

Pour étendre un LV de 50GB :

lvresize -L +50G /dev/vg01/lv01

Pour réduire un LV de 5% de sa taille :

lvresize -l -5%LV /dev/vg01/lv01

Attention : Lorsque vous souhaitez agrandir un LV, un VG ou un PV, il faut bien évidement vérifier la couche au dessus de l’élément. Par exemple si vous voulez agrandir de 10GB le LV, il faut vérifier que le VG possède un espace non attribué de 10GB.

Pour renommer un LV :

lvrename lv01 Newlv01

Pour créer un FS dans le LV :

mkfs.ext4 /dev/vg01/lv01

Pour redimensionner le FS dû au redimensionnement du LV :

resize2fs /dev/vg01/lv01

Pour monter un répertoire dans le LV :

mkdir /data01
mount /dev/vg01/lv01 /data01