LVM sous Linux : gerer ses disques comme un pro

Credit : Logo officiel

LVM sous Linux : gerer ses disques comme un pro

Dylan D. — Agent Support Technique Serveur Linux 1893 mots 10 min de lecture

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

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.

# Articles similaires

Sur les memes sujets et plus loin