Gestion des volumes groupes et volumes logiques avec LVM
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 PV VG Fmt Attr PSize PFree /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 ,afin de forcer le système à re-scanner les disques, effectuez :
for i in /sys/class/scsi_host/host*/scan; do echo "- - -" >$i; done
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 PV VG Fmt Attr PSize PFree /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 PV VG Fmt Attr PSize PFree /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 (ou xfs_growfs à partir de rhel7) 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
Imaginons que nous voulons réduire /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
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 faut commencer par démonter le point de montage de la partition LVM à diminuer et effectuer un check disk :
root@test:~# umount /home 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.
Diminution d’un volume group
Avant de réduire le VG, il faut avoir réduit le LV/FS à la bonne taille.
Ensuite il convient de sortir le disque voulue (par exemple ici nous voulons sortir « /dev/sdb ») :
root@test:~# pvs PV VG Fmt Attr PSize PFree /dev/sdb VGtest lvm2 a-- 20.00g 20g /dev/sdc VGtest lvm2 a-- 20.00g 5g root@test:~# pvmove /dev/sdb /dev/sdb: Moved: 0,0% /dev/sdb: Moved: 2,0% /dev/sdb: Moved: 3,2% /dev/sdb: Moved: 6,0% /dev/sdb: Moved: 8,4% /dev/sdb: Moved: 11,1% ....
Le « pvmove » va copier toutes les données présentent sur « /dev/sdb » vers le/les autre(s) disque(s) du VG, ici « /dev/sdc ».
Puis faire un « vgreduce » pour sortir le disque du VG :
root@test:~# vgreduce VGtest /dev/sdb Removed "/dev/sdb" from volume group "VGtest" [root@test ~]# pvs PV VG Fmt Attr PSize PFree /dev/sdc VGtest lvm2 a-- 20,00g 5g