LVM (Logical Volume Manager)

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
  1. 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.
  2. 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.

Liens externes

Laisser un commentaire

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