LVM — Gestion de volumes logiques#
Pourquoi LVM#
Le partitionnement classique souffre d’une limitation fondamentale : les tailles sont figées à la création. Redimensionner une partition sous Linux implique de la démonter, de la supprimer, de la recréer avec la bonne taille, puis de recréer et de restaurer le système de fichiers — une opération risquée et souvent impossible sans reboot.
Cas d’usage réels qui nécessitent LVM :
Volume
/varqui sature sur un serveur de logs — ajout d’un disque sans arrêtRedimensionnement de
/homeau profit de/après changement d’usage d’une machineClonage cohérent d’une base de données via snapshot sans arrêt de service
Migration de données d’un disque vieillissant vers un nouveau sans interruption (
pvmove)Consolidation de plusieurs disques en un seul espace de nommage unifié
LVM (Logical Volume Manager) résout ces problèmes en introduisant une couche d’abstraction entre les disques physiques et les systèmes de fichiers.
Architecture LVM#
LVM s’organise en trois niveaux hiérarchiques :
Physical Volume (PV)#
Un PV est un disque ou une partition initialisé pour LVM. Il contient une PV label dans les premiers secteurs qui stocke : UUID, taille totale, liste des Volume Groups auxquels il appartient, et la metadata area — une copie circulaire des métadonnées LVM.
Volume Group (VG)#
Un VG est un pool d’espace formé par un ou plusieurs PV. Il est découpé en Physical Extents (PE) de taille fixe (4 Mio par défaut, configurable de 1 Kio à 1 Gio). L’ensemble des PEs du VG forme un espace adressable unifié.
Logical Volume (LV)#
Un LV est une allocation d’un nombre donné de PEs, présentée au système d’exploitation comme un périphérique bloc (/dev/vgname/lvname). Les PEs alloués peuvent être dispersés sur plusieurs PV.
Physical Extent (PE)#
Unité minimale d’allocation LVM. La taille par défaut est 4 Mio. Un LV de 100 Gio avec des PEs de 4 Mio consomme 25 600 PEs.
Création d’une infrastructure LVM#
Étape 1 — Initialiser les Physical Volumes#
# Initialiser trois disques/partitions comme PV
sudo pvcreate /dev/sda1 /dev/sdb /dev/sdc
# Physical volume "/dev/sda1" successfully created.
# Physical volume "/dev/sdb" successfully created.
# Physical volume "/dev/sdc" successfully created.
Étape 2 — Créer le Volume Group#
# Créer le VG "vg_data" avec les trois PV, PE de 4 Mio (défaut)
sudo vgcreate vg_data /dev/sda1 /dev/sdb /dev/sdc
# Volume group "vg_data" successfully created
# Avec une PE size personnalisée (utile pour les grands volumes)
sudo vgcreate -s 16M vg_large /dev/sdd
Étape 3 — Créer les Logical Volumes#
# LV de taille fixe
sudo lvcreate -L 50G -n lv_root vg_data
# Logical volume "lv_root" created.
# LV utilisant un pourcentage du VG libre
sudo lvcreate -l 100%FREE -n lv_data vg_data
# LV de type linéaire strippé sur 2 PV (performances)
sudo lvcreate -L 100G -n lv_fast -i2 -I64 vg_data
# Formater et monter
sudo mkfs.ext4 /dev/vg_data/lv_root
sudo mkfs.xfs /dev/vg_data/lv_data
sudo mount /dev/vg_data/lv_root /
Chemins des LV
Un LV est accessible via deux chemins équivalents : /dev/vgname/lvname (lien symbolique créé par udev) et /dev/mapper/vgname-lvname (device-mapper). Dans /etc/fstab, préférer le lien symbolique qui est plus lisible.
Inspection de l’infrastructure LVM#
Vue synthétique#
pvs
# PV VG Fmt Attr PSize PFree
# /dev/sda1 vg_data lvm2 a-- 200.00g 50.00g
# /dev/sdb vg_data lvm2 a-- 500.00g 400.00g
# /dev/sdc vg_data lvm2 a-- 300.00g 150.00g
vgs
# VG #PV #LV #SN Attr VSize VFree
# vg_data 3 3 0 wz--n- 996.00g 600.00g
lvs
# LV VG Attr LSize Pool Origin Data%
# lv_data vg_data -wi-ao---- 396.00g
# lv_home vg_data -wi-ao---- 100.00g
# lv_root vg_data -wi-ao---- 50.00g
Vue détaillée#
pvdisplay /dev/sdb
# --- Physical volume ---
# PV Name /dev/sdb
# VG Name vg_data
# PV Size 500.00 GiB / not usable 4.00 MiB
# Allocatable yes
# PE Size 4.00 MiB
# Total PE 127999
# Free PE 102399
# Allocated PE 25600
lvdisplay /dev/vg_data/lv_root
# --- Logical volume ---
# LV Path /dev/vg_data/lv_root
# LV Name lv_root
# VG Name vg_data
# LV UUID AbCd12-...
# LV Write Access read/write
# LV Status available
# # open 1
# LV Size 50.00 GiB
# Current LE 12800
# Segments 1
# Allocation inherit
# Read ahead sectors auto
# Block device 253:0
Redimensionnement à chaud#
Extension d’un LV#
# Étendre lv_home de 50 Go supplémentaires
sudo lvextend -L +50G /dev/vg_data/lv_home
# Size of logical volume vg_data/lv_home changed from 100.00 GiB to 150.00 GiB.
# Logical volume vg_data/lv_home successfully resized.
# Étendre le système de fichiers ext4 (en ligne, volume monté)
sudo resize2fs /dev/vg_data/lv_home
# resize2fs ... (150.0 GiB)
# The filesystem on /dev/vg_data/lv_home is now 39321600 (4k) blocks long.
# Étendre le système de fichiers XFS (en ligne)
sudo xfs_growfs /home
# Raccourci : extension LV + resize2fs en une commande
sudo lvextend -L +50G -r /dev/vg_data/lv_home
Réduction d’un LV (ext4 uniquement)#
# ATTENTION : la réduction est irréversible si mal effectuée
# 1. Démonter obligatoirement
sudo umount /home
# 2. Vérifier le système de fichiers
sudo e2fsck -f /dev/vg_data/lv_home
# 3. Réduire le FS d'abord (AVANT de réduire le LV)
sudo resize2fs /dev/vg_data/lv_home 80G
# 4. Réduire le LV (même taille ou légèrement supérieure)
sudo lvreduce -L 80G /dev/vg_data/lv_home
# WARNING: Reducing active logical volume to 80.00 GiB.
# THIS MAY DESTROY YOUR DATA (filesystem etc.)
# Do you really want to reduce vg_data/lv_home? [y/n]: y
# 5. Remonter
sudo mount /dev/vg_data/lv_home /home
Extension du VG (ajout d’un disque)#
# Ajouter un nouveau disque au VG existant
sudo pvcreate /dev/sdd
sudo vgextend vg_data /dev/sdd
# Physical volume "/dev/sdd" successfully created.
# Volume group "vg_data" successfully extended
Comparaison avant/après redimensionnement#
Snapshots LVM#
Un snapshot LVM crée une vue cohérente d’un LV à un instant donné. Il utilise le mécanisme CoW (Copy-on-Write) : les blocs originaux ne sont copiés dans le snapshot qu’au moment où ils sont modifiés dans le LV source.
Création et utilisation#
# Créer un snapshot de 5 Go de lv_data
# (5 Go doit suffire pour stocker les blocs modifiés pendant la sauvegarde)
sudo lvcreate -L 5G -s -n lv_data_snap /dev/vg_data/lv_data
# Logical volume "lv_data_snap" created.
# Monter le snapshot en lecture seule pour sauvegarder
sudo mount -o ro /dev/vg_data/lv_data_snap /mnt/snap
# Sauvegarder depuis le snapshot (cohérence garantie)
sudo rsync -a /mnt/snap/ /backup/data_$(date +%Y%m%d)/
# Démonter et supprimer le snapshot
sudo umount /mnt/snap
sudo lvremove /dev/vg_data/lv_data_snap
Surveiller l’utilisation du snapshot#
lvs -o name,size,data_percent,snap_percent
# LV LSize Data% Snap%
# lv_data 200.00g
# lv_data_snap 5.00g 23.45 23.45
Si le snapshot se remplit à 100%, il est automatiquement invalidé. Toujours allouer suffisamment d’espace ou surveiller via lvs.
Schéma CoW#
LVM Thin Provisioning#
Le thin provisioning permet de créer des LV dont la taille logique déclarée dépasse l’espace physique réellement alloué (sur-allocation). L’espace réel est consommé à la demande.
# Créer un thin pool de 200 Go dans vg_data
sudo lvcreate -L 200G -T vg_data/tp_pool
# Logical volume "tp_pool" created.
# Créer des thin volumes dont la somme dépasse 200 Go
sudo lvcreate -V 100G -T vg_data/tp_pool -n tv_vm1
sudo lvcreate -V 100G -T vg_data/tp_pool -n tv_vm2
sudo lvcreate -V 100G -T vg_data/tp_pool -n tv_vm3
# Allocation logique totale : 300 Go pour 200 Go physiques
# Surveiller l'utilisation réelle du pool
lvs -o name,lv_size,data_percent,pool_lv
# LV LSize Data% Pool
# tp_pool 200.00g 45.20
# tv_vm1 100.00g 30.10 tp_pool
# tv_vm2 100.00g 55.00 tp_pool
# tv_vm3 100.00g 60.30 tp_pool
Danger de sur-allocation
Si le thin pool se remplit à 100%, tous les thin volumes associés deviennent inaccessibles (erreur I/O). Mettre en place une supervision avec alerte à 80% d’utilisation du pool. Étendre le pool en urgence : lvextend -L +50G vg_data/tp_pool.
Migration de données avec pvmove#
pvmove déplace les PEs d’un PV vers d’autres PV du même VG, à chaud, sans interruption de service.
# Voir la répartition des PEs par PV
pvs -o pv_name,lv_name,seg_start_pe,seg_size_pe
# Déplacer tous les LEs de /dev/sda1 vers les autres PV du VG
sudo pvmove /dev/sda1
# /dev/sda1: Moved: 12.50%
# /dev/sda1: Moved: 25.00%
# ...
# /dev/sda1: Moved: 100.00%
# Après pvmove, supprimer le PV du VG
sudo vgreduce vg_data /dev/sda1
# Removed "/dev/sda1" from volume group "vg_data"
# Supprimer le label LVM du PV (pour réutiliser le disque)
sudo pvremove /dev/sda1
# Labels on physical volume "/dev/sda1" successfully wiped.
Pendant pvmove, les données restent accessibles. En cas d’interruption (reboot), pvmove reprend automatiquement au prochain démarrage via les métadonnées du VG.
Simulation d’allocation de PEs#
LVM et systemd#
Activation automatique au démarrage#
Sur les systèmes avec systemd, l’activation des VG et LV est gérée par :
lvm2-monitor.service: surveille l’état des LV (dmeventd)lvm2-pvscan@.service: scanné par udev à la détection de chaque disque
# Vérifier l'état
systemctl status lvm2-monitor.service
systemctl status lvm2-pvscan@8:0.service # major:minor du disque
# Forcer un scan manuel
sudo vgscan --cache
sudo vgchange -ay # activer tous les VG
Persistance de la configuration LVM#
La configuration globale se trouve dans /etc/lvm/lvm.conf. Elle contrôle notamment :
filter: liste des périphériques à inclure ou exclure du scanauto_activation_volume_list: VGs à activer automatiquementbackup: sauvegarde automatique des métadonnées VG dans/etc/lvm/backup/
# Activer la sauvegarde automatique des métadonnées (défaut : on)
grep -A2 "backup {" /etc/lvm/lvm.conf
# backup {
# backup = 1
# backup_dir = "/etc/lvm/backup"
# Sauvegarder manuellement
sudo vgcfgbackup vg_data
# Volume group configuration for vg_data successfully backed up.
# Backed up volume group data to /etc/lvm/backup/vg_data (seqno 15).
# Restaurer depuis une sauvegarde
sudo vgcfgrestore vg_data
Résumé#
LVM transforme la gestion de l’espace disque d’une opération risquée et statique en une activité dynamique et réversible.
Points essentiels :
PV → VG → LV est la hiérarchie immuable. Un LV ne peut pas exister sans VG, un VG sans PV.
pvs,vgs,lvsdonnent une vue synthétique ;pvdisplay,vgdisplay,lvdisplaydonnent les détails.L’extension d’un LV est toujours sûre (avec
-rpour redimensionner le FS simultanément). La réduction est risquée et interdite pour XFS.Les snapshots LVM permettent des sauvegardes cohérentes sans arrêt de service, mais leur espace doit être surveillé.
pvmovepermet de migrer des données à chaud pour décommissionner un disque.Le thin provisioning est puissant mais exige une surveillance stricte de l’utilisation du pool.
systemd gère l’activation automatique des VG via
lvm2-monitor.serviceetvgchange -ay.
Pour aller plus loin
Le chapitre 8 présente RAID (mdadm et lvmraid) qui peut se combiner avec LVM pour ajouter la redondance à la flexibilité. Les snapshots LVM y sont réutilisés comme base de stratégie de sauvegarde.