Gestion des volumes groupes et volumes logiques avec LVM

Samuel Chevalley
2 février 2016

LVM (Logical Volume Manager) permet la création et la gestion de volumes logiques sous Linux.

Visualiser les VG, LV et PV

Pour lister les VG, utilisez la commande « vgs » :

root@test:~# vgs
 VG   #PV #LV #SN Attr   VSize  VFree
 VGtoto   1   6   0 wz--n- 19,76g    0

Pour lister les LV, utilisez la commande « lvs » :

root@test:~# lvs
 LV     VG   Attr   LSize   Origin Snap%  Move Log Copy%  Convert
 home   VGtest -wi-ao   7,79g
 root   VGtest -wi-ao 332,00m
 swap_1 VGtest -wi-ao   1,16g
 tmp    VGtest -wi-ao 380,00m
 usr    VGtest -wi-ao   7,32g
 var    VGtest -wi-ao   2,79g

Pour lister les PV, utilisez la commande « pvs » :

root@test:~# pvs
  /dev/sda   VGtoto lvm2 a--  10g       0
  /dev/sda1  VGtoto lvm2 a--  5g        0
  /dev/sda2  VGtoto lvm2 a--  5g        0
  /dev/sda5  VGtoto lvm2 a--  10.76g    0

 

Créer un VG et un LV

Nous partons du principe que tous les disques sont utilisés et que allons devoir en rajouter pour effectuer les opérations décrites par la suite.

Effectuez un « ls /dev/sd* » :

root@test:~# ls /dev/sd*
 /dev/sda  /dev/sda1  /dev/sda2  /dev/sda5

Puis ajouter un disque à la VM et effectuez un « echo « – – – » > /sys/class/scsi_host/host*/scan » afin de forcer le système à re-scanner les disques, puis effectuez à nouveau un « ls /dev/sd* » :

root@test:~# ls /dev/sd*
 /dev/sda  /dev/sda1  /dev/sda2  /dev/sda5  /dev/sdb

Nous voyons donc bien le nouveau disque qui a été ajouté (sdb).

Nous allons ensuite indiquer système que sdb est prêt pour être utilisé par lvm :

root@test:~# pvcreate /dev/sdb
 Physical volume "/dev/sdb" successfully created

Puis on créer un VG (ici mon VG s’appelle « VGtest » et le disque que j’ai ajouté était de 1Go) :

root@test:~# vgcreate VGtest /dev/sdb
 Volume group "VGtest" successfully created

On vérifie :

root@test:~# vgs
 VG   #PV  #LV #SN Attr   VSize  VFree
 VGtest   2   6   0 wz--n- 1g        1g
 VGtoto   1   6   0 wz--n- 19,76g    0

Maintenant que le VG est créé, nous pouvons créer un LV (nommé LVtest) de 500Mo par exemple :

root@test:~# mkdire /mnt/local/TEST


root@test:~# lvcreate -L 5G -n LVtest VGtest
 Logical volume "LVtest" created.

root@test:~# mkfs.ext3 /dev/VGtest/LVtest
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
327680 inodes, 1310720 blocks
65536 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=1342177280
40 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
 32768, 98304, 163840, 229376, 294912, 819200, 884736

Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

root@test:~# lvs |grep test
 LVtest VGtest -wi-ao---- 500M

root@test:~# echo "/dev/VGtest/LVtest  /mnt/local/TEST        ext3    defaults        1 2" >> /etc/fstab

root@test:~# mount -a

root@test:~# df -h | grep test
 /dev/mapper/vgDataLocal-tototest  4.8G   11M  4.6G   1% /mnt/local/AppliPro

 

Étendre un VG

Avec ajout d’un disque :

Pour augmenter la taille d’un VG, effectuez un « ls /dev/sd* » :

root@test:~# ls /dev/sd*
 /dev/sda  /dev/sda1  /dev/sda2  /dev/sda5 /dev/sdb

Puis ajouter un disque à la VM et effectuez un « for i in /sys/class/scsi_host/host*/scan; do echo « – – – » >$i; done » afin de forcer le système à re-scanner les disques, puis effectuez à nouveau un « ls /dev/sd* » :

root@test:~# ls /dev/sd*
 /dev/sda  /dev/sda1  /dev/sda2  /dev/sda5  /dev/sdb /dev/sdc

Nous voyons donc bien le nouveau disque qui a été ajouté (sdc).

Nous allons ensuite indiquer système que sdc est prêt pour être utilisé par lvm :

root@test:~# pvcreate /dev/sdc
 Physical volume "/dev/sdc" successfully created

Puis on l’ajoute au VG (ici mon VG s’appelle « VGtest » et n’a aucun espace libre) :

root@test:~# vgextend VGtest /dev/sdc
 Volume group "VGtest" successfully extended

On vérifie :

root@test:~# vgs
 VG   #PV  #LV #SN Attr   VSize  VFree
 VGtest   2   6   0 wz--n- 10,00g    5,00g
 VGtoto   1   6   0 wz--n- 19,76g    0

J’avais ajouté un disque de 5Go et c’est donc bien ce que nous voyons dans « VFree ».

 

Avec extension d’un disque :

root@test:~# pvs
  /dev/sda   VGtoto lvm2 a--  10g       0
  /dev/sda1  VGtoto lvm2 a--  5g        0
  /dev/sda2  VGtoto lvm2 a--  5g        0
  /dev/sda5  VGtoto lvm2 a--  10.76g    0
  /dev/sdb   VGtest lvm2 a--  20.00g    0

Nous souhaitons étendre le disque /dev/sdb afin d’étendre le VGtest, effectuer un "ls -ld /sys/block/sd*/device" afin d’avoir le nom du device SCSI :

root@test:~# ls -ld /sys/block/sd*/device
lrwxrwxrwx 1 root root 0 Mar 17 10:58 /sys/block/sda/device -> ../../../0:0:0:0
lrwxrwxrwx 1 root root 0 Mar 17 10:58 /sys/block/sdb/device -> ../../../0:0:1:0

Étendre le disque de la VM correspondant au device 0:0:1:0 (par exemple +5Go).

Rafraichir le disque sdb :

echo 1 > /sys/block/sdb/device/rescan

Redimensionner le disque :

pvresize /dev/sdb
  Physical volume "/dev/sdb" changed
  1 physical volume(s) resized / 0 physical volume(s) not resized

On vérifie :

root@test:~# pvs
  /dev/sda   VGtoto lvm2 a--  10g       0
  /dev/sda1  VGtoto lvm2 a--  5g        0
  /dev/sda2  VGtoto lvm2 a--  5g        0
  /dev/sda5  VGtoto lvm2 a--  10.76g    0
  /dev/sdb   VGtest lvm2 a--  20.00g    5g
root@test:~# vgs
 VG   #PV  #LV #SN Attr   VSize  VFree
 VGtest   2   6   0 wz--n- 10,00g    5,00g
 VGtoto   1   6   0 wz--n- 19,76g    0

 

Étendre un LV

Maintenant étendons un LV de 2Go (le LV home par exemple) avec la place libre qu’il reste sur notre VG (les 5Go) :

root@test:~# lvs | grep home
 home   VGtest -wi-ao   7,79g

root@test:~# lvextend -L+2G /dev/VGtest/home
 Extending logical volume home to 9,79 GiB
 Logical volume home successfully resized

root@test:~# lvs | grep home
 home   VGtest -wi-ao   9,79g

root@test:~# df -h | grep home
 /dev/mapper/VGtest-home
 7,7G  146M  7,2G   2% /home

root@test:~# resize2fs /dev/VGtest/home
 resize2fs 1.41.12 (17-May-2010)
 Le système de fichiers de /dev/VGtest/home est monté sur /home ; le changement de taille doit être effectué en ligne
 old desc_blocks = 1, new_desc_blocks = 1
 En train d'effectuer un changement de taille en ligne de /dev/VGtest/home vers 2566144 (4k) blocs.
 Le système de fichiers /dev/VGtest/home a maintenant une taille de 2566144 blocs.

root@test:~# df -h | grep home
 /dev/mapper/VGtest-home
 9,7G  146M  9,1G   2% /home

Remarque : le « lvextend » étend le volume et non le file system, c’est le « resize2fs » qui étend le FS à chaud sans avoir à le démonter. Pour étendre le volume et le FS en même temps il est possible d’utiliser la commande « lvextend -L+2G /dev/VGtest/home -rn« .

Diminution d’un volume logique

Avant de diminuer un LV, il faut commencer par démonter le point de montage de la partition LVM à diminuer (par exemple /home) :

root@test:~# vgs
  VG   #PV #LV #SN Attr   VSize  VFree
  VGtest   2   6   0 wz--n- 10,00g 3,00g
  VGtoto   1   6   0 wz--n- 19,76g    0

root@test:~# df -h | grep home /dev/mapper/VGtest-home                       9,7G  146M  9,1G   2% /home root@test:~# umount /home

Mon FS fait 9.7Go et je veux par exemple le passer à 4Go (je dois donc le diminuer de 5,7Go). J’aurai donc, une fois l’opération effectuée, 8,5Go d’espace libre sur mon VG (nommé VGtest et actuellement à 3Go d’espace libre).

Pour des questions de sécurité, nous allons tout d’abord diminuer le FS d’un peu plus que nous avons besoin (de 6Go au lieu de 5,7Go), puis nous diminuerons le LV (de la taille que nous voulons vraiment, donc de 5,7Go) et enfin ré-augmenterons le FS à 100% sur la taille du LV (pour que ce dernier face bien 4Go comme nous le souhaitons).

Avant de redimensionner une partition il convient de faire un check disk :

root@test:~# e2fsck -f /dev/mapper/VGtest-home
e2fsck 1.41.12 (17-May-2010)
Passe 1 : vérification des i-noeuds, des blocs et des tailles
Passe 2 : vérification de la structure des répertoires
Passe 3 : vérification de la connectivité des répertoires
Passe 4 : vérification des compteurs de référence
Passe 5 : vérification de l'information du sommaire de groupe
/dev/mapper/VGtest-home : 15/640848 fichiers (0.0% non contigus), 77522/2566144 blocs

Redimensionnement de la partition en indiquant sa nouvelle taille (ici 3,7Go au lieu de 4 car nous diminuons un peu plus que voulu vu qu’il s’agit du FS et non du LV) :

root@test:~# resize2fs -p /dev/VGtest/home 3700M
resize2fs 1.41.12 (17-May-2010)
En train de retailler le système de fichiers sur /dev/VGtest/home à 947200 (4k) blocs.
Début de la passe 2 (max = 32805)
Relocalisation de blocs       XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Début de la passe 3 (max = 79)
Examen de la table d'i-noeuds XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Début de la passe 4 (max = 6)
Mise à jour des références d'i-noeudsXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Le système de fichiers /dev/VGtest/home a maintenant une taille de 947200 blocs.

Nous pouvons maintenant diminuer le LV en indiquant de combien on veut le réduire :

root@test:~# lvreduce -L -5700M /dev/VGtest/home
  WARNING: Reducing active logical volume to 4,22 GiB
  THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce home? [y/n]: y
  Reducing logical volume home to 4,22 GiB
  Logical volume home successfully resized

Comme nous avions diminué le système de fichier plus que nécessaire, on le ré-augmente pour qu’il prenne toute le place du volume logique :

root@test:~# resize2fs /dev/test/home
resize2fs 1.41.12 (17-May-2010)
En train de retailler le système de fichiers sur /dev/test/home à 1106944 (4k) blocs.
Le système de fichiers /dev/test/home a maintenant une taille de 1106944 blocs.

Il ne reste plus qu’à remonter la partition qui se trouvant dans la fstab ne nécessite qu’un « mount -a » :

root@test:~# df -h | grep home

root@test:~# mount -a

root@test:~# df -h | grep home
/dev/mapper/test-home
                      4,2G  144M  3,9G   4% /home

Nous partition fait donc bien 4G comme nous le souhaitions.

Le « df » ou un simple « ls » sur le point de montage permet de s’assurer que les données sont bien présentes.