--- title: Howto LVM category: linux disk ... * LVM est un système permettant de gérer des « logical volumes » (LV) indépendamment des disques. On obtient ainsi un système de partitionnement plus souple, cela facilite notamment l'augmentation (future) de la taille d'un LV. ## Installation ~~~ # apt install lvm2 ~~~ ### PV : les partitions LVM On doit ensuite créer des partitions de type « Linux LVM » (code `8E`). Puis on initialise les partitions pour LVM : ~~~ # pvcreate /dev/hda1 # pvcreate /dev/hdb1 ~~~ **Note** : dans certains cas, on devra utiliser l'option `-ff` (par exemple pour réinitialiser une partition) On pourra ainsi lister les partitions LVM du système avec `pvdisplay` ou `pvs` : ~~~ # pvdisplay --- Physical volume --- PV Name /dev/hda1 VG Name group1 PV Size 124.84 GB / not usable 1.52 MB Allocatable yes PE Size (KByte) 4096 Total PE 31959 Free PE 7639 Allocated PE 24320 PV UUID T12qj5-SEkv-zNrB-QUdG-tFua-b6ok-p1za3e --- Physical volume --- PV Name /dev/hdb1 VG Name group1 PV Size 13.08 GB / not usable 2.08 MB Allocatable yes PE Size (KByte) 4096 Total PE 3347 Free PE 3347 Allocated PE 0 PV UUID CQEeDw-TYNK-n0nh-G7ti-3U3J-4zgk-a7xg2S # pvs PV VG Fmt Attr PSize PFree /dev/hda1 group1 lvm2 a- 13.07G 13.07G /dev/hdb1 group1 lvm2 a- 124.84G 34.84G # pvs -o pv_mda_count,pv_mda_free /dev/hda1 #PMda #PMdaFree 1 91.50K # pvscan PV /dev/sda9 VG group1 lvm2 [124.84 GB / 29.84 GB free] PV /dev/sda12 VG group1 lvm2 [13.07 GB / 13.07 GB free] Total: 2 [137.91 GB] / in use: 2 [137.91 GB] / in no VG: 0 [0 ] ~~~ Si la partition est redimensionnée, on peut augmenter la taille du PV : ~~~ # pvresize /dev/hda1 ~~~ ### VG : les groupes de volumes Une fois nos PV initialisés, on créé un ou plusieurs groupes de volumes (VG) dans lesquels on découpera les volumes logiques (LV). ~~~ # vgcreate group1 /dev/hda1 /dev/hdb1 Volume group "mylvmtest" successfully created ~~~ On peut ainsi les lister avec les commandes `vgdisplay` ou `vgs` : ~~~ # vgdisplay --- Volume group --- VG Name group1 System ID Format lvm2 Metadata Areas 2 Metadata Sequence No 28 VG Access read/write VG Status resizable MAX LV 0 Cur LV 5 Open LV 4 Max PV 0 Cur PV 2 Act PV 2 VG Size 137.91 GB PE Size 4.00 MB Total PE 35306 Alloc PE / Size 24320 / 95.00 GB Free PE / Size 10986 / 42.91 GB VG UUID zwApn7-SCSx-ju4h-6Y1R-x6ie-3wl0-uSE1DE # vgs VG #PV #LV #SN Attr VSize VFree group1 2 5 0 wz--n- 137.91G 42.91G # vgscan Reading all physical volumes. This may take a while... Found volume group "group1" using metadata type lvm2 ~~~ ### LV : les volumes logiques On peut maintenant découper nos volumes finaux : ~~~ # lvcreate -L5G -nfirstlvmvol group1 Logical volume "firstlvmvol" created # lvcreate -L10G -nsecondlvmvol group1 Logical volume "secondlvmvol" created ~~~ On a ainsi des périphériques de stockage utilisables (accessibles via `/dev/mapper/-` ou `/dev//`) que l'on peut formater : ~~~ # mkfs.ext4 /dev/mapper/group1-firstlvmvol # mkfs.ext4 /dev/group1/secondlvmvol ~~~ On peut lister les LV avec `lvdisplay` ou `lvs` : ~~~ # lvdisplay --- Logical volume --- LV Name /dev/group1/firstlvmvol VG Name group1 LV UUID iHCvHy-ow0G-Idf2-hNOi-TRFe-BqvW-tmowLj LV Write Access read/write LV Status available # open 1 LV Size 5.00 GB Current LE 2560 Segments 1 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 253:0 --- Logical volume --- LV Name /dev/group1/secondlvmvol VG Name group1 LV UUID S5GPY7-7q6n-1FCy-ydKA-Js2e-BAOy-wlgYQO LV Write Access read/write LV Status available # open 1 LV Size 10.00 GB Current LE 12800 Segments 1 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 253:1 # lvs LV VG Attr LSize Origin Snap% Move Log Copy% Convert firstlvmvol group1 -wi-ao 5.00G secondlvmvol group1 -wi-ao 10.00G # lvscan ACTIVE '/dev/group1/firstlvmvol' [5.00 GB] inherit ACTIVE '/dev/group1/secondlvmvol' [10.00 GB] inherit ~~~ ### Les snapshots LVM Un snapshot LVM sert à « figer » une partition à chaud. Cela permettra de faire une vraie sauvegarde « tranquillement » par la suite. Exemple typique, une base SQL stocke ses fichiers dans `/srv/sql` qui est en LVM : * On arrête la base SQL (ou on la « lock ») * On déclenche un snapshot LVM de `/srv/sql` * On redémarre (ou « délock ») la base SQL : elle n'aura été arrêtée que quelques secondes ! * Ensuite, on peut monter le snapshot et faire tranquillement son backup (tar, dd, rsync, etc.) * On peut enfin supprimer le snapshot vu qu'il ne sera plus présent au prochain boot **Note** : il semble qu'on peut pas trop avoir deux snapshots en même temps. ~~~ # lvcreate -L100M -s -n snap /dev/mylvmtest/firstlvmvol Logical volume "snap" created # lvdisplay --- Logical volume --- LV Name /dev/mylvmtest/firstlvmvol VG Name mylvmtest LV UUID 4vOXer-YH8x-AB9T-3MoP-BESB-7fyn-ce0Rho LV Write Access read/write LV snapshot status source of /dev/mylvmtest/snap [active] LV Status available # open 0 LV Size 500.00 MB Current LE 125 Segments 1 Allocation inherit Read ahead sectors 0 Block device 253:0 --- Logical volume --- LV Name /dev/mylvmtest/snap VG Name mylvmtest LV UUID lF0wn9-7O3A-FacC-gnVM-SPwE-fCnI-5jb9wz LV Write Access read/write LV snapshot status active destination for /dev/mylvmtest/firstlvmvol LV Status available # open 0 LV Size 500.00 MB Current LE 125 COW-table size 100.00 MB COW-table LE 25 Allocated to snapshot 0.02% Snapshot chunk size 8.00 KB Segments 1 Allocation inherit Read ahead sectors 0 Block device 253:3 # mkdir /tmp/snap # mount /dev/mylvmtest/snap /tmp/snap/ # lvcreate -L100M -s -n snap2 /dev/mylvmtest/firstlvmvol Logical volume "snap2" created device-mapper: snapshots: Invalidating snapshot: Unable to allocate exception. Buffer I/O error on device dm-3, logical block 530 lost page write due to I/O error on dm-3 Buffer I/O error on device dm-3, logical block 530 lost page write due to I/O error on dm-3 Buffer I/O error on device dm-3, logical block 530 lost page write due to I/O error on dm-3 Buffer I/O error on device dm-3, logical block 1 lost page write due to I/O error on dm-3 Buffer I/O error on device dm-3, logical block 1 lost page write due to I/O error on dm-3 # umount /tmp/snap # lvremove /dev/mylvmtest/snap Do you really want to remove active logical volume "snap"? [y/n]: y Logical volume "snap" successfully removed ~~~ ### LVM mirror : du RAID1 avec LVM Une fonctionnalité peu connue de LVM est de permettre de faire du RAID1. Peu d'intérêt à part peut-être gérer du RAID1 « retaillable » sans gérer une couche « MDADM + LVM ». ~~~ # pvcreate /dev/sda7 Physical volume "/dev/sda7" successfully created # pvcreate /dev/sdb5 Physical volume "/dev/sdb5" successfully created # lvcreate -L180G -m1 -nlvmirror --corelog vg00 /dev/sda7 /dev/sdb5 Logical volume "lvmirror" created # lvs -a LV VG Attr LSize Origin Snap% Move Log Copy% lvmirror vg00 mwi-ao 180.00G 8.60 [lvmirror_mimage_0] vg00 iwi-ao 180.00G [lvmirror_mimage_1] vg00 iwi-ao 180.00G ~~~ Pour étendre un miroir LVM, on ajoute des PV au VG : ~~~ # pvcreate /dev/sda8 Physical volume "/dev/sda8" successfully created # pvcreate /dev/sdb6 Physical volume "/dev/sdb6" successfully created # vgextend vg00 /dev/sda8 /dev/sdb6 Volume group "vg00" successfully extended ~~~ On désactive le miroir, on retaille, on réactive : ~~~ # lvextend -L+25G /dev/vg00/lvmirror Extending 2 mirror images. Mirrors cannot be resized while active yeta. # umount /dev/vg00/lvmirror # lvchange -an /dev/vg00/lvmirror # lvextend -L+25G /dev/vg00/lvmirror Extending 2 mirror images. Extending logical volume lvmirror to 205.00 GB Logical volume lvmirror successfully resized # lvchange -ay /dev/vg00/lvmirror ~~~ Enfin on retaille le filesystem : ~~~ # e2fsck -f /dev/vg00/lvmirror e2fsck 1.40-WIP (14-Nov-2006) Pass 1: Checking inodes, blocks, and sizes Pass 2: Checking directory structure Pass 3: Checking directory connectivity Pass 4: Checking reference counts Pass 5: Checking group summary information /dev/vg00/lvmirror: 216749/23592960 files (13.5% non-contiguous), 44825506/47185920 blocks # resize2fs /dev/vg00/lvmirror resize2fs 1.40-WIP (14-Nov-2006) Resizing the filesystem on /dev/vg00/lvmirror to 53739520 (4k) blocks. The filesystem on /dev/vg00/lvmirror is now 53739520 blocks long. ~~~ ## FAQ ### Supprimer une partition LVM d'un VG ~~~ # pvmove -v /dev/hde1 Finding volume group "mylvmtest" Archiving volume group "mylvmtest" metadata. Creating logical volume pvmove0 mirror: Required device-mapper target(s) not detected in your kernel # vgreduce mylvmtest /dev/hde1 Removed "/dev/hde1" from volume group "mylvmtest" ~~~ ### Supprimer un LV ~~~ # lvremove -v /dev/testlvm/testlvm2 Using logical volume(s) on command line Do you really want to remove active logical volume "testlvm2"? [y/n]: y Archiving volume group "testlvm" metadata. Found volume group "testlvm" Removing testlvm-testlvm2 Found volume group "testlvm" Releasing logical volume "testlvm2" Creating volume group backup "/etc/lvm/backup/testlvm" Logical volume "testlvm2" successfully removed ~~~ ### Augmenter la taille d'un LV ~~~ # umount /dev/mylvmtest/thirdlvmvol # lvextend -L+1G /dev/mylvmtest/thirdlvmvol Extending logical volume thirdlvmvol to 4,00 GB Logical volume thirdlvmvol successfully resized # resize2fs -p /dev/mylvmtest/thirdlvmvol # e2fsck -f /dev/mylvmtest/thirdlvmvol -C0 e2fsck 1.35 (28-Feb-2004) Passe 1: vérification inodes, blocs, et des tailles Passe 2: vérification de la structure répertoire Passe 3: vérification de lca connectivité répertoire Pass 4: vérification des compteur de références Pass 5: vérification de l'information du sommaire groupe /dev/mylvmtest/thirdlvmvol: 11/393216 fichier (0.0% non blocs # resize2fs -p /dev/mylvmtest/thirdlvmvol resize2fs 1.35 (28-Feb-2004) Resizing the filesystem on /dev/mylvmtest/thirdlvmvol to Le système de fichiers /dev/mylvmtest/thirdlvmvol a main 8576 blocs. ~~~ ### Réduire la taille d'un LV ~~~ ACTIVE '/dev/mylvmtest/secondlvmvol' [60,00 GB] inherit # umount /dev/mylvmtest/secondlvmvol # e2fsck -f /dev/mylvmtest/secondlvmvol -C0 # resize2fs /dev/mylvmtest/secondlvmvol 50G resize2fs 1.41.12 (17-May-2010) Resizing the filesystem on /dev/mylvmtest/secondlvmvol to 13107200 (4k) blocks. The filesystem on /dev/mylvmtest/secondlvmvol is now 13107200 blocks long. # lvreduce -L-10G /dev/mylvmtest/secondlvmvol WARNING: Reducing active logical volume to 50,00 GB THIS MAY DESTROY YOUR DATA (filesystem etc.) Do you really want to reduce secondlvmvol? [y/n]: y Reducing logical volume secondlvmvol to 50,00 GB Logical volume secondlvmvol successfully resized # mount /dev/mylvmtest/secondlvmvol ~~~ ### LVM et les tailles Les tailles reportées par LVM sont très peu fiables. Un exemple concret avec un VG qui annonce : ~~~ VG Size 137.91 GB PE Size 4.00 MB Total PE 35306 Alloc PE / Size 23040 / 90.00 GB Free PE / Size 12266 / 47.91 GB ~~~ On a tendance à croire qu'il reste de la place… Pourtant un `lvextend` ou `lvcreate` échoue. Par exemple : ~~~ # lvextend -L+10G /dev/group1/data Extending logical volume data to 30.00 GB device-mapper: resume ioctl failed: Invalid argument Unable to resume group1-data (253:3) Logical volume data successfully resized # lvcreate -L5G -ntest group1 device-mapper: resume ioctl failed: Invalid argument Unable to resume group1-test (253:4) /dev/group1/test: write failed after 0 of 4096 at 0: No space left on device Logical volume "test" created ~~~ ### Restauration **/!\\ à manipuler avec beaucoup de précautions /!\\** LVM sauvegarde ses métadatas dans `/etc/lvm/backup` et `/etc/lvm/archive`. On peut éventuellement les restaurer via la commande `vgcfgrestore`. ### Infos sur les volumes ~~~ # dmestup info -c # dmestup info ~~~