LVM – Gestionnaire de volumes logiques

LVM est un gestionnaire de volumes logiques (Logical Volume Manager) écrit pour Linux en 1998. L’objectif de LVM est de fournir une couche d’abstraction entre le système de fichiers (Ext2/3/4, XFS, ReiserFS, FAT, NTFS, …) et le disque physiaue sur lequel il repose. Ce tutoriel vous propose un rapide tour d’horizon de l’architecture de LVM, ainsi qu’une mise en pratique de cette fonctionnalité.

L’architecture de LVM

LVM définit trois grands types d’objet :

  • PV : Physical Volume, un volume physique qui correspond à une partition sur un disque, formatée spécifiquement pour LVM ;
  • VG : Volume Group, un aggrégat de PV de type RAID-0/JBOD ;
  • LV : Logical Volume, un volume virtuel créé dans un VG, qui expose un block device sur lequel on créera un système de fichiers.

L'architecture LVM

Les volumes physiques, ou PV, sont créés sur une partition disque stnadard (par exemple /dev/sdb2). Ensuite, ces PVs sont utilisés pour former un Volume Group (VG). Un VG est un aggrégat de volumes physiques formant un volume virtuel de type RAID-0 (ou “JBOD“). Vous pouvez ajouter de nouveaux PVs à un VG quand bon vous semble afin d’ajouter de l’espace.

C’est sur ce VG que nous allons ensuite créer des volumes logiques (LV). Ces LV vont consommer l’espace disque disponible dans le VG sur lequel ils sont créés. Notez que ces VG ne sont pas directement utilisés. Vous pouvez créer plusieurs LV dans un VG. Une fois un LV créé, un nouveau block device sera créé dans /dev/mapper, sur lequel nous viendrons installer un système de fichiers grâce à la commande mkfs. Nous le monterons ensuite comme n’importe quel autre système de fichiers.

Mise en application

Nous allons passer en revue l’ensemble des actions requises pour monter un système de fichiers basé sur un volume LVM. Cette procédure a été effectuée sur un système Debian GNU/Linux 9 (stretch), mais elle devrait fonctionner sur n’importe quel système basé sur un noyau Linux 3.2 et plus récent.

0 – Installation des outils LVM

Si cela n’est pas déjà fait, vous devez installer les outils LVM à l’aide des commandes suivantes : Pour Debian : % sudo apt-get install lvm2 Pour RHEL et similaires : % sudo yum install lvm2-cluster

1 – Préparation d’une partition physique pour LVM

Dans notre cas, nous avons une machine virtuelle fonctionnant avec deux disques durs : un pour le système (/dev/vda), et un que nous allons utiliser pour LVM (/dev/vdb). Nous formattons ce disque à l’aide de l’outil fdisk.

root@test-lvm:~# fdisk /dev/vdb

Welcome to fdisk (util-linux 2.29.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0x38bc0c25.

Command (m for help): p
Disk /dev/vdb: 25 GiB, 26843545600 bytes, 52428800 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xa5e9965b

We initialize the empty disk with a new primary partition that will be used as a LVM Physical Volume (PV).

Command (m for help): n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): <strong>p</strong>
Partition number (1-4, default 1):
First sector (2048-52428799, default 2048): <RETURN>
Last sector, +sectors or +size{K,M,G,T,P} (2048-52428799, default 52428799): <RETURN>

Created a new partition 1 of type 'Linux' and of size 25 GiB.

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

Une fois l’opération effectuée, le noyau lit la nouvelle table des partitions et créé les block devices associées — dans notre cas, /dev/vdb1.

2 – Création des ressources LVM

Nous initialisons ensuite cette nouvelle partition pour l’utiliser avec LVM grâce à la commande pvcreate :

# pvcreate /dev/vdb1
  Physical volume "/dev/vdb1" successfully created.

Nous pouvons vérifier les propriété de ce nouveau PV avec la commande pvdisplay :

# pvdisplay
  --- Physical volume ---
  PV Name               /dev/vdb1
  VG Name               vg-demo
  PV Size               25.00 GiB / not usable 3.00 MiB
  Allocatable           yes
  PE Size               4.00 MiB
  Total PE              6399
  Free PE               6399
  Allocated PE          0
  PV UUID               2POxXh-S7Gx-zd6v-RnK0-OFt9-RYb0-SIVBbF

Ensuite, nous initialisons un nouveau Volume Group (VG) basé sur ce PV :

# vgcreate vgdemo /dev/vdb1
  Volume group "vgdemo" successfully created

De même, nous pouvons contrôler ses propriétés avec la commande vgdisplay :

# vgdisplay
  --- Volume group ---
  VG Name               vgdemo
  System ID
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  1
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                0
  Open LV               0
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               25.00 GiB
  PE Size               4.00 MiB
  Total PE              6399
  Alloc PE / Size       0 / 0
  Free  PE / Size       6399 / 25.00 GiB
  VG UUID               2Sp2pp-17jB-eNCN-vjQu-YF40-kiUw-9i2Rd9

Deux commandes moins verbeuses existent également pour cela : pvs and vgs

# pvs
  PV         VG      Fmt  Attr PSize  PFree
  /dev/vdb1  vgdemo  lvm2 a--  25.00g 25.00g
# vgs
  VG      #PV #LV #SN Attr   VSize  VFree
  vgdemo    1   0   0 wz--n- 25.00g 25.00g

Comme nous pouvons le constater, l’ensemble de l’espace disque correspondant à la taille du PV est disponible dans le VG. C’est dans cet espace que nous allons piocher pour créer nos volumes logiques (LV). Nous allons maintenant créer un LV de 10 GiB à l’aide de la commande lvcreate :

# lvcreate vgdemo -L10G -n lvtest1
  Logical volume "lvtest1" created.

Ici, nous spécifions le VG sur lequel nous allons créer le LV, suivi de sa taille (option -L), puis de son label ( -n). Comme auparavant, nous pouvons vérifier sa création et ses propriétés avec les commandes lvdisplay ou lvs :

# lvs
  LV          VG      Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  lvtest1     vgdemo  -wi-a----- 10.00g

Un nouveau block device a été créé : /dev/dm-0. Un lien symbolique existe également /dev/mapper pour faciliter son identification par l’administrateur système ; la convention de nommage est <vgname>-<lvname> :

# ls -l /dev/mapper
total 0
crw------- 1 root root 10, 236 Aug 1 15:37 control
lrwxrwxrwx 1 root root 7 Aug 1 15:42 vgdemo-lvtest1 -> ../dm-0

Comme nous pouvons le voir ci-dessous, il ne reste plus que 15 GiB d’espace disponible dans le VG, puisque nous avons alloué 10 GiB à notre LV :

# vgs
  VG     #PV #LV #SN Attr   VSize  VFree
  vgdemo   1   1   0 wz--n- 25.00g 15.00g

Toutes les étapes requises pour créer un volume logique sont maintenant effectuée, il est temps de le formatter avec un système de fichiers.

3 – Création et montage du système de fichiers

Chez Jaguar Network, nous sommes depuis toujours des fans de XFS, un système de fichiers développé par SGI en 1993. La plupart des noyaux Linux aujourd’hui intègrent le support pour XFS, mais il se pourrait que vous deviez installer les outils pour le formatter :

# apt-get install xfsprogs

Ensuite, nous pouvons formatter notre LV :

# mkfs.xfs /dev/mapper/vgdemo-lvtest1
meta-data=/dev/mapper/vgdemo-lvtest1 isize=512    agcount=4, agsize=655360 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=0, rmapbt=0, reflink=0
data     =                       bsize=4096   blocks=2621440, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

Puis le monter sur un répertoire de notre arborescence Unix :

# mount -t xfs /dev/mapper/vgdemo-lvtest1 /mnt/test1

Vérifions l’espace disponible :

# df -h /mnt/test1
Filesystem                  Size  Used Avail Use% Mounted on
/dev/mapper/vgdemo-lvtest1   10G   43M   10G   1% /mnt/test1

Tout semble corect. Dans le prochain tutoriel, nous verrons comment créer d’autre volumes logiques, comment les agrandir, comment rajouter de nouveaux PV dans un VG, et beaucoup d’autres choses intéressantes avec LVM !