====== Logical Volume Manager (LVM) ======
Si installa il pacchetto Debian **lvm2**:
apt install lvm2
Con **parted** si crea la partizione e si imposta il flag **lvm**:
(parted) set 5 lvm on
===== Concetti =====
^ physical volumes | Dispositivi a blocchi (//block devices//) che costituiscono la base per lo spazio di memorizzazione LVM. Possono essere semplici partizioni di un disco, volumi RAID, ecc. |
^ volume groups | Un //volume group// è l'unione di uno o più //physical volumes//, il cui spazio totale viene visto come entità unica di cui disporre. |
^ logical volumes | Lo spazio di un //volume group// viene allocato creando uno o più //logical volumes// al suo interno. Tale volume è un block device che può essere utilizzato ad esempio per contenere un filesystem. |
===== physical volumes, volume groups e logical volumes =====
Crea due **physical volumes**:
pvcreate /dev/sda5
pvcreate /dev/sdb1
Crea un **volume group** (per il momento con un solo volume fisico) e lo attiva:
vgcreate data_vg /dev/sda5
vgchange --activate y data_vg
Crea un **logical volume** che si estende per il 100% dello spazio libero:
lvcreate --extents +100%FREE data_vg --name data
Creazione di alcuni **logical volume** con dimensione specifica nel volume group **vg_server1**:
lvcreate --size 32G --name lv_rootfs vg_server1
lvcreate --size 16G --name lv_swap vg_server1
lvcreate --size 100G --name lv_var vg_server1
===== Verifica configurazione =====
Verifica i volumi fisici, i gruppi di volumi e i volumi logici esistenti:
pvs
PV VG Fmt Attr PSize PFree
/dev/sda5 data_vg lvm2 a-- 918,47g 0
/dev/sdb1 lvm2 --- 931,51g 931,51g
vgs
VG #PV #LV #SN Attr VSize VFree
data_vg 1 0 0 wz--n- 918.47g 918.47g
lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
data data_vg -wi-a----- 918.47g
/dev/data_vg/data -> ../dm-0
===== Modifica configurazione =====
Estende il volume group con un volume fisico aggiuntivo:
vgextend data_vg /dev/sdb1
Estende il volume logico **data** aggiungendo tutto lo spazio libero nel volume group **data_vg**. Il filesystem viene ridimensionato contestualmente (funziona anche con filesystem montato e in uso):
lvextend --extents +100%FREE --resizefs data_vg/data
===== Riduzione di un volume logico =====
Può capitare che di desideri aggiungere o **aumentare lo spazio libero** in un **volume group**, ad esempio per poter creare uno snapshot di un volume logico. In questo caso di decide di **ridurre la dimensione di un volume logico** esistente, effettuando contestualmente il **resize del filesystem** in esso contenuto:
lvreduce --resizefs --size -2G /dev/vg_server1/lv_home
===== Resize disco => LVM => filesystem =====
Vedere **[[http://sirlagz.net/2016/01/20/live-resizing-lvm-on-linux/|Live Resizing LVM on Linux]]**.
Supponiamo che esista una partizione LVM che occupa un intero disco. La partizione potrebbe essere stata creata in precedenza con questi comandi, prima usando **parted**:
parted
(parted) mklabel gpt
(parted) mkpart primary 0% 100%
(parted) set 1 lvm on
e quindi usando i **tool LVM**:
~# pvcreate /dev/sdb1
~# vgcreate home_vg /dev/sdb1
~# vgchange --activate y home_vg
~# lvcreate --extents +100%FREE home_vg --name homefs
~# pvs
~# vgs
~# lvs
...
FIXME Il seguito è da verificare! Appunti per aumentare la dimensione di una partizione LVM dopo aver allargato il disco (virtuale, ovviamente!).
Con parted verificare che il disco sia davvero allargato e che abbia spazio libero contiguo alla partizione da allargare:
parted /dev/sdb
(parted) unit b
(parted) print free
Allargare la partizione per lo spazio libero risultante:
(parted) resizepart 1 75161927679B
Allargare il **physical volume**:
pvresize /dev/sdb1
Allargare il **logical volume**:
lvresize -l +100%FREE /dev/home_vg/homefs
Il percorso del volume logico si vede con **lvs**, ed è composto da **%%/dev/[VolumeGroup]/[LogicalVolume]%%**.
Allaragare il filesystem:
resize2fs /dev/home_vg/homefs
===== Snapshot =====
Crea uno snapshot del volume logico **lv_rootfs** assegnando il nome **lv_rootfs_snap** e allocando al massimo 2 Gb di spazio:
lvcreate --snapshot --size 2G --name lv_rootfs_snap /dev/vg_server1/lv_rootfs
Viene creato il device virtuale **/dev/vg_server1/lv_rootfs_snap**.
Per vedere lo **stato dello snapshot** (soprattutto lo spazio usato dei 2 Gb allocati):
lvdisplay /dev/vg_server1/lv_rootfs_snap
...
COW-table size 2.00 GiB
...
Allocated to snapshot 16.76%
...
Se lo spazio tende ad esaurirsi è possibile allocarne altro con **lvextend**, sempre ammesso che esista spazio libero nel volume group.
Nel caso in cui lo spazio dello snapshot si esaurisca, il device snapshot viene invalidato e mostra l'attributo **I** in **lvs**:
lvs
LV VG Attr LSize Pool Origin Data%
lv_rootfs vg_server1 owi-aos--- 32.00g
lv_rootfs_snap vg_server1 swi-a-s--- 2.00g lv_rootfs 27.21
lvs
LV VG Attr LSize Pool Origin Data%
lv_rootfs vg_server1 owi-aos--- 32.00g
lv_rootfs_snap vg_server1 swi-I-s--- 2.00g lv_rootfs 100.00
Infine per liberare lo spazio si rimuove lo snapshot con **lvremove**:
lvremove /dev/vg_server1/lv_rootfs_snap
===== Web References =====
* **[[https://wiki.archlinux.org/title/LVM|ArchWiki LVM]]**