Credit : Logo officiel
LVM sous Linux : gerer ses disques comme un pro
Le serveur plein un dimanche soir
22h13, dimanche. Un client e-commerce m'appelle : son /var/www est plein, le site refuse les uploads, MySQL n'arrive plus a ecrire dans ses logs. La partition est a 100 %. Sur un serveur avec des partitions classiques j'aurais ete bon pour un live CD, un resize2fs, un reboot, et beaucoup de stress. Sur celui-ci, j'avais migre vers LVM trois mois plus tot. Trois commandes, 30 secondes, le site est revenu a la vie sans interruption visible. Depuis, je ne livre plus aucun serveur sans LVM.
LVM (Logical Volume Manager) est une couche d'abstraction entre vos disques physiques et vos systemes de fichiers. Au lieu de partitions rigides figees a l'installation, vous obtenez des volumes logiques redimensionnables a chaud, des snapshots reversibles, et la possibilite d'ajouter du disque sans toucher a la structure existante.
Les trois couches LVM
+-----------------------------------------------+
| Systemes de fichiers (ext4, xfs, btrfs) |
+-----------------------------------------------+
| Logical Volumes (LV) : lvcreate |
| /dev/vg_data/lv_www, /dev/vg_data/lv_mysql |
+-----------------------------------------------+
| Volume Group (VG) : vgcreate |
| Le "pool" de stockage agrege |
+-----------------------------------------------+
| Physical Volumes (PV) : pvcreate |
| /dev/sdb, /dev/sdc, /dev/nvme1n1 |
+-----------------------------------------------+
| Disques physiques bruts |
+-----------------------------------------------+
En une phrase : les PV sont vos disques inities pour LVM, le VG est le grand pot commun de stockage, et les LV sont les volumes que vous taillez a la demande dans ce pot. Vous pouvez agrandir un LV en piochant dans le VG, et agrandir le VG en y ajoutant un nouveau PV.
Verifier l'etat actuel
Avant toute manipulation, regardez ce que vous avez :
# Disques et partitions
lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINT
# PV existants
sudo pvs
sudo pvdisplay
# VG existants
sudo vgs
sudo vgdisplay
# LV existants
sudo lvs
sudo lvdisplay
Le trio pvs && vgs && lvs est ma commande preferee pour avoir une vue d'ensemble en 3 lignes :
sudo pvs && echo "---" && sudo vgs && echo "---" && sudo lvs
Installer LVM et creer les Physical Volumes
Sur Debian/Ubuntu :
sudo apt install lvm2 -y
Sur RHEL/Rocky/Alma :
sudo dnf install lvm2 -y
Supposons que vous avez ajoute deux disques de 50 Go a votre VPS (/dev/sdb et /dev/sdc). Initialisez-les en PV :
sudo pvcreate /dev/sdb
sudo pvcreate /dev/sdc
sudo pvs
Resultat :
PV VG Fmt Attr PSize PFree
/dev/sdb lvm2 --- 50.00g 50.00g
/dev/sdc lvm2 --- 50.00g 50.00g
Note : pvcreate ecrase tout ce qu'il y a sur le disque. Si le disque contenait deja des donnees ou une table de partition, vous les perdez. Verifiez deux fois.
Creer le Volume Group
On agrege les deux PV dans un VG nomme vg_data :
sudo vgcreate vg_data /dev/sdb /dev/sdc
sudo vgdisplay vg_data
Vous obtenez un pool de 100 Go (50 + 50). LVM gere de maniere transparente l'allocation entre les deux disques.
Pour ajouter un disque a un VG existant plus tard :
sudo pvcreate /dev/sdd
sudo vgextend vg_data /dev/sdd
Creer les Logical Volumes
Maintenant on taille les LV dans le VG selon les besoins :
# 60 Go pour /var/www
sudo lvcreate -L 60G -n lv_www vg_data
# 20 Go pour MySQL/MariaDB
sudo lvcreate -L 20G -n lv_mysql vg_data
# Tout le reste pour les backups
sudo lvcreate -l 100%FREE -n lv_backup vg_data
sudo lvs
L'option -L 60G fixe la taille en absolu. L'option -l 100%FREE prend tout l'espace restant. Vous pouvez aussi utiliser -l 50%VG pour 50 % du VG.
Formatez les volumes :
sudo mkfs.ext4 -L www /dev/vg_data/lv_www
sudo mkfs.ext4 -L mysql /dev/vg_data/lv_mysql
sudo mkfs.ext4 -L backup /dev/vg_data/lv_backup
Creez les points de montage et montez :
sudo mkdir -p /var/www /var/lib/mysql /backup
sudo mount /dev/vg_data/lv_www /var/www
sudo mount /dev/vg_data/lv_mysql /var/lib/mysql
sudo mount /dev/vg_data/lv_backup /backup
Pour que les volumes soient montes au reboot, ajoutez dans /etc/fstab :
/dev/vg_data/lv_www /var/www ext4 defaults,noatime 0 2
/dev/vg_data/lv_mysql /var/lib/mysql ext4 defaults,noatime 0 2
/dev/vg_data/lv_backup /backup ext4 defaults,noatime 0 2
L'option noatime desactive la mise a jour des timestamps d'acces et reduit les ecritures inutiles, important pour les SSD et la base de donnees.
Testez la syntaxe avant le reboot :
sudo mount -a
Etendre un volume a chaud (le vrai pouvoir)
C'est pour ca qu'on utilise LVM. Agrandir un volume sans demonter, sans reboot, sans downtime :
# Verifier l'espace dispo dans le VG
sudo vgs vg_data
# Etendre lv_www de 10 Go et agrandir le filesystem en une commande
sudo lvextend -L +10G -r /dev/vg_data/lv_www
Le flag -r (resize) appelle automatiquement resize2fs (ext4) ou xfs_growfs (xfs). Sans ce flag, vous devez le faire manuellement :
sudo lvextend -L +10G /dev/vg_data/lv_www
sudo resize2fs /dev/vg_data/lv_www # pour ext4
# ou
sudo xfs_growfs /var/www # pour xfs
Si le VG est plein, ajoutez un nouveau disque :
sudo pvcreate /dev/sdd
sudo vgextend vg_data /dev/sdd
sudo lvextend -L +50G -r /dev/vg_data/lv_www
Reduire un volume (avec precaution)
Reduire est l'operation a risque : il faut demonter pour ext4 (xfs n'autorise meme pas la reduction). Toujours sauvegarder avant.
# 1. Demonter
sudo umount /var/www
# 2. Verifier le filesystem
sudo e2fsck -f /dev/vg_data/lv_www
# 3. Reduire le filesystem (laisser un peu de marge !)
sudo resize2fs /dev/vg_data/lv_www 50G
# 4. Reduire le LV
sudo lvreduce -L 50G /dev/vg_data/lv_www
# 5. Remonter
sudo mount /var/www
Attention : si vous reduisez le LV avant le filesystem, vous coupez les donnees. Toujours filesystem d'abord, LV ensuite. Et toujours laisser une marge entre les deux (j'ai vu des gens reduire les deux a la meme taille exacte et perdre des donnees).
Les snapshots : le filet de securite
Un snapshot LVM capture l'etat d'un volume a un instant T sans copier toutes les donnees (copy-on-write). Indispensable avant une migration ou une mise a jour risquee :
# Creer un snapshot de 5 Go (taille des modifications attendues)
sudo lvcreate -s -L 5G -n snap_www_avant_migration /dev/vg_data/lv_www
Le snapshot contient les blocs modifies depuis sa creation. Si vous changez 1 Go de donnees, le snapshot occupe 1 Go. Si vous depassez les 5 Go alloues, le snapshot devient invalide.
Verifier l'utilisation :
sudo lvs -o +snap_percent
Si votre migration foire, restaurez :
sudo umount /var/www
sudo lvconvert --merge /dev/vg_data/snap_www_avant_migration
sudo mount /var/www
Le merge reapplique l'etat du snapshot et detruit le snapshot ensuite. Si l'origin est en cours d'utilisation (ex root filesystem), le merge se fera au prochain reboot.
Migrer un disque a chaud avec pvmove
Vous changez un disque defaillant ou vous migrez vers un SSD plus rapide ? pvmove deplace les donnees d'un PV vers un autre sans interruption :
# Ajoutez le nouveau disque au VG
sudo pvcreate /dev/nvme1n1
sudo vgextend vg_data /dev/nvme1n1
# Migrer toutes les donnees de l'ancien PV vers le nouveau
sudo pvmove /dev/sdb /dev/nvme1n1
# Retirer l'ancien PV du VG
sudo vgreduce vg_data /dev/sdb
sudo pvremove /dev/sdb
La migration peut durer plusieurs heures pour de gros volumes mais le service reste accessible pendant tout le processus. Magique.
Commandes de diagnostic au quotidien
# Resume complet
sudo pvs && sudo vgs && sudo lvs
# Espace libre dans un VG
sudo vgdisplay vg_data | grep "VG Free\|VG Size"
# Detail d'un LV avec utilisation snapshot
sudo lvs -o +snap_percent,origin,lv_attr
# Activer/desactiver un VG
sudo vgchange -an vg_data # desactiver
sudo vgchange -ay vg_data # activer
# Renommer un LV (pratique apres un cloisonnement)
sudo lvrename vg_data lv_old lv_new
LVM Thin Provisioning : encore plus de flexibilite
Les thin volumes sont des LV qui n'allouent l'espace que quand il est ecrit. Vous pouvez creer 10 LV de 100 Go chacun dans un VG de 200 Go, tant que la somme des donnees ecrites reelles tient dans 200 Go.
# Creer un thin pool
sudo lvcreate -L 100G -T vg_data/thinpool
# Creer des thin volumes dans le pool
sudo lvcreate -V 50G -T vg_data/thinpool -n lv_app1
sudo lvcreate -V 50G -T vg_data/thinpool -n lv_app2
sudo lvcreate -V 50G -T vg_data/thinpool -n lv_app3
# Verifier
sudo lvs -a
Attention : si le thin pool se remplit, les ecritures echouent et les filesystems peuvent etre corrompus. Configurez un monitoring strict :
sudo lvchange --monitor y vg_data/thinpool
Ideal pour les environnements de dev ou chaque conteneur a son volume sans surdimensionner.
Snapshots automatises pour backups
Combinez LVM snapshots avec un script de backup pour des sauvegardes coherentes meme avec des fichiers en cours d'ecriture :
#!/bin/bash
# /usr/local/bin/lvm-backup.sh
set -e
DATE=$(date +%Y%m%d)
VG="vg_data"
LV="lv_www"
MOUNT="/mnt/snap-$DATE"
# Creer le snapshot
lvcreate -s -L 5G -n snap-$DATE /dev/$VG/$LV
# Monter le snapshot en lecture seule
mkdir -p $MOUNT
mount -o ro /dev/$VG/snap-$DATE $MOUNT
# Backuper depuis le snapshot (donnees figees, coherentes)
tar -czf /backup/www-$DATE.tar.gz -C $MOUNT .
# Cleanup
umount $MOUNT
rmdir $MOUNT
lvremove -y /dev/$VG/snap-$DATE
# Rotation
find /backup -name 'www-*.tar.gz' -mtime +30 -delete
Via cron quotidien :
0 3 * * * root /usr/local/bin/lvm-backup.sh >> /var/log/lvm-backup.log 2>&1
Le snapshot fige les donnees au moment T sans bloquer les ecritures du systeme. Vous obtenez une sauvegarde coherente meme sur une base de donnees active (a condition de faire un FLUSH TABLES WITH READ LOCK MySQL avant la creation du snapshot pour vraiment garantir la coherence transactionnelle).
Erreurs courantes et leur fix
"Device /dev/sdb not found (or ignored by filtering)". Le disque n'apparait pas pour LVM. Verifiez lsblk qu'il existe vraiment, et cat /etc/lvm/lvm.conf | grep filter pour voir si un filtre exclut votre device.
"Cannot deactivate logical volume in use". Vous essayez de demonter ou modifier un LV qui a des fichiers ouverts. Trouvez les processus avec sudo lsof +D /var/www puis stoppez-les ou utilisez umount -l /var/www (lazy unmount).
Snapshot a 100 % invalide. Vous avez sous-dimensionne le snapshot et trop de modifications ont eu lieu. Le snapshot est irrecuperable. Augmentez la taille la prochaine fois avec lvextend -L +5G /dev/vg_data/snap_www.
"Insufficient free space" alors que le VG a de l'espace. L'espace est fragmente entre PV. Utilisez lvextend --alloc anywhere pour autoriser l'allocation a cheval sur plusieurs PV.
Un disque PV est mort, le VG ne s'active plus. Si vous aviez du miroir LVM ou un RAID en dessous, c'est gerable. Sinon, partez du dernier backup. Apres ce genre d'incident, on retient l'importance de faire des snapshots reguliers et des backups offsite.
Pour aller plus loin
- Analyser et optimiser l'espace disque MySQL
- Automatiser les backups en bash et cron
- Comprendre les permissions Linux chmod, chown, ACL
- Ou chercher et comment lire les logs Linux
- Hardening Linux pour securiser votre serveur
L'outil sysadmin que vous regretterez de pas avoir installe plus tot
LVM est sous-utilise parce qu'il fait peur quand on debute. La realite : une fois les trois couches comprises (PV, VG, LV), le reste est trivial et terriblement puissant. Etendre un volume a chaud, prendre un snapshot avant une migration, deplacer les donnees vers un nouveau disque sans downtime, c'est ce qui distingue un sysadmin junior d'un senior. Si vous installez un nouveau serveur cette semaine, prenez 15 minutes pour le configurer en LVM des le depart. Vous me remercierez la prochaine fois qu'un disque se remplit un dimanche soir.