LVM sous Linux (Volumes Logiques)

Introduction



LVM (Logical Volume Manager, ou gestionnaire de volumes logiques en français) permet la création et la gestion de volumes logiques sous Linux. L'utilisation de volumes logiques remplace en quelque sorte le partitionnement des disques. C'est un système beaucoup plus souple, qui permet par exemple de diminuer la taille d'un système de fichier pour pouvoir en agrandir un autre, sans se préoccuper de leur emplacement sur le disque

Avantages de LVM :
  • Il n'y a pas de limitations « étranges » comme avec les partitions (primaire, étendue, etc.).
  • On ne se préoccupe plus de l'emplacement exact des données.
  • On peut conserver quelques giga-octets de libres pour pouvoir les ajouter n'importe où et n'importe quand.
  • Les opérations de redimensionnement deviennent quasiment sans risques, contrairement au redimensionnement des partitions.


Inconvénients de LVM :
  • Si un des volumes physiques devient HS, alors c'est l'ensemble des volumes logiques qui utilisent ce volume physique qui sont perdus. Pour éviter ce désastre, il faudra utiliser LVM sur des disques raid par exemple.



Quelques définitions



PV : Volumes physiques



Les disques durs, partitions de disques durs, volumes RAID ou unités logiques provenant d'un SAN forment des « volumes physiques » (physical volumes ou PV).

VG : Groupes de Volumes



On concatène ces volumes physiques (1 ou plusieurs) dans des « groupes de volumes » (volume groups ou VG).
Ces VG sont équivalents à des pseudo-disques-durs.

LV : Volumes logiques



Des « volumes logiques » (logical volumes ou LV) sont alors découpés dans les groupes de volumes, puis formatés et montés dans des systèmes de fichiers. Les LV sont équivalents à des pseudo-partitions.

FS : Système de fichiers



Des « systèmes de fichiers » (file system ou FS) est une façon de stocker les informations et de les organiser dans des fichiers. Ils disposent d'un point de montage et ont un type (ext4, xfs, btrfs)

Représentation visuelle



Je vous ai fait un petit schéma sur GIMP pour représenter tous les concepts ci-dessus dans une image, c'est parfois plus parlant :



Utiliser LVM



Pour manipuler le LVM, il faut évidemment avoir les droits root et être très prudent !

Les commandes LVM sont extrêmement simples à utiliser et portent des noms logiques :
  • toutes les commandes agissant sur les volumes physiques commencent par pv (pour physical volume);
  • toutes les commandes agissant sur les groupes de volumes commencent par vg (pour volumes group);
  • toutes les commandes agissant sur les volumes logiques commencent par lv (pour logical volume).



Manipulations



Dans l'article, je vais utiliser le disque sdb et sdc.

Démarrer les services



OpenRC



Pour les dérivées Gentoo, démarrer et activer les services lvm, lvmetad, lvm-monitoring :

Code BASH :
/etc/init.d/lvm start
/etc/init.d/lvmetad start
/etc/init.d/lvm-monitoring start
 
rc-update add lvm boot
rc-update add lvmetad boot
rc-update add lvm-monitoring boot


SystemD



Pour les systèmes utilisant systemd (comme les dérivées de Red Hat) lancer et activer les services lvm2-lvmetad, lvm2-monitor :

Code BASH :
systemctl enable  lvm2-lvmetad
systemctl enable lvm2-monitor
 
systemctl start lvm2-lvmetad
systemctl start lvm2-monitor


Prérequis LVM sur partition



Si, au lieu d'utiliser un disque entier en LVM on veut utiliser une partition, il faut donc créer une partition de type LVM sur tout le disque.
C'est utile dans certains cas, notamment si on veut faire du LVM sur le disque système, l'installation du chargeur d'amorçaue peut s'avérer compliqué.
Dans tous les cas, qu'on utilise une partition ou un disque entier, les manipulations sont identiques.

Code BASH :
fdisk /dev/sdb 


  • o (pour faire une table de partition MSDOS)
  • n (nouvelle partition)
  • p (type primaire)
  • 1 (num de partiton)
  • vide (début)
  • vide (fin)
  • t (type)
  • 8e (type LVM)
  • w (écrire)




Code BASH :
fdisk /dev/sdb 

Code TEXT :
Bienvenue dans fdisk (util-linux 2.23.2). 
 
Les modifications resteront en mémoire jusqu'à écriture. 
Soyez prudent avant d'utiliser la commande d'écriture. 
 
Le périphérique ne contient pas de table de partitions reconnue 
Construction d'une nouvelle étiquette pour disque de type DOS avec identifiant de disque 0x2660dada. 
 
Commande (m pour l'aide) : o 
Construction d'une nouvelle étiquette pour disque de type DOS avec identifiant de disque 0xb4087607. 
 
Commande (m pour l'aide) : n 
Type de partition : 
   p   primaire (0 primaire(s), 0 étendue(s), 4 libre(s)) 
  e   étendue 
Sélection (p par défaut) : p 
Numéro de partition (1-4, 1 par défaut) : 1 
Premier secteur (2048-2097151, 2048 par défaut) : 
Utilisation de la valeur 2048 par défaut 
Dernier secteur, +secteur ou +taille{K,M,G} (2048-2097151, 2097151 par défaut) : 
Utilisation de la valeur 2097151 par défaut 
La partition 1 de type Linux et de taille 1023 MiB est configurée 
 
Commande (m pour l'aide) : t 
Partition 1 sélectionnée 
Code Hexa (taper L pour afficher tous les codes) :8e 
Type de partition « Linux » modifié en « Linux LVM » 
 
Commande (m pour l'aide) : w 
La table de partitions a été altérée. 
 
Appel d'ioctl() pour relire la table de partitions. 
Synchronisation des disques.

Code BASH :
fdisk -l /dev/sdb 

Code TEXT :
Disque /dev/sdb : 1073 Mo, 1073741824 octets, 2097152 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 : 0xb4087607 
 
Périphérique Amorçage  Début         Fin      Blocs    Id. Système 
/dev/sdb1            2048     2097151     1047552   8e  Linux LVM 



Ou si disque de plus de 2To il faut faire une table de partitions GPT avec gdisk

On va ensuite passer au LVM.

Les PV



Créer un PV



Avant toute chose, il faut créer au moins un PV.
Un PV peut être un disque entier ou une partition.

Code BASH :
pvcreate /dev/sdb 

Code TEXT :
Physical volume "/dev/sdb" successfully created 


Afficher des infos sur un PV



Pour afficher des infos sur un PV, on utilise la commande pvdisplay

Code BASH :
pvdisplay /dev/sdb 

Code TEXT :
  "/dev/sdb" is a new physical volume of "1,00 GiB" 

Code TEXT :
--- NEW Physical volume ---
  PV Name               /dev/sdb 
  VG Name 
  PV Size               1,00 GiB 
  Allocatable           NO 
  PE Size               0 
  Total PE              0 
  Free PE               0 
  Allocated PE          0 
  PV UUID               OYbIFi-1Amm-zUFC-3lrJ-qPpb-Llu7-nxM3xl 


Si on ne spécifie pas le nom du PV, tous les PV sont affichés.

Supprimer un PV



Pour supprimer un PV, on utilise la commande pvremove


Code BASH :
pvremove /dev/sdb 

Code TEXT :
  Labels on physical volume "/dev/sdb" successfully wiped 


Les VG



Créer un VG



Pour créer un VG, on va utiliser la commande vgcreate.
La commande s'utilise ainsi :

Code BASH :
vgcreate nomduvg /dev/pv1 /dev/pv2 ... 


Code BASH :
vgcreate datavg /dev/sdb 

Code TEXT :
  Volume group "datavg" successfully created 



Afficher des infos sur un VG



Pour afficher des infos sur un VG, on utilise la commande vgdisplay

Code BASH :
vgdisplay datavg 

Code TEXT :
--- Volume group ---
  VG Name               datavg 
  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               1020,00 MiB 
  PE Size               4,00 MiB 
  Total PE              255 
  Alloc PE / Size       0 / 0 
  Free  PE / Size       255 / 1020,00 MiB 
  VG UUID               GbeMTP-dmeX-d8f6-hgxP-Njyj-RQWi-OX5Cct 


Si le nom du VG n'est pas indiqué, tous les VG sont affichés.

Supprimer un VG



Pour supprimer un VG, on utilise vgremove

Code BASH :
vgremove datavg 

Code TEXT :
Volume group "datavg" successfully removed 


Ajouter un PV au VG



Si on a un seul PV dans le VG, et qu'on veut agrandir notre VG, on peut ajourer un deuxième PV avec la commande vgextend :

Code BASH :
vgextend datavg /dev/sdc 

Code TEXT :
Volume group "datavg" successfully extended 


On constate qu'avec vgdisplay on a 2 PV maintenant :
Code BASH :
vgdisplay datavg | grep "Cur PV" 

Code TEXT :
  Cur PV                2 


Supprimer un PV au VG



Si on a plusieurs PV dans le VG et qu'on veut en ôter un, (donc réduire notre VG) on peut supprimer un PV avec la commande vgreduce :


Code BASH :
vgreduce datavg /dev/sdc 

Code TEXT :
  Removed "/dev/sdc1" from volume group "datavg" 


Attention Si plusieurs PV dans un même VG



Imaginons 2 disques de 500Go (avec 2 partitions LVM de 500Go) nommés sdb1 et sdc1.
On fait un VG de 1000Go avec ces 2 PV, si 1 des 2 disques tombe en panne, l'intégralité du VG est perdu !
Veiller donc à utiliser un système de RAID derrière.


Les LV et les FS



Dans ce chapitre, je traite les LV et ls FS en même temps car ils sont très liés :)

Créer un LV



On se rapproche du but !

Pour créer un LV, on va utiliser la commande ... lvcreate.
La commade, pour le plus simple s'utilise ainsi :

Code BASH :
lvcreate -n nomdulv -L taille nomduvg 

Ou
Code BASH :
lvcreate -n nomdulv -l nb%VG nomduvg 


Exemple :

Code BASH :
lvcreate -n adrienlv -L 100M datavg 

Code TEXT :
  Logical volume "adrienlv" created. 


Code BASH :
lvcreate -n pourcentlv -l 10%VG datavg 

Code TEXT :
  Logical volume "pourcentlv" created. 


Ajouter un FS



Pour ajouter un FS sur le LV, on utilise la traditionnelle commande mkfs !

XFS



Code BASH :
mkfs.xfs /dev/nomduvg/nomdulv 


BTRFS



Code BASH :
mkfs.btrfs /dev/nomduvg/nomdulv 


EXT4



Code BASH :
mkfs.ext4 /dev/nomduvg/nomdulv 


Exemple :
Code BASH :
mkfs.ext4 /dev/nomduvg/nomdulv 

Code TEXT :
mke2fs 1.42.9 (28-Dec-2013) 
Étiquette de système de fichiers= 
Type de système d'exploitation : Linux 
Taille de bloc=1024 (log=0) 
Taille de fragment=1024 (log=0) 
« Stride » = 0 blocs, « Stripe width » = 0 blocs 
25688 i-noeuds, 102400 blocs 
5120 blocs (5.00%) réservés pour le super utilisateur 
Premier bloc de données=1 
Nombre maximum de blocs du système de fichiers=33685504 
13 groupes de blocs 
8192 blocs par groupe, 8192 fragments par groupe 
1976 i-noeuds par groupe 
Superblocs de secours stockés sur les blocs : 
        8193, 24577, 40961, 57345, 73729 
 
Allocation des tables de groupe : complété 
Écriture des tables d'i-noeuds : complété 
Création du journal (4096 blocs) : complété 
Écriture des superblocs et de l'information de comptabilité du système de 
fichiers : complété 



Monter le FS



Pour monter le FS, on utilise la traditionnelle commande mount !

Code BASH :
mount /dev/nomduvg/nomdulv /pointdemontage 

ou
Code BASH :
mount /dev/mapper/nomduvg-nomdulv /pointdemontage 


Exemple :
Code BASH :
mount /dev/datavg/adrienlv /adrien


On contrôle avec la commande mount ou df que le FS est bien monté :
Code BASH :
mount | grep adrienlv 

Code TEXT :
/dev/mapper/datavg-adrienlv on /adrien type ext4 (rw,relatime,data=ordered) 


Code BASH :
df | grep adrienlv 

Code TEXT :
/dev/mapper/datavg-adrienlv       95054    1550      86336   2% /adrien 


On peut ajouter ensuite une ligne dans le fstab pour rendre permanente la modification :
Code TEXT :
/dev/mapper/nomduvg-nomdulv /pointdemontage  typefs     options  1 1


Exemple:
Code TEXT :
/dev/mapper/datavg-adrienlv /adrien  ext4  defaults  1 1 



Voir les LV



Pour voir les LV on utilise la commande ... lvdisplay

lvdisplay affiche tous les LV de tous les VG.
On peut spécifier un VG uniquement ou un LV d'un VG, ou rien pour tous.

Code BASH :
lvdisplay 
lvdisplay nomduvg 
lvdisplay nomduvg/nomdulv 


Exemple :
Code BASH :
lvdisplay datavg/adrienlv 

Code TEXT :
--- Logical volume ---
  LV Path                /dev/datavg/adrienlv 
  LV Name                adrienlv 
  VG Name                datavg 
  LV UUID                IDpnmL-e4u8-dm4a-KhQn-mZ1w-UnMV-yRyWsQ 
  LV Write Access        read/write 
  LV Creation host, time zeus.biopole21.com, 2016-02-16 17:05:31 +0100 
  LV Status              available 
  # open                 0 
  LV Size                100,00 MiB 
  Current LE             25 
  Segments               1 
  Allocation             inherit 
  Read ahead sectors     auto 
  - currently set to     8192 
  Block device           253:2 
 



Supprimer un LV



Pour supprimer un LV, on va utiliser la commande lvremove.
Attention, toutes les données sont supprimées !!!!
Le FS doit être démonté !

La commande s'utilise comme suit :
Code BASH :
lvremove nomduvg/nomdulv 



Exemple :
Code BASH :
lvremove datavg/pourcentlv 

Code TEXT :
Do you really want to remove active logical volume pourcentlv? [y/n]: y 
  Logical volume "pourcentlv" successfully removed 


Agrandir un LV (et le FS)



Pour agrandir un LV, on va utiliser la commande lvresize. (On peut utiliser aussi lvextend, ça fait la même chose)

La commande s'utilise comme suit :
Définir une taille précise :
Code BASH :
lvresize -L taille nomduvg/nomdulv 

Ou ajouter de X :
Code BASH :
lvresize -L +taille nomduvg/nomdulv 


Les tailles de LV sont des multiples de PE. (Physical Extend)
Code BASH :
pvdisplay /dev/sdb | grep "PE Size" 

Code TEXT :
  PE Size               4,00 MiB 


Après avoir agrandi le LV, il faut penser à agrandir le FS également !

Les commandes diffèrent suivant les systèmes de fichiers.

Pour ext4, on utilise la commande resize2fs.
Si on ne met pas d'option, la taille maximale est prise (ce qu'on souhaite dans le LV)
Il est préférable de démonter si possible le système de fichiers, mais l'agrandissement à chaud est possible.

Code BASH :
resize2fs /dev/nomduvg/nomdulv 


Exemple en doublant la taille du LV

Code BASH :
df -h /adrien 

Code TEXT :
Sys. de fichiers            Taille Utilisé Dispo Uti% Monté sur 
/dev/mapper/datavg-adrienlv    93M    1,6M   85M   2% /adrien 

Code BASH :
lvresize -L +100M datavg/adrienlv 

Code TEXT :
  Size of logical volume datavg/adrienlv changed from 100,00 MiB (25 extents) to 200,00 MiB (50 extents). 
  Logical volume adrienlv successfully resized. 

Code BASH :
resize2fs /dev/datavg/adrienlv 

Code TEXT :
resize2fs 1.42.9 (28-Dec-2013) 
Le système de fichiers de /dev/datavg/adrienlv est monté sur /adrien ; le changement de taille doit être effectué en ligne 
old_desc_blocks = 1, new_desc_blocks = 2 
Le système de fichiers /dev/datavg/adrienlv a maintenant une taille de 204800 blocs. 

Code BASH :
df -h /adrien 

Code TEXT :
Sys. de fichiers            Taille Utilisé Dispo Uti% Monté sur 
/dev/mapper/datavg-adrienlv   190M    1,6M  178M   1% /adrien 



Réduire le LV (et le FS)



Avant de réduire le LV, si la taille finale du LV est plus petite que celle du FS, il faut réduire le FS d'abord, sinon, corruption de données !!!
Diminuer la taille du FS est un peu plus délicat. Il ne faut évidemment pas réduire plus que la place occupée...
Pour éviter tout risque, je conseille de procéder ainsi :

  • Réduire la taille du FS plus que nécessaire
  • Réduire la taille du LV pour lui donner exactement la taille souhaitée.
  • Agrandir le FS pour qu'il occupe tout l'espace disponible.


Attention, tous les systèmes de fichiers ne peuvent pas être réduits. Pour ext4 et xfs et btrfs, cela se fait très bien. À noter que ext4 et xfs soivent être démontés pour être réduits.

Il est recommandé de réduire plus le FS que prévu puis de le ragrandir ensuite.
Exemple : Si on passe d'un LV de 200M à 100M, on va, pas sécurité, réduire le FS de 200M à 90M, réduire le LV de 200M à 100M, puis agrandir le FS au maximum.


Pour réduire le LV, on utilise la commande lvresize. (On peut utiliser aussi lvreduce, ça fait la même chose)
La commande s'utilise comme suit :
Définir une taille précise :
Code BASH :
lvresize -L taille nomduvg/nomdulv 

Ou réduire de X :
Code BASH :
lvresize -L -taille nomduvg/nomdulv 


Pour réduire un FS, on utilise encore la commande resize2fs, en ayant au préalable vérifié le système de fichiers avec e2fsck.

Code BASH :
umount /pointdemontage 
e2fsck -f /dev/nomduvg/nomdulv 
resize2fs /dev/nomduvg/nomdulv taille 



Donc en combinant les 2 options dans le bon ordre :

Code BASH :
umount /pointdemontage 
e2fsck -f /dev/nomduvg/nomdulv 
resize2fs /dev/nomduvg/nomdulv taille 
lvresize -L taille /dev/nomduvg/nomdulv 
resize2fs /dev/nomduvg/nomdulv 
mount /pointdemontage 


Exemple :
Code BASH :
df -h /adrien 

Code TEXT :
Sys. de fichiers            Taille Utilisé Dispo Uti% Monté sur 
/dev/mapper/datavg-adrienlv   190M    1,6M  178M   1% /adrien 

Code BASH :
umount /adrien 
e2fsck -f /dev/datavg/adrienlv 

Code TEXT :
e2fsck 1.42.9 (28-Dec-2013) 
Passe 1 : vérification des i-noeuds, des blocs et des tailles 
Passe 2 : vérification de la structure des répertoires 
Passe 3 : vérification de la connectivité des répertoires 
Passe 4 : vérification des compteurs de référence 
Passe 5 : vérification de l'information du sommaire de groupe 
/dev/datavg/adrienlv : 11/49400 fichiers (9.1% non contigüs), 11884/204800 blocs 

Code BASH :
resize2fs /dev/datavg/adrienlv 90M 

Code TEXT :
resize2fs 1.42.9 (28-Dec-2013) 
En train de redimensionner le système de fichiers sur /dev/datavg/adrienlv à 92160 (1k) blocs. 
Le système de fichiers /dev/datavg/adrienlv a maintenant une taille de 92160 blocs. 


Code BASH :
lvresize -L 100M /dev/datavg/adrienlv 

Code TEXT :
  WARNING: Reducing active logical volume to 100,00 MiB 
  THIS MAY DESTROY YOUR DATA (filesystem etc.) 
Do you really want to reduce adrienlv? [y/n]: y 
  Size of logical volume datavg/adrienlv changed from 200,00 MiB (50 extents) to 100,00 MiB (25 extents). 
  Logical volume adrienlv successfully resized. 

Code BASH :
resize2fs /dev/datavg/adrienlv 

Code TEXT :
resize2fs 1.42.9 (28-Dec-2013) 
En train de redimensionner le système de fichiers sur /dev/datavg/adrienlv à 102400 (1k) blocs. 
Le système de fichiers /dev/datavg/adrienlv a maintenant une taille de 102400 blocs. 

Code BASH :
mount /dev/datavg/adrienlv /adrien 
df -h /adrien 

Code TEXT :
Sys. de fichiers            Taille Utilisé Dispo Uti% Monté sur 
/dev/mapper/datavg-adrienlv    93M    1,6M   85M   2% /adrien 
Cette page a été vue 15013 fois