LVM sous Linux : volumes physiques, groupes et volumes logiques en pratique
LVM (Logical Volume Manager) sous Linux est une couche entre les disques et les systèmes de fichiers : les disques deviennent des volumes physiques (PV), réunis en un groupe de volumes (VG), dans lequel on découpe des volumes logiques (LV) de taille quelconque. Le grand avantage : un volume s'agrandit à chaud avec lvextend -r, on peut ajouter un disque au groupe sans arrêter le service, et créer un snapshot avant une opération risquée.
LVM (Logical Volume Manager) est un gestionnaire de volumes logiques sous Linux, qui sépare les systèmes de fichiers des disques physiques. Au lieu de lier /var à la partition /dev/sdb1 de façon rigide, on regroupe les disques dans un pool commun et l'on découpe dans ce pool des volumes de la taille voulue. Quand il manque de place, le volume grandit en une seule commande, sans redémarrage et sans interrompre le service. Voyons comment fonctionne LVM sous Linux, comment créer des volumes depuis zéro, les agrandir, faire un snapshot et éviter de perdre des données à cause des erreurs classiques.
À quoi sert LVM si l'on dispose de partitions classiques
Une partition classique est un morceau continu d'un seul disque. Sa taille est fixée au partitionnement, et on ne peut l'agrandir que s'il y a de la place libre juste après elle. Quand le disque est plein, il faut en acheter un autre, migrer les données, réécrire /etc/fstab, et arrêter le service pendant ce temps.
LVM résout trois problèmes :
- Taille flexible. Un volume logique peut être agrandi (et, pour l'ext4, réduit) à tout moment.
- Regroupement des disques. Plusieurs disques physiques forment un seul pool ; un même volume peut s'étendre sur deux disques.
- Snapshots. Un instantané du volume avant une mise à jour, une migration de base ou toute autre opération risquée.
C'est pourquoi les installeurs d'Ubuntu Server, de RHEL, de Rocky et d'AlmaLinux proposent LVM par défaut, et que l'on le met presque toujours en place sur les serveurs qui stockent des données.
Les trois niveaux de LVM : PV, VG et LV
Toute la logique de LVM tient en trois notions. Une image simple : les disques sont des sacs de farine, le groupe est l'entrepôt commun, et les volumes logiques sont les portions que vous prélevez dans l'entrepôt.
| Niveau | Ce que c'est | Exemple de nom | Créé par la commande |
|---|---|---|---|
| PV (Physical Volume) | disque ou partition préparé pour LVM | /dev/sdb, /dev/sdc1 | pvcreate |
| VG (Volume Group) | pool regroupant un ou plusieurs PV | data_vg | vgcreate |
| LV (Logical Volume) | volume découpé dans le VG ; on y crée le système de fichiers | /dev/data_vg/app | lvcreate |
À l'intérieur du VG, l'espace est divisé en extents (PE, physical extents) : des blocs de taille fixe, par défaut 4 Mio. Un volume logique n'est qu'un ensemble d'extents, qui n'ont pas besoin de se suivre et peuvent se trouver sur différents disques. C'est ce qui rend l'agrandissement si simple : LVM ajoute au volume des extents libres, où qu'ils soient.
Le périphérique d'un volume logique est accessible par deux chemins équivalents : /dev/data_vg/app et /dev/mapper/data_vg-app. En coulisses, il s'agit d'un périphérique device-mapper du noyau.
Voir ce qui existe déjà
Commencez par vérifier que le paquet est installé : sous Debian et Ubuntu, c'est lvm2 (sudo apt install lvm2) ; dans la famille RHEL, il est présent par défaut. Pour une vue d'ensemble, il existe des commandes courtes et détaillées :
$ sudo pvs
PV VG Fmt Attr PSize PFree
/dev/sdb data_vg lvm2 a-- <20.00g 0
/dev/sdc data_vg lvm2 a-- <20.00g <10.00g
$ sudo vgs
VG #PV #LV #SN Attr VSize VFree
data_vg 2 1 0 wz--n- 39.99g <10.00g
$ sudo lvs
LV VG Attr LSize Pool Origin Data% Meta%
app data_vg -wi-ao---- 30.00g
Les détails s'affichent avec pvdisplay, vgdisplay et lvdisplay. Une vue globale avec les partitions ordinaires s'obtient avec lsblk : les volumes logiques y apparaissent avec le type lvm.
$ lsblk /dev/sdb /dev/sdc
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sdb 8:16 0 20G 0 disk
└─data_vg-app 253:0 0 30G 0 lvm /srv/app
sdc 8:32 0 20G 0 disk
└─data_vg-app 253:0 0 30G 0 lvm /srv/app
On voit que le volume app de 30 Go repose à la fois sur deux disques de 20 Go : ce serait impossible avec une partition classique.
LVM depuis zéro : du disque brut au volume monté
Supposons qu'un disque vide /dev/sdb ait été ajouté au serveur, et qu'il faille un volume de 15 Go pour les données de l'application. Vérifiez le nom du disque avec lsblk avant de continuer : toutes les commandes ci-dessous détruisent les données présentes sur le périphérique indiqué.
Étape 1. Créer le volume physique
$ sudo pvcreate /dev/sdb
Physical volume "/dev/sdb" successfully created.
On peut donner à LVM le disque entier, ou bien créer d'abord une partition avec fdisk ou parted, de type « Linux LVM », et l'indiquer (/dev/sdb1). La partition est plus claire pour les autres administrateurs et protège contre un partitionnement accidentel du disque sous LVM ; en revanche, un disque entier se redimensionne plus facilement dans le cloud.
Étape 2. Créer le groupe de volumes
$ sudo vgcreate data_vg /dev/sdb
Volume group "data_vg" successfully created
Étape 3. Découper le volume logique
$ sudo lvcreate -n app -L 15G data_vg
Logical volume "app" created.
L'option -L fixe une taille absolue, -l une taille en extents ou en pourcentage : -l 100%FREE prend tout l'espace libre du groupe, -l 50%VG la moitié du groupe. Il est recommandé de laisser une réserve libre dans le VG : on pourra ensuite l'attribuer à n'importe quel volume ou la consacrer à un snapshot.
Étape 4. Système de fichiers et montage
$ sudo mkfs.ext4 /dev/data_vg/app
$ sudo mkdir -p /srv/app
$ sudo mount /dev/data_vg/app /srv/app
$ df -h /srv/app
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/data_vg-app 15G 24K 14G 1% /srv/app
Pour que le volume soit monté après le redémarrage, ajoutez une ligne dans /etc/fstab. Pour les volumes logiques, le chemin /dev/mapper/... est stable, on peut donc l'utiliser, ou bien l'UUID fourni par blkid :
/dev/mapper/data_vg-app /srv/app ext4 defaults 0 2
Vérifiez l'entrée avec sudo mount -a avant le redémarrage : une erreur dans fstab peut faire passer le serveur en mode d'urgence.
Comment agrandir un volume LVM sans arrêter le service
C'est la principale raison d'aimer LVM. Le volume s'agrandit alors que le système de fichiers est monté, et l'application continue d'écrire. La démarche dépend de la présence d'espace libre dans le groupe.
Si le VG dispose d'espace libre
$ sudo vgs data_vg
VG #PV #LV #SN Attr VSize VFree
data_vg 1 1 0 wz--n- <20.00g <5.00g
$ sudo lvextend -r -L +4G /dev/data_vg/app
Size of logical volume data_vg/app changed from 15.00 GiB to 19.00 GiB.
Logical volume data_vg/app successfully resized.
resize2fs 1.47.0
Filesystem at /dev/mapper/data_vg-app is mounted on /srv/app; on-line resizing required
L'option clé est -r (--resizefs) : juste après l'agrandissement du volume, elle étend aussi le système de fichiers. Sans elle, le volume est plus grand, mais df -h affiche toujours l'ancienne taille, car le système de fichiers ignore le nouvel espace. C'est l'erreur la plus fréquente : dans ce cas, il suffit de lancer à la main resize2fs pour l'ext4 ou xfs_growfs pour le XFS.
$ sudo resize2fs /dev/data_vg/app # ext4, on indique le périphérique
$ sudo xfs_growfs /srv/app # XFS, on indique le point de montage
Attention à la différence : -L +4G ajoute 4 Go, alors que -L 4G fixe une taille totale de 4 Go. Pour attribuer au volume tout l'espace restant, utilisez -l +100%FREE.
Si le VG n'a plus de place : ajouter un disque
Branchez le nouveau disque (dans le cloud, rattachez un volume), repérez-le avec lsblk et ajoutez-le au groupe :
$ sudo pvcreate /dev/sdc
$ sudo vgextend data_vg /dev/sdc
Volume group "data_vg" successfully extended
$ sudo lvextend -r -l +100%FREE /dev/data_vg/app
Trois commandes, aucune interruption. Le système de fichiers repose désormais sur deux disques, et l'application ne s'en aperçoit pas.
Si le disque a été agrandi dans le cloud
Dans le cloud, il est souvent plus simple d'agrandir le disque existant plutôt que d'en ajouter un. Le noyau voit alors la nouvelle taille du périphérique, et il faut étendre le volume physique avec pvresize :
$ sudo pvresize /dev/sdb
Physical volume "/dev/sdb" changed
$ sudo lvextend -r -l +100%FREE /dev/data_vg/app
Si le PV a été créé sur une partition (/dev/sdb1), agrandissez d'abord la partition, par exemple avec growpart /dev/sdb 1 du paquet cloud-guest-utils, puis seulement pvresize /dev/sdb1.
Peut-on réduire un volume LVM
Oui, mais pas pour tous les systèmes de fichiers, et pas à chaud. Le XFS ne sait pas du tout se réduire : il faut le recréer en transférant les données. L'ext4 se réduit, mais uniquement démonté :
$ sudo umount /srv/app
$ sudo lvreduce -r -L 10G /dev/data_vg/app
Avec l'option -r, LVM vérifie lui-même le système de fichiers (e2fsck) et le réduit avant de diminuer le volume. Sans -r, il est facile de rogner le volume plus que le système de fichiers ne le permet, et d'abîmer les données. Avant toute réduction, faites une sauvegarde.
Snapshots LVM : un instantané du volume avant une opération risquée
Un snapshot est un instantané logique du volume. Il se crée en une fraction de seconde et ne copie pas les données : LVM fonctionne selon le principe copy-on-write et ne conserve dans le snapshot que les blocs modifiés sur le volume d'origine après sa création. Le snapshot n'a donc besoin dans le VG que de la place nécessaire aux modifications, et non de la taille du volume entier.
$ sudo lvcreate -s -n app_before_upgrade -L 2G /dev/data_vg/app
Logical volume "app_before_upgrade" created.
$ sudo lvs data_vg
LV VG Attr LSize Origin Data%
app data_vg owi-aos--- 19.00g
app_before_upgrade data_vg swi-a-s--- 2.00g app 0.01
La colonne Data% indique le taux de remplissage de la zone des modifications. Si elle atteint 100 %, le snapshot classique devient invalide et ne peut plus qu'être supprimé. Choisissez une taille suffisante pour le volume de modifications attendu, et surveillez les snapshots conservés longtemps avec lvs ou agrandissez-les avec lvextend.
Revenir au snapshot
Si la mise à jour s'est mal passée, ramenez le volume à l'état du moment du snapshot :
$ sudo umount /srv/app
$ sudo lvconvert --merge /dev/data_vg/app_before_upgrade
Merging of volume data_vg/app_before_upgrade started.
$ sudo mount /srv/app
Après la fusion, le snapshot disparaît. Si le volume ne peut pas être démonté (par exemple, s'il s'agit de la racine du système), la fusion est reportée à la prochaine activation du volume, c'est-à-dire au redémarrage.
Si tout s'est bien passé
Le snapshot se supprime simplement, pour ne plus ralentir les écritures ni occuper de place :
$ sudo lvremove /dev/data_vg/app_before_upgrade
Un snapshot se monte volontiers en lecture seule pour réaliser une copie de sauvegarde cohérente d'un système en fonctionnement : mount -o ro, puis copie avec rsync ou tar. Pour le XFS, ajoutez l'option nouuid, sinon le montage est refusé à cause de l'UUID identique à celui de l'original.
LVM et RAID : ne confondez pas les rôles
LVM ne protège pas à lui seul contre la panne d'un disque. Si un volume s'étend sur deux disques et que l'un d'eux tombe en panne, c'est le volume entier qui est perdu, et pas seulement la moitié. Pour la tolérance aux pannes, on place du RAID (mdadm) sous LVM, ou l'on utilise le mode miroir intégré à LVM (lvcreate --type raid1 -m 1).
Ni le RAID ni les snapshots ne remplacent une sauvegarde. Le snapshot vit sur les mêmes disques que l'original, et le RAID reproduit fidèlement une suppression accidentelle avec rm -rf. Il faut une copie distincte, sur un autre support.
Aide-mémoire des commandes LVM
| Tâche | Commande |
|---|---|
| Vue d'ensemble des PV, VG, LV | pvs, vgs, lvs |
| Créer un volume physique | pvcreate /dev/sdb |
| Créer un groupe | vgcreate data_vg /dev/sdb |
| Ajouter un disque au groupe | vgextend data_vg /dev/sdc |
| Créer un volume | lvcreate -n app -L 15G data_vg |
| Agrandir le volume et le système de fichiers | lvextend -r -L +5G /dev/data_vg/app |
| Étendre le PV après agrandissement du disque | pvresize /dev/sdb |
| Snapshot | lvcreate -s -n snap -L 2G /dev/data_vg/app |
| Revenir au snapshot | lvconvert --merge /dev/data_vg/snap |
| Retirer un disque du groupe | pvmove /dev/sdb, puis vgreduce data_vg /dev/sdb |
| Supprimer un volume | lvremove /dev/data_vg/app |
Erreurs fréquentes
- Le volume a été agrandi, mais df affiche l'ancienne taille. On a oublié
-r. Lancezresize2fsouxfs_growfs. - Insufficient free space. Le groupe n'a plus d'extents libres : vérifiez
vgs, puis ajoutez un disque avecvgextendou agrandissez le PV. - Device /dev/sdc excluded by a filter. Il reste sur le disque une ancienne signature de partitionnement ou de système de fichiers. Si les données ne sont plus nécessaires, effacez-la avec
wipefs -a /dev/sdc. - Le snapshot est devenu Invalid. La zone des modifications s'est remplie à 100 %. Il ne peut pas être restauré : il faut le supprimer et, la fois suivante, réserver davantage d'espace.
Conclusion
LVM sous Linux repose sur trois couches : les volumes physiques (PV) sont réunis dans un groupe (VG), dans lequel on découpe les volumes logiques (LV). On obtient ce que les partitions classiques ne permettent pas : agrandir un volume à chaud avec lvextend -r, ajouter des disques sans interruption, et créer des snapshots avant les modifications délicates. N'oubliez pas que LVM ne remplace ni le RAID, ni les sauvegardes. Le partitionnement des disques, LVM, le RAID et les quotas sont détaillés en pratique dans une leçon du cours Linux.
Questions fréquentes
Peut-on convertir en LVM une partition déjà utilisée avec des données ?
Pas directement : pvcreate écrase le début du périphérique. Il faut créer le LVM sur un autre disque, copier les données avec rsync, corriger fstab, et seulement ensuite libérer l'ancienne partition.
LVM ralentit-il le disque ?
Sans snapshots, le surcoût de device-mapper est pratiquement imperceptible. Les snapshots classiques actifs ralentissent les écritures sur le volume d'origine à cause du copy-on-write, c'est pourquoi il ne faut pas les garder pendant des semaines.
Faut-il LVM sur un ordinateur personnel ou un portable ?
Ce n'est pas obligatoire, mais c'est utile avec le chiffrement du disque (LUKS avec LVM à l'intérieur) et si l'on veut modifier la taille des partitions sans repartitionner. Sur les serveurs qui stockent des données, LVM est pratiquement la norme.
Qu'est-ce que le thin provisioning dans LVM ?
Ce sont les volumes fins : on crée un pool (lvcreate --type thin-pool), et les volumes qui s'y trouvent n'occupent de la place réelle qu'au fur et à mesure de l'écriture des données. On peut ainsi allouer aux volumes plus d'espace qu'il n'en existe physiquement, mais il faut surveiller le remplissage du pool.
Comment retirer un disque d'un groupe de volumes sans perdre de données ?
Déplacez ses extents vers les autres disques du groupe avec pvmove /dev/sdb (il faut assez de place libre), puis exécutez vgreduce data_vg /dev/sdb et pvremove /dev/sdb.
Ce sujet est traité en détail avec de la pratique dans le cours « Linux: с нуля до уверенного администрирования ».
Voir le cours