LVM

De ArchwikiFR


Introduction

LVM est un gestionnaire de volumes logiques pour le noyau Linux. Le but de LVM est de fournir une couche d'abstraction entre l'espace de stockage physique et le système: il permet de créer des «partitions virtuelles» faciles à gérer (changements de taille, création, suppression...). Les éléments qui composent LVM sont:

  • Les volumes physiques (PV): ce sont les espaces de stockage traditionnels (disques, partitions, éventuellement des fichiers montés en loopback), sur lequels LVM crée ses volumes logiques. Il comprend un en-tête spécial et se divise en blocs physiques (extents).
  • Les groupes de volumes (VG): Ce sont des groupes de volumes physiques (PV) réunis par LVM en un seul «disque virtuel». Un groupe de volumes contient des volumes logiques, ceux-ci sont répartis par LVM de manière transparente sur les différents volumes physiques: un volume logique peut même être dispersé à travers les disques disponibles.
  • Les volumes logiques (LV): ce sont des «partitions virtuelles» (logiques parce qu'elles sont produites par un logiciel sans forcément correspondre à une portion d'un disque matériel. Les volumes logiques sont constitués d'étendues de blocs physiques réunis en un seul espace de stockage, et rendus lisibles par le système. On peut les utiliser comme des partitions ordinaires.
  • Étendue physique (PE): un petit bloc de disque (en général de 4MB) qui peut être affecté à un volume logique. Les étendues physiques se comportent comme les secteurs ou les cylindres des disques durs physiques.

Exemple:

Disques physiques
                
  Disque 1 (/dev/sda):
     _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
    |Partition1 50GB (Volume physique) |Partition2 80GB (Volume physique)     |
    |/dev/sda1                         |/dev/sda2                             |
    |_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |
                                  
  Disque 2 (/dev/sdb):
     _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
    |Partition1 120GB (Volume physique)                 |
    |/dev/sdb1                                          |
    | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ __ _ _|
Volumes logiques LVM

  Groupe de volumes 1 (/dev/MyStorage/ = /dev/sda1 + /dev/sda2 + /dev/sdb1):
     _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
    |Volume logique 1 15GB |Volume logique 2 35GB     |Volume logique 3 200GB              |
    |/dev/MyStorage/rootvol|/dev/MyStorage/homevol    |/dev/MyStorage/mediavol             |
    |_ _ _ _ _ _ _ _ _ _ _ |_ _ _ _ _ _ _ _ _ _ _ _ _ |_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |

Pour résumer: LVM permet d'utiliser tout l'espace disque disponible (le groupe de volumes) et de le présenter sous forme de partitions virtuelles (les volumes logiques) qui peuvent être découpées très différemment, pour plus de flexibilité..

Installation

Avant toute opération, il faut charger le bon module dans le noyau:

# modprobe dm_mod

Partitionner les disques

Ensuite, il faut créer une partition pour LVM. Elle doit avoir le type 'Linux LVM' (numéro 0x8e pour les partitions MBR, 8e00 pour GPT). Il suffit normalement d'une seule partition LVM sur chaque disque à utiliser. Les volumes logiques seront positionnés dans ces partitions, donc prévoyez la place nécessaire. Pour utiliser seulement LVM sans autre partition, prenez tout l'espace libre disponible.

Il est possible d'utiliser LVM directement sur le disque, sans partition sous-jacente, néanmoins cette pratique est déconseillé dans la mesure où elle n'indique pas le type de données présentes sur le disque, information pouvant être utile pour un autre système d'exploitation éventuel.

LVM peut également être utilisé au dessus d'une couche de chiffrement auquel cas il faudra effectuer cette étape au préalable (voir LUKS#LVM pour plus de détails)

Attention : Le répertoire /boot ne peut pas être situé sur une partition LVM, car GRUB (version <1.95) ne peut pas les lire.
Astuce : Toutes les partitions LVM de tous les disques présents peuvent être configurées pour apparaître comme un seul disque.

Créer les volumes physiques

Il faut maintenant initialiser les partitions pour les utiliser avec LVM. La commande fdisk -l permet de trouver quelles partitions sont marquées avec le type 'Linux LVM', on alors en faire des volumes physiques pour LVM avec la commande:

# pvcreate /dev/sda2

Remplacez /dev/sda2 avec le nom des partitions concernées pour les utiliser comme volumes physiques. Cette commande écrit un en-tête adéquat sur chaque partition. Pour voir la liste des volumes physiques reconnus par LVM, tapez:

# pvdisplay

Créer un ou plusieurs groupes de volumes

L'étape suivante consiste à créer un groupe de volumes (VG). La commande vgcreate permet de créer un groupe de volumes avec l'une des partitions, et vgextend permet d'ajouter une autre partition dans ce groupe:

# vgcreate VGroupe0 /dev/sda2
# vgextend VGroupe0 /dev/sdb1

Remplacez VGroupe0 par le nom souhaité. L'état du groupe de volume peut être affiché par la commande

# vgdisplay
Note : Il est possible de créer plusieurs groupes de volumes, ils apparaîtront alors comme des «disques» séparés.

Créer des volumes logiques

On peut maintenant définir des volumes logiques pour ce groupe. Cela se fait avec la commande lvcreate, en précisant la talle désirée et le nom du volume, et le groupe dans lequel il apparaîtra:

lvcreate -L 10G VGroupe0 -n home

Ceci crée un volume logique accessible par le chemin /dev/mapper/VGroupe0-home ou /dev/VGroupe0/home. De la même façon, on peut choisir n'importe quel nom pour un volume logique.

Vous pouvez lister les volumes crées avec:

# lvdisplay

Créer un système de fichier

Note : Pour pouvoir manipuler les volumes, il vous faut charger le module dm_mod.

Pour rendre les groupes de volumes disponibles:

# modprobe dm_mod
# vgscan
# vgchange -ay

Ensuite, il suffit d'utiliser les volumes comme n'importe quelle partition:

# mkfs.ext4 /dev/mapper/VGroupe0-home
# mount /dev/mapper/VGroupe0-home /home

Configuration du système

Si une partition nécessaire au système (/, /usr, ...) est en LVM :

  • Rajoutez le HOOK lvm2 à la configuration du /etc/mkinitcpio.conf avant le HOOK filesystems et après le HOOK udev. Si LVM est utilisé au dessus d'une couche de chiffrement (comme LUKS), il est nécessaire de placer le hook lvm2 après encrypt (ou sd-encrypt). Bien sûr, à contrario, si LUKS est installé au dessus de LVM, le hook doit être placé après.
  • Régénérer l'initramfs.

RAID

Il est possible d'utiliser RAID avec LVM, son fonctionnement repose sur dm mais fonctionne à partir des partitions logiques.

Types de RAID pris en charge par LVM :

  • 0 : accélération de l'écriture et de la lecture, pas de redondance, vulnérabilité forte à la défaillance matérielle, nécessite 2 disques minimum
  • 1 : redondance des disques, accélération de la lecture, perte de performances en ecriture, supporte la perte de tous disques tant qu'un seul reste opérationnel, nécessite 2 disques minimum
  • 4 : raid0 avec bloc de sauvegarde par parité, supporte la perte d'un disque, diminuant le risque lié à la défaillance matérielle, procédure de restauration chronophage, lecture et ecriture accélérées, nécessite 3 disques minimum
  • 5 : raid4 avec bloc de sauvegarde par parité répartie, diminuant le temps de récupération en cas de défaillance matérielle, lecture et ecriture accélérées, nécessite 3 disques minimum
  • 6 : raid5 avec double bloc de sauvegarde par parité répartie, supporte la perte de deux disques, nécessite au moins 4 disques
  • 10 : raid0 sur raid1, redondance, lecture et ecriture améliorées, nécessite beaucoup de disques, au minimum 4 disques

Créer une partition RAID

On peut créer une partition RAID grâce à la commande suivante (à effectuer après l'étape de création de groupe de volume).

# lvcreate --type TYPE_RAID --name NOM_DE_LA_PARTITION --size TAILLE VG [Volumes Physiques ...]

Par exemple, pour créer une partition logique en RAID 5 de 40Gio sur les partitions de disque sda1, sdb1, sdc1 (préalablement rajouté dans le groupe de volumes vg0 et d'une taille minimale de 40Gio chacun) :

# lvcreate --type raid5 --name lvol_raid5 --size 40G vg0 /dev/sda1 /dev/sdb1 /dev/sdc1

LVM Cache

De plus en plus d'utilisateurs possèdent plusieurs types de volumes de stockage, ce qu'on appelle un "stockage hybride", c'est à dire un ensemble hétérogène de technologie de stockage par exemple un mélange de disques mécanique, généralement avec beaucoup de place de stockage avec un SSD relativement petit. LVM permet d’accélérer un disque lent et volumineux avec un disque rapide et plus petit, pour cela on peut utiliser le SSD comme un cache de gros volume, LVM placera de façon intelligente les blocs les plus utilisés sur la partition de cache, diminuant ainsi leur temps d'accès.

Créer un cache

Pour créer un cache de 20Gio pour la partition logique donneesLV du groupe donnesVG sur le disque /dev/sdx1 (de préférence un volume plus rapide que le volume utilisé jusqu'alors) :

# lvcreate --type cache --cachemode writethrough --size 20G --name donneesLV_cache donneesVG/donneesLV /dev/sdx1

Supprimer un cache

# lvconvert --uncache donneesVG/donneesLV

Allocation dynamique

Il est possible d'allouer plus finement la place prise par les partition logiques, grâce à l'allocation dynamique, ou "thin provisioning". Pour cela on créé des partitions réservoirs ou thinpool qui serviront d'espaces dans lesquels les autres partitions grandiront, partitions qu'on appelle des partitions fines (thin partition).

Cette stratégie permet d'allouer le stockage à mesure qu'on l'utilise laissant ainsi de la place libre éventuelle dans le disque et permettant ainsi d'utiliser cet espace pour autre chose (notamment des sauvegardes). Elle utilise une stratégie COW (Copy on write) permettant également de préserver intrinsèquement la santé des SSD et qui permet des clichés rapides des partitions (snapshot).

Dû à l'incapacité de la plupart des systèmes de fichier à se réduire à chaud (comme ext4) ou même à se réduire tout court dans l'absolu (comme xfs), cette stratégie permet également de réserver de la place qui ne pourrait pas être dégagée à chaud sur un système statique.

Ce type d'allocation augmente cependant la fragmentation du système, même si LVM tend à réduire ce phénomène en déplaçant les PE pour optimiser les performances du disques de manière automatique. Elle ajoute également un niveau d'abstraction au stockage.

Préalable

Avant toutes choses, il est nécessaire d'activer le moniteur de LVM, moniteur gérant justement les partitions fines et les clichés. Pour cela, activer et démarrer le service lvm2-monitor.service :

# systemctl start lvm2-monitor.service

Seuil

Ensuite, on peut paramétrer le seuil d'agrandissement des réservoirs, ce seuil définit le pourcentage d'occupation du réservoir à partir duquel le moniteur prendra la décision automatique d'agrandir le réservoir. Pour cela, on peut modifier la valeur de thin_pool_autoextend_threshold dans /etc/lvm/lvm.conf

thin_pool_autoextend_threshold = 100

De base, cette valeur est fixée à 100 ce qui indique au moniteur qu'il n'agrandira pas les réservoirs, en fixant une valeur de 90 par exemple, le moniteur agrandira les réservoirs à chaque fois que ceux-ci atteindront 90% d'utilisation. La valeur thin_pool_autoextend_percent définit quant à elle le pourcentage de stockage supplémentaire allouer en plus.

thin_pool_autoextend_percent = 30

De base, cette valeur est à 30, ce qui signifie que le moniteur agrandira de 30% le réservoir à chaque fois que le seuil sera atteint (ou moins si il n'y a pas la place d'allouer autant) En utilisant une valeur seuil de 90 et un pourcentage d'agrandissement de 10 sur un réservoir de 10Go par exemple :

thin_pool_autoextend_threshold = 90
thin_pool_autoextend_percent = 10

Lorsque 9Go des 10Go seraient occupés, le moniteur agrandira le réservoir à 11Go. Ensuite, lorsque 9,9Go seront occupés, le moniteur agrandira le réservoir à 1,21Go et ainsi de suite. Notez qu'à chaque agrandissement, contrairement à une opération manuelle sur une partition logique, le système de fichier n'est pas agrandit lui même, celui-ci évolue dans un volume logique dont la taille peut être grandement supérieur au réservoir à l'origine. Il est néanmoins conseillé que la taille totale des volumes doit être inférieure ou égales à celle des disques dans lesquels le réservoir grandit, en effet, si le réservoir ne peut pas grandir, le système de fichier renverra des erreurs dû à l'impossibilité d'accès à certaines de ses zones.

Exemple d'un partitionnement dynamique.

Niveau d'abstraction
                                              _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
Partitions fines                             |/ (15Go            |/home (160Go       |
                                             |dont 6Go utilisés) |dont 40Go utilisés)|
                          _ _ _ _ _ _ _ _ _ _|_ _ _ _ _ _ _ _ _ _|_ _ _ _ _ _ _ _ _ _|_ _ _ _ _ _ _ _ _ _ _ _ _ _
Réservoirs               |/boot (200Mo)      |reservoirsysteme (10Go)    |reservoirdonnees (65Go)  |Espace libre |
                         |                   |                           |                         |(< 100Go)    |
                         |_ _ _ _ _ _ _ _ _ _|_ _ _ _ _ _ _ _ _ _ _ _ _ _|_ _ _ _ _ _ _ _ _ _ _ _ _|_ _ _ _ _ _ _|
Groupe de                |vg0 (< 175Go)                                                                          |
Volumes                  |                                                                                       |
          _ _ _ _ _ _ _ _|_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _|
Table    |Partition ESP  |Partition LVM          |Partition LVM            |Partition LVM                        | 
GPT ou   |ou BIOS 1-200Mo|                       |                         |                                     |
MBR      |_ _ _ _ _ _ _ _|_ _ _ _ _ _ _ _ _ _ _ _|_ _ _ _ _ _ _ _ _ _ _ _ _|_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _|
Physique |Disque physique 25Go                   |Disque physique 50Go     |Disque physique 100Go                |
         |_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _|_ _ _ _ _ _ _ _ _ _ _ _ _|_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _|


Créer un réservoir

Attention : Le répertoire /boot ne peut pas être situé sur une partition fine, car GRUB ne les reconnait pas même dans ses versions les plus récentes

Pour créer un réservoir à partition fine dans le group vg0, on peut utiliser la commande suivante :

lvcreate --type thin-pool --name NOM_RESERVOIR --size 8G vg0

Créer une partition fine

Pour créer la partition home dans un réservoir

lvcreate --type thin --thinpool vg0/NOM_RESERVOIR -V 160G --name home vg0

Il est possible également de créer plusieurs partitions fines dans le même réservoir.

A noter ici que la taille est virtuelle, la taille est donc (dans le cas présent) de 160Gio même si le réservoir est de taille largement inférieure, lorsque le système de fichier sera créé, il reconnaitre ainsi 160Gio.

Ressources supplémentaires

Autres articles sur LVM sur ArchWiki :

Autres ressources sur ArchWiki :

  • Btrfs qui intègre les mêmes idées que LVM dans un système de fichiers.

Liens externes :