Préambule
LVM est une gestion logique de vos volumes de disques sur Linux, cela vous permet de vous abstenir de la dépendance matérielle de de ses contraintes et de ses limites physiques. Vous pouvez ainsi définir des volumes logiques sur plusieurs disques physiques, manipuler les volumes et partitions online et sans interruption de service, etc.

Le LVM ne dépend pas du filesystem, puisqu’il se défini au niveau matériel des volumes de l’OS, vous pouvez donc manipuler des volumes logique comme tout volume physique, partitionner, formater, etc.
La granularité des VG et des VL est très fine et LVM vous permet de manipuler des Volumes Logiques au niveau des Volumes physiques (HardDisk) et / ou des partitions de volumes physiques.
Volumes Physiques (Physical Volumes / PV)
Introduction
Un « Physical Volume » (ou PV) est le « marquage » pour LVM d’un volume physique ou logique éligible au sein de la virtualisation du stockage apportée par la couche LVM. Le niveau le plus bas dans LVM est en effet le volume physique, comme au sein de votre système, et il faut pour cela lui indiquer que volume physique réél ou quel volume logique ou encore quelle portion d’un volume réél (physique ou logique) est éligible à être utiliser en tant que PV par LVM.
En fait, il faut simplement redéfinir la notion de périphérique physique pour LVM, et celle-ci peut s’appuyer sur tout ou partie (100%, 10Gb, etc) d’un volume physique (un disque dur, un disque flash, etc) ou d’un volume logique (d’une partition).
Création
Pour indiquer à LVM que tout ou partie d’un disque ou d’une partition est éligible à être utilisé en tant que PV par LVM il faut utiliser la commande « pvcreate
« , celle-ci peut prendre divers options, en voici quelques exemples pour les plus communes:
root@SERV007:~# lsscsi ... [32:0:1:0] disk VMware Virtual disk 2.0 /dev/sdc [32:0:2:0] disk VMware Virtual disk 2.0 /dev/sdb root@SERV007:~# parted /dev/sdc mklabel msdos && parted /dev/sdc mkpart primary ext4 1MB 50% Information: You may need to update /etc/fstab. root@SERV007:~# pvcreate /dev/sdb Physical volume "/dev/sdb" successfully created. root@SERV007:~# pvcreate /dev/sdc1 Physical volume "/dev/sdc1" successfully created.
Dans cet exemple qui va nous suivre dans le reste du post, nous avons trois périphériques réels de type « Disque Dur » qui sont utilisés tels que :
- /dev/sdb volume physique utilisable à 100% par LVM en tant que PV
- /dev/sdc1 partition de 50% du volume physique /dev/sdc utilisable par LVM en tant que PV
Manipulations
Liste des PV
La liste des PV s’obtient par la commande « pvdisplay
» telle que:
root@SERV007:~# pvdisplay --- Physical volume --- ... "/dev/sdb" is a new physical volume of "15,00 GiB" --- NEW Physical volume --- PV Name /dev/sdb VG Name PV Size 15,00 GiB Allocatable NO PE Size 0 Total PE 0 Free PE 0 Allocated PE 0 PV UUID 1LAMzw-ZIZi-xLUw-s6DB-yMey-4zFO-ZLoCyQ "/dev/sdc1" is a new physical volume of "<7,50 GiB" --- NEW Physical volume --- PV Name /dev/sdc1 VG Name PV Size <7,50 GiB Allocatable NO PE Size 0 Total PE 0 Free PE 0 Allocated PE 0 PV UUID lLcUup-NyPr-0i3X-ieP9-VoQV-dkZ1-mhuo7b
- Vous pouvez constater que le champ « VG Name » est vide, car pour le moment, comme nous le verrons au paragraphe suivant, ces PV ne sont encore à ce stade associés à aucun VG.
- Notez que chaque PV dispose d’un UUID au même titre que tout volume physique
La liste des paramètres caractérisant un PV est la suivante:
- PV Name : Nom du PV, il porte le même que son volume réel père physique ou logique.
- VG Name : Nom du VG associé s’il existe.
- PV Size : Taille du PV. Si la mention « not usable » est présente, le PV n’est plus utilisable dans un autre VG que celui indiqué dans VG Name.
- Allocatable : Peut recevoir ou non des données.
- PE Size : Taille des extensions physique (équivalent des blocs sur un volume réel)
- Total PE : Nombre d’extensions physiques.
- Free PE : Nombre d’extensions physiques possibles.
- Allocated PE : Nombre d’extensions physiques utilisées.
- PV UUID : UUID du volume.
L’utilitaire « pvs
» vous permet rapidement d’avoir un résumé des infirmations sur tous les PV tel que :
root@SERV007:~# pvs PV VG Fmt Attr PSize PFree ... /dev/sdb lvm2 --- 15,00g 15,00g /dev/sdc1 lvm2 --- <7,50g <7,50g411111111
Lien PV / OS
D’un point de vue du système, ces PV sont vus comme des périphériques de type DISK standards, on peut le constater en consultant leur liste dans « /dev/disk/
» et vérifier que l’on retrouve leur signature unique (UUID) via « pvdisplay
» tel que :
root@SERV007:~# ls -laF /dev/disk/by-id/ | grep lvm ... lrwxrwxrwx 1 root root 9 déc. 1 10:57 lvm-pv-uuid-1LAMzw-ZIZi-xLUw-s6DB-yMey-4zFO-ZLoCyQ -> ../../sdb lrwxrwxrwx 1 root root 10 déc. 1 11:20 lvm-pv-uuid-lLcUup-NyPr-0i3X-ieP9-VoQV-dkZ1-mhuo7b -> ../../sdc1 root@SERV007:~# pvdisplay | grep "PV UUID" ... PV UUID lLcUup-NyPr-0i3X-ieP9-VoQV-dkZ1-mhuo7b PV UUID 1LAMzw-ZIZi-xLUw-s6DB-yMey-4zFO-ZLoCyQ
Redimensionnement
Pour redimensionner un PV, par exemple lorsque vous avez étendu un disque au sens de votre VM sur un Hyperviseur, ou alors dans le cas ou où vous avez agrandi une partition sur lequel est défini un PV, vous devez indiquer à LVM la nouvelle taille du PV, pour cela utilisez:
root@SERV007:~# pvresize /dev/sdc1 Physical volume "/dev/sdc1" changed 1 physical volume(s) resized or updated / 0 physical volume(s) not resized
Déplacement
Cette commande est à utiliser si vous souhaitez déplacer les blocks stockés dans un PV vers un autre PV, il suffi d’utiliser la commande « » pour cela, il faudra en dernier penser à enlever le PV source qui ne contient plus aucun ploc utilisé par LVM :
root@SERV007:~# pvcreate /dev/sdd Physical volume "/dev/sdd" successfully created. root@SERV007:~# pvmove -b /dev/sdc1 /dev/sdd root@SERV007:~# watch lvs -a -o+devices | grep sdd [pvmove0] MON_VG_01 p-C-aom--- 15.00g /dev/sdc1 11.72 /dev/sdc1(0),/dev/sdd(0)
Attention évidement, dans cet exemple /dev/sdd doit être déjà un PV dans un VG (voir plus bas).
Le commutateur » -b « indique que la commande doit se dérouler en background afin de pouvoir interroger son état via la commande « watch » en dessous et de suivre l’évolution du déplacement des blocks.
Vous pouvez suivre l’évolution du déplacement des bloc (ici à 11.72% copiés) issu de votre commande.
Une fois le déplacement supprimé, le PV source est libre, il faudra penser à le libérer (enlever le PV d’un VG éventuel et enlever le PV de l’éligibilité LVM). Mais ceci sera vu plus loin lorsque la notion de VG aura été parcourue.
Suppression
Pour supprimer le PV taggé sur le volume /dev/sdz, il faut utiliser:
root@SERV007:~# pvremove /dev/sdz Labels on physical volume "/dev/sdz" successfully wiped.
Groupe de Volumes (Volume Group / VG)
Introduction
Un Volume Groupe (ou VG) est la définition de l’agrégation de différents volumes physiques et/ou logiques en une seule entité logique, accessible comme un volume standard par le système et l’ensemble de vos commandes. Le système d’exploitation se chargera d’accéder aux différents volumes ou partitions composants votre VG lorsque vous écrirez dedans sans que vous ayez à vous préoccuper de la répartition de l’emplacement des différents blocs de données.
Différentes opérations seront en revanche disponibles pour les VG alors qu’elles ne le sont pas pour les volumes réels, physiques ou logiques (snapshots, encryption, etc).
Création
Pour créer un VG sur un PV (voir paragraphe précédent sur les volumes physiques) /dev/sdb ou sur une partition /dev/sdc1, il suffit d’utiliser la command « vgcreate
» telle que :
[root@SERVEUR scripts]# vgcreate MON_VG_01 /dev/sdb .. [root@SERVEUR scripts]# vgcreate MON_VG_02 /dev/sdc1 ..
A ce stade on dispose donc de deux VG, chacun basés pour le moment sur un PV chacun, l’un dédfini sur un volume physique /dev/sdb, l’autre sur un volume logique (une partition) /dec/sdc1. Comme dit précédemment, vous devez considérer « MON_VG_01 » et « MON_VG_02 » comme étant deux volumes exactement identiques pour vos commandes à un autre volume physique réel de cotre OS.
Les VG sont donc des enveloppes logiques qui permettent de définir une répartition virtuelle des espaces de stockage au sein d’une entité logique.
Manipulations
La liste des VG
La liste des VG s’obtient avec la commande « vgdisplay
» tel que :
root@SERV007:~# vgdisplay --- Volume group --- VG Name MON_VG_02 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 <7,50 GiB PE Size 4,00 MiB Total PE 1919 Alloc PE / Size 0 / 0 Free PE / Size 1919 / <7,50 GiB VG UUID tGqkDr-Qfaq-moL2-gRlG-FxL7-FDEG-OvcxxA --- Volume group --- VG Name MON_VG_01 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 <15,00 GiB PE Size 4,00 MiB Total PE 3839 Alloc PE / Size 0 / 0 Free PE / Size 3839 / <15,00 GiB VG UUID zzcvZ3-YFFF-iWwz-3AOt-hP2F-7HYx-vyR4Pm
Les éléments les plus importants que vous devez regarder en premier sont:
- VG Name : Le nom du VG
- VG Access : RW ou RO
- VG size : Taille maximale de votre VG de tous les PV dont il est composé
- VG UUID : L’UUID de votre VG.
Comme pour les PV, des informations supplémentaires agrégées peuvent être obtenues avec la commande « vgs
» tel que :
root@SERV007:~# vgs VG #PV #LV #SN Attr VSize VFree MON_VG_01 1 0 0 wz--n- <15,00g <15,00g MON_VG_02 1 0 0 wz--n- <7,50g <7,50g ubuntu-vg 1 3 0 wz--n- <28,00g 0
Les attributs définis par la colonne « Attr » sont:
- r,w : Read / Write
- z : Resizable
- x : Exported
- p : Partial (il manque des PV à votre VG)
- c,n,a,i : Allocation type [ (c)ontiguous, c(l)ing, (n)ormal, (a)nywhere, (i)nherited ]
- c : Cluster mode.
Composition d’un VG
La composition, d’un VG est une liste de PV, elle s’obtient en utilisant par exemple « pvdisplay
» vue précédemment tel que:
root@SERV007:~# pvdisplay | grep -B1 "VG Name" PV Name /dev/sdc1 VG Name MON_VG_02 -- PV Name /dev/sdb VG Name MON_VG_01 -- PV Name /dev/sda3 VG Name ubuntu-vg
Renommer un VG
Pour renommer un VG, il suffit d’utiliser la commande « vgrename
« , attention, il ne faudra pas ensuite oublier de mettre à jour les références aux points de montages où le nom de VG apparait, par exemple dans les scripts, ou encore potentiellement dans la fstab si les UUID ne sont pas utilisés pour définir les montages :
root@SERV007:~# vgrename MON_VG_02 MON_VG_03 Volume group "MON_VG_02" successfully renamed to "MON_VG_03" root@SERV007:~# vgs -v VG Attr Ext #PV #LV #SN VSize VFree VG UUID VProfile MON_VG_01 wz--n- 4,00m 1 0 0 <15,00g <15,00g zzcvZ3-YFFF-iWwz-3AOt-hP2F-7HYx-vyR4Pm MON_VG_03 wz--n- 4,00m 1 0 0 <7,50g <7,50g tGqkDr-Qfaq-moL2-gRlG-FxL7-FDEG-OvcxxA ubuntu-vg wz--n- 4,00m 1 3 0 <28,00g 0 efgDBR-Rtgc-wYx5-zWzL-spXV-OP6P-eqvA62
Note: Nous verrons après avoir abordé les « Volumes Logiques » (LV) que le renommage des VG provoque au sein de l’OS un renommage automatique du lien symbolique du nom « mapper » vers les noms des « Device Mapper » (DM) et donc ne pose pas de problème particulier pour être effectué online de ce point de vue. (Je ne m’étends pas plus loin sur le sujet vu que nous l’abordons au paragraphe suivant)/
Ajouter un PV à un VG
Pour ajouter un PV à un VG, il suffit de disposer d’un PV non affecté à aucun VG et d’étendre le VG à ce PV en utilisant la commande « vgextend
« :
1) Créons une deuxième partition avec les 50% de place disque libre qu’il reste sur /dev/sdc :
root@SERV007:~# parted /dev/sdc mkpart primary ext4 50% 100% && parted /dev/sdc print Information: You may need to update /etc/fstab. Model: VMware Virtual disk (scsi) Disk /dev/sdc: 16,1GB Sector size (logical/physical): 512B/512B Partition Table: msdos Disk Flags: Number Start End Size Type File system Flags 1 1049kB 8053MB 8052MB primary 2 8053MB 16,1GB 8053MB primary
2) Créons un PV sur la nouvelle partition /dev/sdc2 et ajoutons ce PV au VG « MON_VG_01 » en guise d’extension tel que:
root@SERV007:~# pvcreate /dev/sdc2 Physical volume "/dev/sdc2" successfully created. root@SERV007:~# vgextend MON_VG_01 /dev/sdc2 Volume group "MON_VG_01" successfully extended
3) Vérifions enfin que nous disposons bien de deux PV dans le VG « MON_VG_01 » :
root@SERV007:~# vgdisplay MON_VG_01 --- Volume group --- VG Name MON_VG_01 System ID Format lvm2 Metadata Areas 2 Metadata Sequence No 2 VG Access read/write VG Status resizable MAX LV 0 Cur LV 0 Open LV 0 Max PV 0 Cur PV 2 Act PV 2 VG Size 22,49 GiB PE Size 4,00 MiB Total PE 5758 Alloc PE / Size 0 / 0 Free PE / Size 5758 / 22,49 GiB VG UUID zzcvZ3-YFFF-iWwz-3AOt-hP2F-7HYx-vyR4Pm
Le champ « Cur PV » nous indique que le nombre de PV a bien augmenté et vaut maintenant « 2 », nous constatons que la taille maximale du VG est bien composé de celle du disque /dev/sdb (15Gb) et de la partition /dev/sdc2 (7.5Gb), donc un total de 22.5Gb environ indiqué par le champ « VG Size« .
Supprimer un PV d’un VG (réduction)
La suppression d’un PV /deb/sdb dans un VG « MON_VG_01 » se fait grâce à la commande « vgreduce
» tel que:
root@SERV007:~# vgreduce MON_VG_01 /dev/sdb Removed "/dev/sdb" from volume group "MON_VG_01"
Préambule: Prenons par exemple le cas d’un VG est composé de 3 PV, « pv01 », « pv03 » et « pv04 », tous les 3 utilisés et comportant des données, cependant, pour des raisons systèmes (probablement d’extension) nous voulons nous séparer de « pv03 » et donc le supprimer du VG, il faut donc dans un premier temps en déplacer les données sur un autre PV, puis le supprimer, sinon, nous allons « casser » notre VG.
Dans notre exemple, le PV « /dev/sdb » étant encore vide de données, nous pouvons effectuer la commande sans déplacement de block utilisés.
Nous pouvons vérifier que la taille de notre VG « MON_VG_01 » fait maintenant la taille de la partition /dev/sdc2, c’est à dire la même que celle du VG « MON_VG_02 » puisqu’il utilise comme unique PV 50% du disque /dev/sdc1 du même disque /dev/sdc :
root@SERV007:~# vgs VG #PV #LV #SN Attr VSize VFree MON_VG_01 1 0 0 wz--n- <7,50g <7,50g MON_VG_02 1 0 0 wz--n- <7,50g <7,50g
Suppression
La suppression de la définition d’un VG va impliquer la suppression de la définition du PV et de la définition de tout ce qu’il contient, c’est à dire de tous ses Volumes Logiques (LV), mais les PV resteront inchangés dans leur état. Cela équivaut à dire que tant que nous n’avez pas détruit un PV ou formaté le contenu d’une partition dont un PV fait partie, vous aurez toujours moyen de vous récupérer, même après la suppression « inopportune » d’un VG.
La suppression d’un VG se fait par la commande « vgremove
» tel que:
root@SERV007:~# vgremove MON_VG_02 Volume group "MON_VG_02" successfully removed
Note: Si le VG avait contenu des LV ou du contenu formaté, la commande vous en aurait averti et aurait demandé une confirmation avant de tout perdre.
Volume Logique (Logical Volume / LV)
Introduction
Si les VG sont une notion de répartition des volumes physiques sur des volumes logiques dans le cadre de la virtualisation du stockage sous Linux, les LV sont des répartitions de définitions de volumes logiques sur des emplacements disponibles au sein de VG.
Autrement dit, un LV est à LVM ce qu’une partition est au système d’exploitation, autrement dit, il est voué éventuellement à être formaté et monté sur un point de montage pour être exploité par un applicatif.
UN LV peut être ainsi réparti sur plusieurs PV au sein d’un VG, garantissant au système une répartition de charge et une scalabilité sans précédent auquel il ne peut pas avoir accès avec des volumes réels.
LVM permet donc au final de répartir les données de la définition d’une partition sur plusieurs volumes physiques et/ou logiques et d’être exploité de manière transparente par les applicatifs.
Création
Un Volume Logique (LV) prend part dans un VG, il suffit simplement d’indiquer la dimension que celui-ci va prendre, cela peut se faire de plusieurs façons :
- En octets
- En extensions LVM
- En Pourcentage (le plus souvent utilisé).
La commande à utiliser est « lvcreate
» tel que:
# Creation du LV MON_LV_01 d'une taille de 1G : root@SERV007:~# lvcreate -n MON_LV_01 -L 1G MON_VG_01 Logical volume "MON_LV_01" created. # Creation du LV MON_LV_02 d'une taille de 50% de libre dans le VG : root@SERV007:~# lvcreate -n MON_LV_02 -l 50%FREE MON_VG_01 Logical volume "MON_LV_02" created. # Creation du LV MON_LV_03 d'une taille de 100 extents LVM (sur "Total PE" max via vgdisplay) : root@SERV007:~# lvcreate -n MON_LV_03 -l 100 MON_VG_01 Logical volume "MON_LV_03" created.
Une fois que vous avez créé un LV dans un VG, vous disposez en fait, tra travers LVM, d’un nouveau périphérique de type stockage à disposition dans les mappers de Linux, présent dans le dossier « /dev/mapper/
» :
root@SERV007:~# ll /dev/mapper/ ... lrwxrwxrwx 1 root root 7 déc. 2 10:25 MON_VG_01-MON_LV_01 -> ../dm-3 lrwxrwxrwx 1 root root 7 déc. 2 10:26 MON_VG_01-MON_LV_02 -> ../dm-4 lrwxrwxrwx 1 root root 7 déc. 2 10:27 MON_VG_01-MON_LV_03 -> ../dm-5
Les périphériques de stockages sont ici nommés dynamiquement « /dev/dm-3
« , « /dev/dm-4
» et « /dev/dm-5
« , et leur nom respectifs le sont que des liens symboliques depuis le dossier « /dev/mapper/
» avec la norme : [ Nom d’un VG ]-[ Nom d’un LV ].
On peut donc faire référence à un LV via son nom de périphérique (non recommandé), via son nom de LV dans le dossier mapper (moyennement recommandé) ou encore par son UUID (recommandé).
Note: Si le nom de device mapper change, ou que le nom du VG change, ou le nom du LV change, l’UUID du LV lui ne changera jamais, c’est lui qu’on va choisir en premier pour pointer vers nos LVs. Par exemple, si vous indiquez dans la fstab un nom de LV ou un nom de VG et que, au fure et à mesure que le temps passe, vous avez besoin de changer un des deux noms (quelle qu’en soit la raison), vous ne rebooterez plus…
Manipulations
Lister et analyser les LV d’un VG
La commande pour lister les LV d’un système est « lvdisplay
» :
root@SERV007:~# lvdisplay --- Logical volume --- LV Path /dev/MON_VG_01/MON_LV_01 LV Name MON_LV_01 VG Name MON_VG_01 LV UUID 1uSrgW-Q8nc-F6bz-ET2W-b1sz-LHsc-8zCIFx LV Write Access read/write LV Creation host, time SERV007, 2024-12-02 10:25:41 +0100 LV Status available # open 0 LV Size 1,00 GiB Current LE 256 Segments 1 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 252:3 --- Logical volume --- LV Path /dev/MON_VG_01/MON_LV_02 LV Name MON_LV_02 VG Name MON_VG_01 LV UUID L1zQd5-tcWP-aTik-Hu2X-W0e2-wRxA-7hSj4g LV Write Access read/write LV Creation host, time SERV007, 2024-12-02 10:26:58 +0100 LV Status available # open 0 LV Size <3,25 GiB Current LE 831 Segments 1 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 252:4 --- Logical volume --- LV Path /dev/MON_VG_01/MON_LV_03 LV Name MON_LV_03 VG Name MON_VG_01 LV UUID FyhWG4-9Zsr-WDWt-dBf8-OTTf-pXAd-zQjTM2 LV Write Access read/write LV Creation host, time SERV007, 2024-12-02 10:27:24 +0100 LV Status available # open 0 LV Size 400,00 MiB Current LE 100 Segments 1 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 252:5
On peut vérifier ici que les LVs « MON_LV_01 », « MON_LV_02 » et « MON_LV_03 » précédemment créés dans le paragraphe précédent sont bien présents dans le VG « MON_VG_01 ».
Comme pour les VG, la commande « lvs
» permet d’avoir un résumé succinct de l’utilisation des LV sur votre système et leur état de manière condensée et résumée telle que :
root@SERV007:~# lvs -v LV VG #Seg Attr LSize Maj Min KMaj KMin Pool Origin Data% Meta% Move Cpy%Sync Log Convert LV UUID LProfile MON_LV_01 MON_VG_01 1 -wi-a----- 1,00g -1 -1 252 3 1uSrgW-Q8nc-F6bz-ET2W-b1sz-LHsc-8zCIFx MON_LV_02 MON_VG_01 1 -wi-a----- <3,25g -1 -1 252 4 L1zQd5-tcWP-aTik-Hu2X-W0e2-wRxA-7hSj4g MON_LV_03 MON_VG_01 1 -wi-a----- 400,00m -1 -1 252 5 FyhWG4-9Zsr-WDWt-dBf8-OTTf-pXAd-zQjTM2
L’avantage de cette commande est qu’elle rappelle les points principaux de « lvdisplay
» mais rajoute des colonnes bien pratiques telles que « Cpy%Sync » pour suivre l’évolution des copies d’extensions LVM de vos LVs.
Les attributs via la colonne « Attr » ont pour valeur possible:
- 1 : Type de volume : (m)irrored, (M)irrored without initial sync, (o)rigin, (p)vmove, (s)napshot, invalid (S)napshot, (v)irtual
- 2: Permissions: (w)riteable, (r)ead-only
- 3 : Politique d’allocation : (c)ontiguous, (n)ormal, (a)nywhere, (i)nherited
- 4 : fixed (m)inor
- 5 : State: (a)ctive, (s)uspended, (I)nvalid snapshot, invalid (S)uspended snapshot, mapped (d)evice present without tables, mapped device present with (i)nactive table
- 6 : device (o)pen
Autres colonnes pratiques:
- Move : PV source créé par la commande «
lvmove
» pendant qu’elle opère - Origin : LV source lors d’un snapshot (nous verrons cette notion plus loin)
- Snap% : Pourcentage d’utilisation d’un snapshot en cours
Formater et monter un LV
A ce stade, au même titre qu’un partitionnement standard de volume physique réel, vous pouvez formater un LV avec le système de fichiers de votre choix, le monter sur le directory de votre choix et l’utiliser avec vos applicatifs, par exemple:
root@SERV007:~# mkfs.xfs /dev/mapper/MON_VG_01-MON_LV_01 ... root@SERV007:~# mkfs.xfs /dev/mapper/MON_VG_01-MON_LV_02 ... root@SERV007:~# mkfs.xfs /dev/mapper/MON_VG_01-MON_LV_03 ... root@SERV007:~# mkdir -p /montages/lv01 && root@SERV007:~# mkdir -p /montages/lv02 && root@SERV007:~# mkdir -p /montages/lv03 root@SERV007:~# root@SERV007:~# mount /dev/mapper/MON_VG_01-MON_LV_01 /montages/lv01 root@SERV007:~# mount /dev/mapper/MON_VG_01-MON_LV_02 /montages/lv02 root@SERV007:~# mount /dev/mapper/MON_VG_01-MON_LV_03 /montages/lv03 root@SERV007:~# root@SERV007:~# df -hP Filesystem Size Used Avail Use% Mounted on tmpfs 392M 6,1M 386M 2% /run ... /dev/mapper/MON_VG_01-MON_LV_01 436M 34M 403M 8% /montages/lv01 /dev/mapper/MON_VG_01-MON_LV_02 3,2G 95M 3,1G 3% /montages/lv02 /dev/mapper/MON_VG_01-MON_LV_03 336M 27M 310M 8% /montages/lv03
Pour lister vos VG et vos LV montés sur vos filesystems, n’hésitez pas à utiliser la commande « lsblk
» très lisible à ce sujet , comme par exemple ici :
root@SERV007:~# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS loop0 7:0 0 63,9M 1 loop /snap/core20/2318 loop1 7:1 0 63,7M 1 loop /snap/core20/2434 loop2 7:2 0 87M 1 loop /snap/lxd/29351 loop3 7:3 0 89,4M 1 loop /snap/lxd/31333 loop4 7:4 0 38,8M 1 loop /snap/snapd/21759 loop5 7:5 0 44,3M 1 loop /snap/snapd/23258 sda 8:0 0 30G 0 disk ├─sda1 8:1 0 1M 0 part ├─sda2 8:2 0 2G 0 part /boot └─sda3 8:3 0 28G 0 part ├─ubuntu--vg2-ubuntu--lv--racine 252:0 0 18G 0 lvm / ├─ubuntu--vg2-lv--swap 252:1 0 6G 0 lvm [SWAP] └─ubuntu--vg2-lv--logs 252:2 0 4G 0 lvm /var/log sdb 8:16 0 15G 0 disk sdc 8:32 0 15G 0 disk ├─sdc1 8:33 0 7,5G 0 part └─sdc2 8:34 0 7,5G 0 part ├─MON_VG_01-MON_LV_01 252:3 0 436M 0 lvm /montages/lv01 ├─MON_VG_01-MON_LV_02 252:4 0 3,2G 0 lvm /montages/lv02 └─MON_VG_01-MON_LV_03 252:5 0 336M 0 lvm /montages/lv03
Augmenter un LV
L’augmentation d’un LV correspond aux mêmes règles qu’une création de LV en ce qui concerne le dimensionnement (en blocks, en pourcentage, en octets), elle se fait en utilisant la commande « lvextend
» en spécifiant son chemin complet via le dossier mapper telle que par exemple pour augmenter le LV « MON_LV_01 » avec la totalité de l’espace restant dans le VG « MON_VG_01 » :
root@SERV007:~# lvextend -l 100%FREE /dev/mapper/MON_VG_01-MON_LV_01 Size of logical volume MON_VG_01/MON_LV_01 changed from 1,00 GiB (256 extents) to <2,86 GiB (732 extents). Logical volume MON_VG_01/MON_LV_01 successfully resized. root@SERV007:~# lvs | grep MON_LV_01 MON_LV_01 MON_VG_01 -wi-a----- <2,86g
« MON_LV_01 » est bien passé de 1Gb à ~3Gb.
Attention: Si le LVS était formaté et monté sur un filesystem, il faut aussi redimensionner le filesystem car celui-ci ne connait que la taille maximale du LV avant son extension, la commande est différente pour chaque filesystem, pour les plus connus :
- ext2, etx3, etx4, zfs :
resize2fs
/dev/mapper/[ nom du VG ]-[ nom du LV ] - xfs :
xfs_growfs
/dev/mapper/[ nom du VG ]-[ nom du LV ] - etc (vous renseigner en fonction du filesystem désiré)
Réduire un LV
La réduction d’un LV se fait par la commande « lvreduce
« , attention, il vous incombe d’être certain que votre LV n’a plus besoin des blocks de données auquel vous allez le restreinte avec cette commande, exactement comme dans le cas d’une partition, auquel cas vous allez casser le LV et ses données seront irrécupérables : A manipuler avec précaution par exemple, la réduction du LV « MON_LV_01 » de 3Gb à 500Mb :
root@SERV007:~# lvreduce -L 500M /dev/mapper/MON_VG_01-MON_LV_01 WARNING: Reducing active logical volume to 500,00 MiB. THIS MAY DESTROY YOUR DATA (filesystem etc.) Do you really want to reduce MON_VG_01/MON_LV_01? [y/n]: y Size of logical volume MON_VG_01/MON_LV_01 changed from <2,86 GiB (732 extents) to 500,00 MiB (125 extents). Logical volume MON_VG_01/MON_LV_01 successfully resized.
Attention: Evidement, avant ce redimensionnement, vous aurez pris soin de réduire la taille du filesystem.
Suppression
La supression d’un LV se fait par la commande « lvremove
« , attention, cette commande est irréversible et vos données seront perdues ! Par exemple :
root@SERV007:~# lvremove /dev/mapper/MON_VG_01-MON_LV_01 Do you really want to remove and DISCARD active logical volume MON_VG_01/MON_LV_01? [y/n]: y Logical volume "MON_LV_01" successfully removed.
Opérations diverses
Backup / Restore
Les backups de la configuration de vos LVM sont possible via la commande « vgcfgbackup
« , celle-ci effectue alors un backup de la configuration (et non des données) de la structure de vos VG et de vos LV dans le dossier « /etc/lvm/backup/
« . Ceci vous permet de vous rattraper en cas d’erreur et de perte d’informations (erreur de renommage de PV, de VG ou de LV par exemple).
Il ne faut pas hésiter à aller dans le dossier de backup et lire le contenu des fichiers, vous y trouverez tous les noms, les UUID, etc, des PV, des VG, des LVs, en fait, tout ce qu’il vous faut pour remonter une configuration si vous l’avez perdue.
Pour restaurer complètement une configuration, vous pourrez utiliser la commande « vgcfgrestore
« . Par exemple :
root@SERV007:# /etc/lvm/backup# vgcfgbackup Volume group "MON_VG_01" successfully backed up. root@SERV007:# /etc/lvm/backup# ll total 16 drwx------ 2 root root 4096 déc. 2 12:10 ./ drwxr-xr-x 5 root root 4096 mai 7 2024 ../ -rw------- 1 root root 1705 déc. 2 12:10 MON_VG_01 root@SERV007:/etc/lvm/backup# vgcfgrestore MON_VG_01 Volume group MON_VG_01 has active volume: MON_LV_02. Volume group MON_VG_01 has active volume: MON_LV_03. WARNING: Found 2 active volume(s) in volume group "MON_VG_01". Restoring VG with active LVs, may cause mismatch with its metadata. Do you really want to proceed with restore of volume group "MON_VG_01", while 2 volume(s) are active? [y/n]: y Restored volume group MON_VG_01.
Snapshots
Préambule
Les snapshots de LVM sont à prendre au sens classique du terme (snapshot de VMs, snapshot de baie de disque, etc) : L’opération consiste à noter les nouvelles données d’un bloc affecté par une modification (insert, delete, update) de block pour au final ne disposer en espace consommé supplémentaire que celui utilisé par les blocs modifiés durant la totalité du snapshot dans le temps.
Utiliser un disque snapshoté consistera à utiliser un volume qui contient les blocs modifiés lorsque cela aura été le cas et des pointeurs vers les blocs non modifiés lorsque ceux-ci n’auront pas été modifiés. A tout instant, via ce jeu de pointeurs, nous aurons toujours la possibilité de choisir l’état d’un volume snapshoté modifié (consolidation) ou de revenir à l’état initial (restauration).
En tout état de cause, dans un cas d’école, un snapshot pourrait utiliser la totalité de la taille du volume source si tous les blocs étaient altérés par des modifications (ce qui ne se produit ausiment jamais dans la vraie vie), il faut donc être très attentif au taux de remplissage d’un snapshot, en effet, si celui-ci est rempli à 100% et que d’autres blocs sont modifiés pour la première fois, ils ne pourront plus être renseignés, et le snapshot sera inutilisable, on travaillera alors sans filet avec impossibilité de consolider le snapshot.
Création d’un snapshot
L’opération de création d’un snapshot consiste simplement en la création d’un LV de type SNAPSHOT en spécifiant la source du LV proprement dit : à vous de vous inquiéter comme nous l’évoquions ci dessus de la pace libre dans ce snapshot.
La commande à utiliser est « lvcreate
» tel que :
root@SERV007:~# lvcreate --snapshot -L 1G -n mon_snapshot /dev/MON_VG_01/MON_LV_01 Logical volume "mon_snapshot" created.
Dans cet exemple, nous avons choisi de faire un snapshot d’une taille max de 1G, mais toutes les options de choix de taille dans le cadre de la création d’un LV sont possibles comme vu précédemment.
Le fait de spécifier que ce LV est de type « snapshot » nous permet de vérifier son taux de remplissage avec la commande lvs :
root@SERV007:~# lvs LV VG #Seg Attr LSize Maj Min KMaj KMin Pool Origin Data% Meta% Move Cpy%Sync Log Convert mon_snapshot MON_VG_01 1 -wi-a----- 1,00g -1 -1 252 3 MON_LV_01 0.01 MON_LV_01 MON_VG_01 1 -wi-a----- 1,00g -1 -1 252 3 MON_LV_02 MON_VG_01 1 -wi-a----- <3,25g -1 -1 252 4
Notez donc ici que la colonne « Data% » indique le pourcentage de remplissage de votre snapshot « mon_snapshot » sur le VG « MON_VG_01 », c’est cette valeur que vous devez monitorer, à partir de 100%, vous ne pourrez plus utiliser le snapshot.
Restauration d’un snapshot (merge)
La restauration d’un snapshot consiste en l’annulation des blocs modifiés pris en compte par votre LV de type snapshot, le LV source va alors disposer de tous ses blocs sources d’origine avant modification.
Attention: Si plusieurs snapshots sont dépendants, n’oubliez pas de tous les restaurer en même temps au risque de retrouver des données applicatives inconsistantes dans la négative.
On parle aussi dans ce cas de « fusion » (merge) de snapshot.
Il vous faudra réaliser ces manipulations applicatifs éteints et partitions démontées à l’aide de la commande « lvconvert
» :
root@SERV007:~# umount /montages/lv01 root@SERV007:~# lvconvert --mergesnapshot /dev/mapper/MON_VG_01-MON_LV_01 Merging of volume MON_VG_01/mon_snapshot started. MON_VG_01/mon_snapshot: Merged: 100,00% root@SERV007:~# mount /dev/mapper/MON_VG_01-MON_LV_01 /montages/lv01
NB) Notez que si vous réalisez cette opération partitions montées (par exemple souvent dans le cas d’un LVM monté sur la racine /), il vous faudra alors rebooter pour une prise en compte.
Agrandissement d’un snapshot
L’agrandissement d’un snapshot ne correspond en fait que en l’agrandissement du LV de type snapshot, vous pouvez donc, comme n’importe que LV l’agrandir sur toute la surface disponible sur le VG auquel il appartient, vous n’avez que l’embarras du choix.
Extension automatique d’un snapshot
Afin d’éviter de rencontrer le remplissage à 100% d’un LV de snapshot et de rendre celui-ci obsolète, vous pouvez opter pour l’extension automatique des LV de type snapshot, attention évidement vous serez limité par l’espace disponible dans votre VG qu’il conviendra tout de même de surveiller.
Cette configuration est globale au comportement de LVM et s’effectue en modifiant « /etc/lvm.conf
» an modifiant les paramètres « snapshot_autoextend_threshold
» et « snapshot_autoextend_percent
» :
snapshot_autoextend_threshold
: Pourcentage de remplissage du snapshot à partir duquel celui-ci sera automatiquement augmenté (recommandé : 80)snapshot_autoextend_percent
: Pourcentage d’auto extension du LV dans le VG (recommandé 20)
N’oubliez pas de relancer le chargement de la configuration avec « systemctl reload lvm2-lvmetad
« .
Sauvegarde des données snapshotées
Comme nous l’avons vu, un snapshot n’est qu’un LVM d’un type spécial pour lequel le système maintient de façon virtuelle un filesystem via un jeu de pointeurs sur les blocs d’origine non altérés par des modifications. A ce titre, il est possible de monter ce filesystem sur un point de montage et d’en réaliser une copie de sauvegarde (un TAR par exemple) .
Exemple:
root@SERV007:~# mount -o ro /dev/mapper/MON_VG-01-mon_snapshot /mnt mount: block device /dev/MON_VG_01/mon_snapshot is write-protected, mounting read-only root@SERV007:~# tar -zcvf /sauvegardes/mon_snapshot.tar.gz /mnt root@SERV007:~# umount /mnt
Notez que le filesystem est monté en Read Only, en effet, si par mégarde un bloc est altéré par le filesystem du montage du snapshot, celui-ci sera irrémédiablement altéré et inutilisable.
Suppression d’un snapshot
La suppression d’un snapshot n’est que la suppression du LV de type snapshot dans son VG.
Vous perdez dans ce cas toutes les informations sur les blocs modifiés de votre LV source, vous ne pourrez plus restaurer le snapshot (revenir en arrière). L’espace dans votre VG vous sera réattribué et sera de nouveau utilisable pour toute autre opération LVM dans le VG.
Notez que l’opération peut prendre un peu plus de temps qu’une suppression standard car il va falloir que la liste des blocs modifiés se substitue sur le disque par la liste des blocs d’origine (consolidation).
Notez également que, une fois un snapshot supprimé, il est impossible d’annuler cette opération.
Divers opérations utiles
Backups automatique
Vous pouvez demander à LVM d’effectuer des backups automatiques des configurations de vos PV, de vos VG et de vos LV à chaque fois qu’une configuration de ceux-ci est touchée. Il faut pour cela ajouter le commutateur » –autobackup y » aux demandes de création, tel que :
root@SERV007:~# pvcreate /dev/sdb --autobackup y root@SERV007:~# vgcreate VG_TEST /dev/sdb --autobackup y root@SERV007:~# lvcreate -l 100MFREE -n LV_TEST VG_TEST --autobackup y
Toute modification déclenchera alors automatiquement la commande « vgcfgbackup
» provoquant un backup automatique de la configuration.