Mémo Logical Volume Manager (LVM2)

Logical Volume Manager (LVM) est un système, géré par le noyau, destiné a remplacer, ou plutôt à faire abstraction des partitions lors de la gestion des espaces de stockages sur un système Linux. Les partitions sont remplacés par des « volumes logiques » pouvant être modifiés dynamiquement depuis le système. Les volumes logiques (ou LV) sont utilisés par le système comme n’importe quel volume de stockage (périphériques de blocs).

Principe

Du point de vue système, les disques durs sont découpés en partitions.

Les partitions sont ensuite converties en volume physiques (PV pour Physical Volume) pour pouvoir être utilisés par LVM. Un volume physique (PV) est une partition prête à être utilisée par le Logical Volume Manager.

Les différents volumes physique sont ensuite groupés, organisés, en « groupes de volumes » (VG pour Volume Group). La capacité d’un VG est donc égale à la somme des tailles des partitions qui le compose.

Les groupes de volumes peuvent enfin êtres découpés en volumes logiques (LG pour Logical Group) qui seront utilisés comme des partitions classiques.

Installation

LVM est géré directement au niveau du noyau Linux. Sont installation consiste donc à :

  • activer la fonctionnalité LVM dans le kernel ;

  • installer la suite de binaires permettant de contrôler l’outil (pour créer les volumes physique, les groupes de volumes et les volumes logique -les PV, VG et LG si vous préférez…-, effectuer les « snapshots », etc).

Activation d’LVM dans le kernel

Sur la plupart des distributions proposant un noyau générique, LVM est activé par défaut. Pour vous en assurer effectuez une petite recherche sur le fichier de configuration ayant servit à compiler votre noyau actuel :

16:55:33 fhh@mafalda ~ $ grep CONFIG_MD= /boot/config-`uname -r`
CONFIG_MD=y
16:55:41 fhh@mafalda ~ $ grep BLK_DEV_DM /boot/config-`uname -r`
CONFIG_BLK_DEV_DM=m
16:55:50 fhh@mafalda ~ $ grep DM_SNAPSHOT /boot/config-`uname -r`
CONFIG_DM_SNAPSHOT=m

Si vous compilez votre propre noyau, l’activation d’LVM se passera dans les « devices drivers » :

Device Drivers  --->
...
[*] Multiple devices driver support (RAID and LVM)  --->
...
<M>   Device mapper support
...
<M>     Snapshot target

Installation des outils

Une nouvelle fois, rares sont les distributions ne proposant pas LVM en version « empaquetée »… Nous ne nous attarderons donc pas sur l’installation des outils qui donne quelque chose du genre :

17:12:11 mafalda ~ # apt-get install lvm2

sous Debian et Ubuntu ;

[root@mafalda ~]# yum install lvm2

sur RedHat, CentOS et consorts, et :

mafalda ~ # emerge lvm2

sous Gentoo Linux…

Mise en œuvre de LVM2

Au départ le système disposes de différents périphériques de stockages.

Partitionnement des périphériques de stockage

Créez les partitions nécessaire à l’aide de votre outil favori (fdisk, sfdisk, etc). De préférence, spécifiez que les partitions sont du type « Linux LVM ».

Exemple de partitionnement utilisant un fichier de réponse avec fdisk :

11:48:45 mafalda ~ # dd if=/dev/zero of=/dev/sda bs=512 count=1024
...
11:57:09 mafalda ~ # cat part.sda.fdisk 
n
p
1
 
+125G
n
p
2
 
+125G
n
p
3
 
 
t
3
8e
p
w
11:58:15 mafalda ~ # fdisk /dev/sda < part.sda.fdisk 
...
   Device Boot      Start         End      Blocks   Id  System
/dev/sda1               1       16319   131082336   83  Linux
/dev/sda2           16320       32638   131082367+  83  Linux
/dev/sda3           32639       91201   470407297+  8e  Linux LVM
12:00:00 mafalda ~ # dd if=/dev/zero of=/dev/sdb bs=512 count=1024
...
12:00:08 mafalda ~ # cat part.sdb.fdisk 
n
p
1
 
 
t
8e
p
w
12:00:13 mafalda ~ # fdisk /dev/sdb < part.sdb.fdisk 
...
   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1       91201   732572001    1  FAT12

Nous obtenons des disques découpés en partitions :

Conversion des partition en Physical Volumes (PV)

Les partitions doivent maintenant être transformées, ou enregistrées comme pouvant faire parti d’un groupe de volumes.

Les commandes permettant d’agir sur des volumes physiques commencent toutes par « pv » (pour physical volume).

pvcreate Ce charge de la création des volumes physiques :

12:33:37 mafalda ~ # pvcreate /dev/sdb1 
  Physical volume "/dev/sdb1" successfully created

tandis que pvdisplay affiche les informations sur les PV :

12:33:47 mafalda ~ # pvdisplay 
  "/dev/sdb1" is a new physical volume of "698.64 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdb1
  VG Name               
  PV Size               698.64 GiB
  Allocatable           NO
  PE Size               0   
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               jCH5JO-KILV-tYQq-aOFX-BMFw-HNfA-Kdldji

« pvremove » libère un disque du LVM :

12:37:44 mafalda ~ # pvremove /dev/sdb1
  Labels on physical volume "/dev/sdb1" successfully wiped

« pvscan » Scrute les disques à la recherche de partitions utilisable par LVM :

12:39:21 mafalda ~ # pvscan
  No matching physical volumes found

Dans l’exemple proposé, les partitions sda3, sdb1 et md0 sont converties :

12:43:19 mafalda ~ # pvcreate /dev/sdb1 
  Physical volume "/dev/sdb1" successfully created
12:43:22 mafalda ~ # pvcreate /dev/sda3 
  Physical volume "/dev/sda3" successfully created
12:43:24 mafalda ~ # pvcreate /dev/md0 
  Physical volume "/dev/md0" successfully created

Schématiquement, nous obtenons :

Les différents PVs (en vert) ont le même status pour le LVM.

Création des groupes de volumes (VG)

Tous comme pour les PV, toutes les commandes relatives aux groupes de volumes commencent par « vg ».

Nous assemblons les PV sous des groupes de volumes. « vgscan » Recherche d’éventuels volumes déjà existants :

12:44:41 mafalda ~ # vgscan
  Reading all physical volumes.  This may take a while...
  No volume groups found
12:51:42 mafalda ~ # vgdisplay 
  No volume groups found

« vgcreate » permet de créer les volumes désirés :

12:55:33 mafalda ~ # vgcreate test /dev/sdb1
  Volume group "test" successfully created
12:55:45 mafalda ~ # vgcreate data /dev/md0
  Volume group "data" successfully created

« vgextend » Permet d’ajouter une partition à un volume existant :

12:57:02 mafalda ~ # vgextend test /dev/sda3
  Volume group "test" successfully extended

« vgdisplay » Renseigne sur la liste des groupes de volumes de votre système et « vgdisplay -v » liste de plus les PV associés aux VG :

14:36:25 mafalda ~ # vgdisplay -v
    Finding all volume groups
    Finding volume group "data"
  --- Volume group ---
  VG Name               data
  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               250.01 GiB
  PE Size               4.00 MiB
  Total PE              64004
  Alloc PE / Size       0 / 0   
  Free  PE / Size       64004 / 250.01 GiB
  VG UUID               2Ru6SH-svGS-I1aV-THz2-OnRI-kEK3-JFOe9G
 
  --- Physical volumes ---
  PV Name               /dev/md0     
  PV UUID               0ArHlZ-fWeL-FVZS-OAiX-yFRw-nVyD-C69ZVe
  PV Status             allocatable
  Total PE / Free PE    64004 / 64004
 
    Finding volume group "test"
  --- Volume group ---
  VG Name               test
  System ID             
  Format                lvm2
  Metadata Areas        2
  Metadata Sequence No  2
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                0
  Open LV               0
  Max PV                0
  Cur PV                2
  Act PV                2
  VG Size               573.62 GiB
  PE Size               4.00 MiB
  Total PE              146847
  Alloc PE / Size       0 / 0   
  Free  PE / Size       146847 / 573.62 GiB
  VG UUID               UrfMqr-orvt-5EyN-grgl-15QL-f60R-iugkVA
 
  --- Physical volumes ---
  PV Name               /dev/sdb1     
  PV UUID               E2tTHf-jnbC-ShV7-OQDv-DDc2-6cyi-gGZljp
  PV Status             allocatable
  Total PE / Free PE    64004 / 64004
 
  PV Name               /dev/sda3     
  PV UUID               nTX1Pd-FNhN-hFp3-cvWO-3Ek9-skvE-RVymA0
  PV Status             allocatable
  Total PE / Free PE    114845 / 114845

Notez au passage le « PE Size » qui correspond à la taille des « Physical Extents ». Les PE sont la plus petite unité d’allocation d’espace d’un volume logique. Dans cet exemple, cela signifie qu’un volume logique ne pourra pas faire moins de 4 MiB.

Dans l’exemple proposé, nous obtenons un VG « test » d’une capacité de 500Go et un VG « data » de 250Go :

Ces groupes de volumes vont maintenant découpables en volumes logiques pouvant accueillir les systèmes de fichiers.

« vgmerge » Permet de fusionner des groupes de volumes.

En interrogeant les PV, LVM nous indiquera à quel VG ils appartiennent :

 14:46:40 mafalda ~ # pvscan 
  PV /dev/md0   VG data   lvm2 [250.01 GiB / 250.01 GiB free]
  PV /dev/sdb1   VG test   lvm2 [250.01 GiB / 250.01 GiB free]
  PV /dev/sda3   VG test   lvm2 [250.61 GiB / 250.61 GiB free]
  Total: 3 [750.64 GiB] / in use: 3 [750.64 GiB] / in no VG: 0 [0   ]

« pvscan » Recherche et liste les PV, et l’affiche au format synthétique. Ci dessus, en dernière ligne, nous voyons qu’aucun PV n’est libre, et que l’espace total est, dans des VG, de 750Go.

14:47:14 mafalda ~ # pvdisplay 
  --- Physical volume ---
  PV Name               /dev/sdb1
  VG Name               test
  PV Size               250.01 GiB / not usable 2.12 MiB
  Allocatable           yes 
  PE Size               4.00 MiB
  Total PE              64004
  Free PE               64004
  Allocated PE          0
  PV UUID               0ArHlZ-fWeL-FVZS-OAiX-yFRw-nVyD-C69ZVe
...

Là, les détails du PV sdb1 stipulent qu’il est utilisé par le groupe « test ».

Création des volumes logiques (LV)

Toutes les commandes intervenant sur les volumes logiques commencent par « lv« .

« lvcreate » suivit du nom désiré pour le LV, de la taille et du groupe de volumes d’appartenance permet de créer un volume logique :

15:04:23 mafalda ~ # lvcreate -L125G -n vserver test
  Logical volume "vserver" created
15:04:59 mafalda ~ # lvcreate -L300G -n mails test
  Logical volume "mails" created

Comme pour les PV ou les VG, « lvdisplay » donne les informations relatives aux volumes logiques :

15:08:26 mafalda ~ # lvdisplay 
  --- Logical volume ---
  LV Name                /dev/test/vserver
  VG Name                test
  LV UUID                0II4uD-th0P-Zu2z-Q2NX-nyNt-r05O-2Mgo1K
  LV Write Access        read/write
  LV Status              available
  # open                 0
  LV Size                125.00 GiB
  Current LE             32000
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           254:1
 
  --- Logical volume ---
  LV Name                /dev/test/mails
  VG Name                test
  LV UUID                vb7fQ2-ovd8-H3h6-5JrM-A90b-OCH9-giOO2u
  LV Write Access        read/write
  LV Status              available
  # open                 0
  LV Size                300.00 GiB
  Current LE             76800
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           254:2

« vgdisplay -v » Affiche la liste des VG, des PV qui le composent ainsi que des LV qu’il héberge :

15:12:57 mafalda ~ # vgdisplay test -v
...
 --- Logical volume ---
LV Name                /dev/test/vserver
...
--- Logical volume ---
LV Name                /dev/test/mails
...
--- Physical volumes ---
PV Name               /dev/sdb1
...
PV Name               /dev/sda3
...

Dans l’exemple nous obtenons des VG découpés en LV comme suit :

Utilisation des LV sur le système

Les volumes logiques peuvent maintenant être utilisés comme des partitions classiques.

Nous créerons un système de fichier XFS sur notre LV qui permet en autre d’agrandir les partitions sans avoir à les démonter.

15:53:34 mafalda ~ # lvscan 
  ACTIVE            '/dev/test/vserver' [125.00 GiB] inherit
  ACTIVE            '/dev/test/mails' [300.00 GiB] inherit
15:53:36 mafalda ~ # mkfs.xfs /dev/test/vserver 
...
15:54:53 mafalda ~ # mkfs.xfs /dev/test/mails 
...

Le montage des partitions est alors des plus classiques. Pour un montage systématique, à chaque redémarrage, ajoutez simplement les lignes correspondantes à votre fichier « /etc/fstab » :

16:03:27 mafalda ~ # mkdir /vservers
16:03:32 mafalda ~ # mount /dev/test/vserver /vservers
16:04:05 mafalda ~ # grep vservers /etc/fstab
# Montage du LV des vservers :
/dev/test/vserver        /vservers   xfs     noatime         0       1
16:04:06 mafalda ~ # ^d
16:04:10 fhh@mafalda ~ $ df -h
...
/dev/mapper/test-vserver
                      125G  4.2M  125G   1% /vservers

Les commandes usuelles d’LVM

Comme vous le savez déjà sans doute, LVM ne se contente pas de vous offrir un accès aux périphériques de stockage. Vous allez, avec LVM pouvoir redimensionner une partition en production, effectuer des « snapshot », etc.

Redimensionner un volume logique avec LVM

Agrandir un volume

La commande « lvextend » permet d’augmenter la taille d’un volume logique dans la limite de l’espace disponible sur le VG.

En fonction du système de fichier choisi, il est possible d’agrandir un LV sans même démonter le volume :

18:53:57 mafalda ~ # df -h
...
/dev/mapper/test-vserver
                      125G  4.2M  125G   1% /vservers
18:59:38 mafalda ~ # lvdisplay /dev/test/vserver
  --- Logical volume ---
  LV Name                /dev/test/vserver
...
19:01:29 mafalda ~ # lvextend -L +5G /dev/test/vserver 
  Extending logical volume vserver to 130.00 GiB
  Logical volume vserver successfully resized

Le Volume Logique est agrandi de 5G. Mais pour le moment, le système de fichier, toujours monté, ne prend pas en charge la nouvelle dimension :

19:02:03 mafalda ~ # df -h
...
/dev/mapper/test-vserver
                      125G  4.2M  125G   1% /vservers

Dans le cas d’une partition XFS, la commande « xfs_growfs » adaptera le système de fichier aux nouvelles dimensions du LV :

 19:05:45 mafalda ~ # xfs_growfs /dev/test/vserver
...
data blocks changed from 32768000 to 34078720
19:07:42 mafalda ~ # df -h
...
/dev/mapper/test-vserver
                      130G  4.2M  130G   1% /vservers

Les systèmes de fichiers extended (ext2/ext3/ext4) utiliserons la commande « resize2fs » de la même manière. Attention cependant, il est préconisé de démonté les système de fichiers extended 2 et 3 avant tous redimensionnement…

Réduire un volume

Il est très risqué de réduire un LV disposant d’un système de fichier et c’est bien pire si le file system est monté… Si l’expérience vous tente, lvreduce vous permettra d’effectuer ce type d’action :

19:25:28 mafalda ~ # lvreduce -L-5G /dev/test/vserver 
  WARNING: Reducing active and open logical volume to 125.00 GiB
  THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce vserver? [y/n]: y
  Reducing logical volume vserver to 125.00 GiB
  Logical volume vserver successfully resized
19:26:24 mafalda ~ # xfs_growfs /dev/test/vserver
...
data size 32768000 too small, old size is 34078720

Et là c’est le drame… Après démontage, impossible de remonter la partition… enfin… on y arrive quand même en forçant un peu :

19:27:14 mafalda ~ #  lvextend -L +5G /dev/test/vserver 
  Extending logical volume vserver to 130.00 GiB
  Logical volume vserver successfully resized
19:29:42 mafalda ~ # xfs_repair /dev/test/vserver
...
19:24:48 mafalda ~ # mount /dev/test/vserver /vservers/

Ajouter des PV à un VG

Plus d’espace sur votre disque ? ajoutez un disque dans votre machine, créez une partition sur ce dernier, transformez la en PV et ajoutez la au VG manquant d’espace :

19:36:14 mafalda ~ # vgextend test /dev/sdf1
  Volume group "test" successfully extended

Agrandissez le LV trop plein…

Snaphot de partitions LVM

Pour cette partie, je vous renvoie au post « Snapshot sur LVM2 » sur Admin Linux.

Fusionner des VG

La fusion des groupes de volumes est assurée par la commande « vgmerge » :

20:01:21 mafalda ~ # vgmerge test data
  Volume group "data" successfully merged into "test"

Retirer une partition d’un VG

La commande « vgreduce » permet de retirer un PV d’un VG :

20:06:54 mafalda ~ # vgreduce test /dev/sdb2 
  Removed "/dev/sdb2" from volume group "test"

Une réflexion au sujet de « Mémo Logical Volume Manager (LVM2) »

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *