Lab 09 – LVM e LVM-thin
Dipendenze
Sezione intitolata “Dipendenze”- Lab precedenti: Lab 08: modello di storage, thin provisioning.
- Nodi:
desopve04(nodo autonomo,172.27.199.24), usato come banco di prova per lo storage. - Hardware: quattro dischi da 20 GB, da inserire a caldo nei vani hot-swap liberi di
desopve04al passo 2 (vedi l’hardware del laboratorio). Diventerannosdb,sdc,sddesde. - Template: il template Debian 13 nello storage
localdidesopve04. Si scarica dalla GUI come nel Lab 07, oppure da riga di comando:pveam updateaggiorna l’elenco,pveam available --section system | grep debian-13mostra il nome corrente (in questo labdebian-13-standard_13.6-1_amd64.tar.zst) epveam download local <nome>lo scarica. - Indirizzi:
172.27.199.140per il container di prova. - Credenziali:
root/<password-lab>→ Appendice B.
Obiettivi
Sezione intitolata “Obiettivi”- Capire i tre livelli di LVM (PV, VG, LV) e la differenza tra LVM thick e thin.
- Creare un volume group e un thin pool dall’interfaccia web e leggerli da riga di comando.
- Estendere un volume group con un nuovo disco.
- Vedere cosa succede quando un thin pool sovra-allocato si riempie, e come si recupera.
- Prevenire il problema con il monitoraggio e l’estensione automatica.
Come funziona
Sezione intitolata “Come funziona”PV, VG e LV
Sezione intitolata “PV, VG e LV”LVM (Logical Volume Manager) mette uno strato tra i dischi e i volumi:
dischi /dev/sdb /dev/sdc │ │ PV physical volume physical volume pvcreate, pvs └──────┬────────┘ VG volume group (spazio unico) vgcreate, vgextend, vgs ┌───────┼────────┐ LV logical volume logical volume lvcreate, lvextend, lvs- Un PV è un disco (o una partizione) preparato per LVM.
- Un VG unisce uno o più PV in un unico spazio, che si può allargare aggiungendo dischi.
- Un LV è un “pezzo” del VG, visto dal sistema come un block device: per Proxmox VE, un disco di una VM o di un container.
LVM thick e LVM-thin
Sezione intitolata “LVM thick e LVM-thin”LVM (lvm) |
LVM-thin (lvmthin) |
|
|---|---|---|
| Allocazione | thick: l’LV occupa subito tutta la sua dimensione | thin: i blocchi si allocano quando vengono scritti |
| Overprovisioning | no | sì: la somma dei dischi può superare il pool |
| Snapshot e cloni linked | no (in Proxmox VE 9, volume chain in anteprima: lab 16) | sì, veloci |
| Condivisione tra nodi | sì, su una LUN condivisa (lab 15) | no, solo locale |
| Rischio | nessuno: lo spazio è garantito | pool pieno: le scritture falliscono |
Un thin pool è un LV speciale composto da due parti nascoste: _tdata, i dati, e _tmeta, la mappa che dice quali blocchi appartengono a quale volume. Entrambe si possono riempire, ed entrambe vanno sorvegliate.
L’installazione di Proxmox VE su ext4 (come desopve04, lab 03) usa proprio LVM: il VG pve contiene root, swap e il thin pool data, che è lo storage local-lvm.
Procedura
Sezione intitolata “Procedura”1. Il layout LVM dell’installazione
Sezione intitolata “1. Il layout LVM dell’installazione”pvs PV VG Fmt Attr PSize PFree /dev/sda3 pve lvm2 a-- <49.50g <6.13gvgs VG #PV #LV #SN Attr VSize VFree pve 1 3 0 wz--n- <49.50g <6.13glvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert data pve twi-a-tz-- <13.56g 0.00 1.58 root pve -wi-ao---- 21.68g swap pve -wi-ao---- 6.12gNella colonna Attr la prima lettera dice il tipo: t è un thin pool, - un volume normale. data è il thin pool di local-lvm, ancora vuoto.
2. I dischi del nodo
Sezione intitolata “2. I dischi del nodo”Inserisci i quattro dischi da 20 GB nei vani hot-swap liberi di desopve04, a nodo acceso. Il controller segnala i dischi nuovi al kernel da solo; se non compaiono, forza una nuova scansione dei bus SCSI:
for h in /sys/class/scsi_host/host*/scan; do echo "- - -" > $h; doneApri desopve04 → Disks. I quattro dischi da 20 GB hanno Usage No: sono liberi.

3. Creare un volume group dall’interfaccia web
Sezione intitolata “3. Creare un volume group dall’interfaccia web”-
Disks → LVM → Create: Volume Group. Disk
/dev/sdb, Namevg-lab09, Add Storage attivo.
-
Premi Create. Il nuovo VG compare accanto a
pve, vuoto.
-
Proxmox VE ha fatto
pvcreateevgcreate, e ha aggiunto uno storagelvmlimitato al nodo:root@desopve04 grep -A4 "lvm: vg-lab09" /etc/pve/storage.cfgOutput lvm: vg-lab09vgname vg-lab09content images,rootdirnodes desopve04shared 0
4. LVM thick: lo spazio si prende tutto subito
Sezione intitolata “4. LVM thick: lo spazio si prende tutto subito”Alloca un volume da 6 GiB (con un VMID di prova, 990) e guarda lo spazio libero del VG:
pvesm alloc vg-lab09 990 vm-990-disk-0 6G Logical volume "vm-990-disk-0" created.successfully created 'vg-lab09:vm-990-disk-0'lvs vg-lab09 LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert vm-990-disk-0 vg-lab09 -wi-a----- 6.00gvgs vg-lab09 VG #PV #LV #SN Attr VSize VFree vg-lab09 1 1 0 wz--n- <20.00g <14.00gpvesm free vg-lab09:vm-990-disk-0 Logical volume "vm-990-disk-0" successfully removed.Removed volume 'vg-lab09:vm-990-disk-0'Il volume non contiene ancora niente, ma i suoi 6 GiB sono già spariti dal VG (VFree da 20 a 14).
5. Estendere il volume group con un secondo disco
Sezione intitolata “5. Estendere il volume group con un secondo disco”L’interfaccia web crea un VG su un solo disco. Per allargarlo usa la riga di comando: pvcreate prepara il disco, vgextend lo aggiunge.
pvcreate /dev/sdc Physical volume "/dev/sdc" successfully created.vgextend vg-lab09 /dev/sdc Volume group "vg-lab09" successfully extendedvgs vg-lab09 VG #PV #LV #SN Attr VSize VFree vg-lab09 2 0 0 wz--n- 39.99g 39.99gLo storage vg-lab09 mostra subito i nuovi 40 GiB, senza toccare la configurazione: Proxmox VE legge lo spazio dal VG.
6. Creare un thin pool dall’interfaccia web
Sezione intitolata “6. Creare un thin pool dall’interfaccia web”-
Disks → LVM-Thin → Create: Thinpool. Disk
/dev/sdd, Namelab09-thin.
-
L’interfaccia crea un VG
lab09-thinsull’intero disco e, dentro, un thin pool con lo stesso nome. Da riga di comando si vedono anche le parti nascoste del pool (tra parentesi quadre):root@desopve04 lvs -a -o lv_name,vg_name,attr,lv_size,data_percent,metadata_percent lab09-thinOutput LV VG Attr LSize Data% Meta%lab09-thin lab09-thin twi-a-tz-- 16.87g 0.00 1.58[lab09-thin_tdata] lab09-thin Twi-ao---- 16.87g[lab09-thin_tmeta] lab09-thin ewi-ao---- 1.00g[lvol0_pmspare] lab09-thin ewi------- 1.00groot@desopve04 grep -A4 "lvmthin: lab09-thin" /etc/pve/storage.cfgOutput lvmthin: lab09-thinthinpool lab09-thinvgname lab09-thincontent rootdir,imagesnodes desopve04Dei 20 GB del disco, 16,87 GiB vanno ai dati e 1 GiB ai metadati, più 1 GiB di riserva (
pmspare) per riparare i metadati in caso di danni.
7. Overprovisioning: un disco da 6 GiB in un pool da 2
Sezione intitolata “7. Overprovisioning: un disco da 6 GiB in un pool da 2”Per vedere un pool pieno in pochi minuti, crea nel VG vg-lab09 un thin pool piccolo, da 2 GiB, e aggiungilo come storage:
lvcreate --type thin-pool -L 2G -n tp-small vg-lab09 Thin pool volume with chunk size 64.00 KiB can address at most <15.88 TiB of data. Logical volume "tp-small" created.pvesm add lvmthin lab09-small --vgname vg-lab09 --thinpool tp-small --content rootdir,images --nodes desopve04Crea un container con un disco da 6 GiB su quel pool da 2 GiB. L’opzione nesting=1 è quella che l’interfaccia web attiva da sola sui container non privilegiati: serve a systemd.
pct create 940 local:vztmpl/debian-13-standard_13.6-1_amd64.tar.zst --hostname lab09-ct --rootfs lab09-small:6 --memory 512 --cores 1 --unprivileged 1 --features nesting=1 --ostype debian --net0 name=eth0,bridge=vmbr0,ip=172.27.199.140/24,gw=172.27.199.1...pct start 940lvs -o lv_name,attr,lv_size,pool_lv,data_percent,metadata_percent vg-lab09 LV Attr LSize Pool Data% Meta% tp-small twi-aotz-- 2.00g 31.27 16.02 vm-940-disk-0 Vwi-aotz-- 6.00g tp-small 10.42pct exec 940 -- df -h /Filesystem Size Used Avail Use% Mounted on/dev/mapper/vg--lab09-vm--940--disk--0 5.9G 572M 5.0G 11% /Il container vede un disco da 6 GiB con 5 GiB liberi, ma il pool ha solo 2 GiB e ne ha già usato il 31%. È l’overprovisioning: funziona finché i dati scritti davvero restano sotto la dimensione del pool.
Verifica e test
Sezione intitolata “Verifica e test”Test 1 – Il thin pool si riempie
Sezione intitolata “Test 1 – Il thin pool si riempie”Dentro il container scrivi 3 GB di dati casuali: il file system ha spazio, il pool no.
date +%T; pct exec 940 -- dd if=/dev/urandom of=/root/fill bs=1M count=3000 oflag=direct status=none; echo "dd rc=$?"; date +%T13:50:28dd: error writing '/root/fill': No space left on devicedd rc=113:51:58La scrittura si è bloccata per circa un minuto e poi è fallita. Il kernel racconta cosa è successo:
dmesg | grep thin[ 5759.611992] device-mapper: thin: 252:10: reached low water mark for data device: sending event.[ 5759.614980] device-mapper: thin: 252:10: switching pool to out-of-data-space (queue IO) mode[ 5822.127628] device-mapper: thin: 252:10: switching pool to out-of-data-space (error IO) modedmesg | grep EXT4 | tail -3[ 5822.130654] EXT4-fs (dm-12): failed to convert unwritten extents to written extents -- potential data loss! (inode 1595, error -5)[ 5822.131286] EXT4-fs (dm-12): failed to convert unwritten extents to written extents -- potential data loss! (inode 1566, error -5)[ 5822.131944] EXT4-fs (dm-12): failed to convert unwritten extents to written extents -- potential data loss! (inode 1567, error -5)lvs -o lv_name,attr,lv_size,pool_lv,data_percent,metadata_percent vg-lab09 LV Attr LSize Pool Data% Meta% tp-small twi-aotzD- 2.00g 100.00 29.00 vm-940-disk-0 Vwi-aotz-- 6.00g tp-small 33.33- Quando il pool si riempie, device-mapper mette in coda le scritture e aspetta 60 secondi che qualcuno lo allarghi (
queue IO). - Passato il minuto, comincia a rifiutarle (
error IO): il file system del container riceve errori di I/O e alcuni dati vanno persi. - La
Din fondo agli attributi del pool significa out of data space.
Dal punto di vista del container, invece, va tutto bene: il file system crede di avere ancora 3,7 GiB liberi.
pct exec 940 -- df -h /Filesystem Size Used Avail Use% Mounted on/dev/mapper/vg--lab09-vm--940--disk--0 5.9G 1.9G 3.7G 34% /È il pericolo dell’overprovisioning: un guest non può sapere che lo spazio “sotto” è finito. Con una VM, a seconda delle impostazioni del disco, QEMU mette in pausa la VM con lo stato io-error, oppure passa l’errore al sistema operativo ospite.
Test 2 – Recuperare: allargare il pool e liberare spazio
Sezione intitolata “Test 2 – Recuperare: allargare il pool e liberare spazio”-
Il rimedio immediato è dare spazio al pool. Il VG
vg-lab09ha ancora quasi 38 GiB liberi:root@desopve04 lvextend -L +4G vg-lab09/tp-smallOutput Rounding size to boundary between physical extents: 8.00 MiB.Size of logical volume vg-lab09/tp-small_tmeta changed from 4.00 MiB (1 extents) to 8.00 MiB (2 extents).Size of logical volume vg-lab09/tp-small_tdata changed from 2.00 GiB (512 extents) to 6.00 GiB (1536 extents).Logical volume vg-lab09/tp-small successfully resized.root@desopve04 dmesg | grep thin | tail -2Output [ 5832.296162] device-mapper: thin: 252:10: switching pool to write mode[ 5832.296168] device-mapper: thin: 252:10: growing the data device from 32768 to 98304 blocksroot@desopve04 lvs -o lv_name,attr,lv_size,data_percent,metadata_percent vg-lab09/tp-smallOutput LV Attr LSize Data% Meta%tp-small twi-aotz-- 6.00g 33.33 19.68Il pool torna in modalità scrittura.
lvextendha allargato anche i metadati: con un pool così piccolo erano solo 4 MiB. -
Controlla il file system del container, che ha subito errori di scrittura.
pct fscklo verifica a container spento:root@desopve04 pct stop 940pct fsck 940Output fsck from util-linux 2.41.5/dev/mapper/vg--lab09-vm--940--disk--0: clean, 22033/393216 files, 530428/1572864 blocksroot@desopve04 pct start 940pct exec 940 -- ls -lh /root/fillOutput -rw-r--r-- 1 root root 1.3G Nov 9 12:51 /root/fillIl file system è integro, ma il file è rimasto a 1,3 GB invece dei 3 richiesti: le scritture fallite sono perse.
-
Cancella il file. Nel thin pool, però, i blocchi restano occupati finché il file system non comunica al disco quali blocchi sono tornati liberi (discard, o trim):
root@desopve04 pct exec 940 -- rm /root/filllvs -o lv_name,data_percent vg-lab09Output LV Data%tp-small 33.34vm-940-disk-0 33.34root@desopve04 pct fstrim 940Output /var/lib/lxc/940/rootfs/: 1.4 GiB (1518882816 bytes) trimmedroot@desopve04 lvs -o lv_name,data_percent vg-lab09Output LV Data%tp-small 11.98vm-940-disk-0 11.98
Test 3 – Prevenire: estensione automatica del pool
Sezione intitolata “Test 3 – Prevenire: estensione automatica del pool”LVM può allargare da solo un thin pool quando supera una soglia, se il VG ha spazio libero. Lo fa il servizio dmeventd, che sorveglia i pool. Nell’installazione la soglia è al 100%, cioè la funzione è spenta:
lvmconfig --typeconfig full activation/thin_pool_autoextend_threshold activation/thin_pool_autoextend_percentthin_pool_autoextend_threshold=100thin_pool_autoextend_percent=20Invece di cambiare l’impostazione per tutti i pool in /etc/lvm/lvm.conf, crea un profilo e applicalo a un solo pool: soglia 70%, crescita del 50%.
cat > /etc/lvm/profile/lab09-autoextend.profile <<EOFactivation { thin_pool_autoextend_threshold=70 thin_pool_autoextend_percent=50}EOFlvcreate --type thin-pool -L 1G -n tp-auto --metadataprofile lab09-autoextend vg-lab09 Thin pool volume with chunk size 64.00 KiB can address at most <15.88 TiB of data. Logical volume "tp-auto" created.lvcreate -V 3G -T vg-lab09/tp-auto -n lv-auto WARNING: You have not turned on protection against thin pools running out of space. WARNING: Set activation/thin_pool_autoextend_threshold below 100 to trigger automatic extension of thin pools before they get full. WARNING: Sum of all thin volume sizes (9.00 GiB) exceeds the size of thin pools (7.00 GiB). Logical volume "lv-auto" created.lvs -o lv_name,lv_size,data_percent,lv_profile,seg_monitor vg-lab09/tp-auto LV LSize Data% LProfile Monitor tp-auto 1.00g 0.00 lab09-autoextend monitoredGli avvisi di lvcreate sono preziosi: LVM segnala da solo che stai sovra-allocando e che la protezione è spenta. Gli avvisi riguardano l’impostazione globale; il nuovo pool usa invece il profilo.
Ora scrivi 800 MiB nel volume da 3 GiB, cioè il 78% del pool da 1 GiB:
dd if=/dev/urandom of=/dev/vg-lab09/lv-auto bs=1M count=800 oflag=direct status=nonelvs -o lv_name,lv_size,data_percent vg-lab09/tp-auto vg-lab09/lv-auto LV LSize Data% lv-auto 3.00g 26.04 tp-auto 1.50g 52.08journalctl --since "-2 min" --no-hostname | grep dmeventd | grep -E "changed|resized"Nov 09 13:53:51 dmeventd[440]: Size of logical volume vg-lab09/tp-auto_tdata changed from 1.00 GiB (256 extents) to 1.50 GiB (384 extents).Nov 09 13:53:51 dmeventd[440]: Logical volume vg-lab09/tp-auto successfully resized.Superato il 70%, dmeventd ha allargato il pool del 50% (da 1 a 1,5 GiB) e la scrittura è andata a buon fine. L’estensione automatica funziona solo se il VG ha spazio libero: non sostituisce il monitoraggio, ma guadagna tempo.
Nell’interfaccia web, Disks → LVM-Thin mostra per ogni pool l’uso dei dati e dei metadati:

Pulizia
Sezione intitolata “Pulizia”-
Elimina il container, lo storage e i pool di prova, e il profilo:
root@desopve04 pct stop 940 && pct destroy 940 --purge 1pvesm remove lab09-smalllvremove -y vg-lab09/lv-auto vg-lab09/tp-auto vg-lab09/tp-smallOutput Logical volume "lv-auto" successfully removed.Logical volume "tp-auto" successfully removed.Logical volume "tp-small" successfully removed.root@desopve04 rm /etc/lvm/profile/lab09-autoextend.profile -
Dall’interfaccia web, in Disks → LVM-Thin seleziona
lab09-thine scegli More → Destroy. Digita l’ID per confermare. Cleanup Storage Configuration rimuove lo storage, Cleanup Disks cancella le etichette LVM dal disco. Poi, in Disks → LVM, distruggi allo stesso modo i VGlab09-thinevg-lab09.
-
Se un disco conserva l’etichetta di PV, la togli da riga di comando:
root@desopve04 pvremove /dev/sdb /dev/sdcOutput Labels on physical volume "/dev/sdb" successfully wiped.Labels on physical volume "/dev/sdc" successfully wiped.root@desopve04 pvsOutput PV VG Fmt Attr PSize PFree/dev/sda3 pve lvm2 a-- <49.50g <6.13g
- Hai creato un VG e un thin pool dall’interfaccia web, e li hai riconosciuti con
pvs,vgselvs -a. - Hai esteso un VG con un secondo disco.
- Hai visto un thin pool pieno: scritture in coda per 60 secondi, poi errori e dati persi, con il guest ignaro di tutto.
- Hai recuperato il pool con
lvextende liberato spazio conpct fstrim. - L’estensione automatica con un profilo LVM ha allargato il pool prima che si riempisse.
Stato finale del lab
Sezione intitolata “Stato finale del lab”- Sul cluster nulla è cambiato.
- Su
desopve04gli storage sonolocalelocal-lvm. I dischisdb,sdc,sddesdesono di nuovo vuoti, pronti per il lab 10. - Il template
debian-13-standard_13.6-1_amd64.tar.zstresta nello storagelocaldidesopve04.
Cosa hai imparato
Sezione intitolata “Cosa hai imparato”- LVM ha tre livelli: PV (dischi), VG (spazio unico, estendibile) e LV (volumi, i dischi dei guest).
- LVM thick riserva subito lo spazio ed è sicuro; LVM-thin alloca su richiesta, permette snapshot e overprovisioning, ma il pool va sorvegliato.
- Un thin pool pieno blocca le scritture per 60 secondi e poi le rifiuta: i guest perdono dati senza accorgersi che lo spazio è finito.
- Si recupera con
lvextend. Lo spazio dei file cancellati torna al pool solo con il discard (pct fstrim, opzione Discard per le VM). - Data% e Meta% si controllano con
lvso nella pagina LVM-Thin. Un profilo LVM con soglia e percentuale abilita l’estensione automatica per un singolo pool.