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.
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 !