Lavorare con LVM
LVM (Logical Volume Manager) è un sistema di gestione dei dischi che aggiunge un livello di astrazione sopra lo storage fisico. Consente di allocare lo spazio su disco in modo flessibile, ridimensionarlo online e creare backup basati su snapshot. È ampiamente utilizzato come livello di storage per la virtualizzazione. Nei sistemi cifrati, LVM viene spesso configurato sopra un dispositivo cifrato con LUKS, in modo che un singolo sblocco renda disponibile l'intero gruppo di volumi.
Questo articolo spiega come installare LVM su Linux, creare Physical Volume, Volume Group e Logical Volume, modificarne le dimensioni, utilizzare gli snapshot e il thin provisioning.
Installare LVM
LVM è incluso per impostazione predefinita nella maggior parte delle distribuzioni Linux. Se non è disponibile, installare il pacchetto lvm2 utilizzando il gestore dei pacchetti del sistema.
Su Debian e Ubuntu:
sudo apt-get install lvm2
Su RHEL, CentOS Stream, AlmaLinux e Rocky Linux:
sudo dnf install lvm2
Creare un Physical Volume
Un Physical Volume (PV) è il componente di base di LVM al livello più basso. Può essere un disco intero (ad esempio, /dev/sdb) oppure una singola partizione (ad esempio, /dev/sdb1).
Utilizzare un disco intero come PV semplifica le operazioni di ridimensionamento successive, poiché non è necessario aumentare prima una partizione sottostante. L'utilizzo di una partizione è preferibile quando il disco deve anche ospitare dati non gestiti da LVM o quando altri strumenti del sistema richiedono una tabella delle partizioni.
Creare un Physical Volume con pvcreate:
sudo pvcreate /dev/sdb
Sostituire /dev/sdb con il percorso del dispositivo a blocchi.
Verificare il risultato con pvdisplay:
sudo pvdisplay
L'output elenca i Physical Volume attualmente gestiti da LVM, insieme alle relative dimensioni e alle informazioni sul Volume Group.
Creare un Volume Group
Un Volume Group (VG) combina uno o più Physical Volume in un unico pool di storage. Da questo pool vengono creati i Logical Volume.
Creare un Volume Group denominato vg0 a partire da un singolo Physical Volume:
sudo vgcreate vg0 /dev/sdb
Oppure da più Physical Volume contemporaneamente:
sudo vgcreate vg0 /dev/sdb /dev/sdc
Verificare il risultato con vgdisplay:
sudo vgdisplay
Creare un Logical Volume
Un Logical Volume (LV) viene visualizzato dal sistema come un normale dispositivo a blocchi. È possibile formattarlo con un file system e montarlo.
Creare un Logical Volume lv0 da 10 GB all'interno del Volume Group vg0:
sudo lvcreate -n lv0 -L 10G vg0
L'opzione -n imposta il nome del Logical Volume, mentre -L ne imposta la dimensione.
Verificare il risultato con lvdisplay:
sudo lvdisplay
Creare un file system sul Logical Volume:
sudo mkfs.ext4 /dev/vg0/lv0
Creare un punto di montaggio e montare il file system:
sudo mkdir -p /mnt/lv0 sudo mount /dev/vg0/lv0 /mnt/lv0
Il nuovo file system sarà ora disponibile in /mnt/lv0. Per montarlo automaticamente all'avvio, aggiungere una voce corrispondente a /etc/fstab.
LVM espone ogni Logical Volume attraverso due percorsi equivalenti: /dev/<vg>/<lv> e /dev/mapper/<vg>-<lv>. Nell'esempio precedente sono /dev/vg0/lv0 e /dev/mapper/vg0-lv0. Entrambi i percorsi puntano allo stesso dispositivo; gli strumenti e i file di configurazione possono utilizzare uno dei due.
Per visualizzare la gerarchia completa PV/VG/LV insieme ai normali dispositivi a blocchi, eseguire:
lsblk
Ridimensionare i volumi
LVM supporta il ridimensionamento online a ogni livello: Physical Volume, Volume Group e Logical Volume.
pvresize aggiorna la configurazione di LVM relativa a un Physical Volume dopo che il dispositivo a blocchi sottostante è stato ridimensionato (ad esempio, dopo aver aumentato un disco virtuale nell'hypervisor):
sudo pvresize /dev/sdb
vgextend aggiunge un Physical Volume a un Volume Group esistente, aumentando così le dimensioni del Volume Group:
sudo vgextend vg0 /dev/sdc
vgreduce rimuove un Physical Volume da un Volume Group:
sudo vgreduce vg0 /dev/sdc
lvresize modifica le dimensioni di un Logical Volume. Ad esempio, per aggiungere 5 GB a lv0:
sudo lvresize -L +5G /dev/vg0/lv0
Oppure per estendere il Logical Volume utilizzando tutto lo spazio libero nel Volume Group:
sudo lvresize -l +100%FREE /dev/vg0/lv0
Notare la differenza tra -L (maiuscola) e -l (minuscola). La versione maiuscola accetta una dimensione con un suffisso di unità come M, G o T. La versione minuscola accetta un numero di extent o una percentuale.
Il ridimensionamento di un Logical Volume non ridimensiona il file system che contiene. Utilizzare lo strumento appropriato per il file system. Per ext2, ext3 ed ext4:
sudo resize2fs /dev/vg0/lv0
Per XFS, eseguire xfs_growfs sul punto di montaggio del file system.
Sui file system supportati, inclusi ext4 e XFS, lvextend con l'opzione -r ridimensiona il Logical Volume e il file system in un'unica operazione:
sudo lvextend -r -L +5G /dev/vg0/lv0
Questa è la forma più comune per l'estensione online.
La riduzione di un Logical Volume richiede l'ordine inverso: prima deve essere ridotto il file system e solo successivamente il Logical Volume. Eseguire l'operazione nell'ordine opposto tronca il dispositivo sottostante mentre il file system continua a considerare disponibile la dimensione originale, causando la distruzione dei dati. Per ext4, l'operazione deve essere eseguita offline. Smontare il file system, eseguire sudo e2fsck -f /dev/vg0/lv0, ridurre il file system con sudo resize2fs /dev/vg0/lv0 <new_size>, ridurre il Logical Volume alla stessa dimensione con sudo lvresize -L <new_size> /dev/vg0/lv0 e quindi montare nuovamente il file system. XFS non supporta affatto la riduzione. L'unico modo per rendere più piccolo un file system XFS è eseguire un backup, crearne uno più piccolo e ripristinare i dati.
Tutti i comandi indicati sopra supportano --help per visualizzare l'elenco completo delle opzioni.
Snapshot LVM
Uno snapshot cattura lo stato di un Logical Volume in un determinato momento. Funziona tramite un meccanismo copy-on-write: quando il Logical Volume originale cambia, i blocchi modificati vengono salvati nello spazio riservato dello snapshot, che continua quindi a mostrare lo stato originale.
Gli snapshot sono utili per creare backup coerenti con gli arresti anomali di un file system in esecuzione e per testare modifiche che possono essere annullate eliminando lo snapshot. I backup coerenti con l'applicazione richiedono un coordinamento aggiuntivo, come il congelamento del file system o la sospensione temporanea dell'applicazione prima della creazione dello snapshot.
Creare uno snapshot
Creare uno snapshot con lvcreate e l'opzione -s:
sudo lvcreate -L 1G -s -n myvolume_snap /dev/myvg/myvolume
Questo crea uno snapshot denominato myvolume_snap del Logical Volume myvolume nel Volume Group myvg, riservando 1 GB per le modifiche. Scegliere la dimensione riservata in base alla quantità di dati che si prevede possa cambiare durante la vita dello snapshot: gli snapshot di volumi per lo più inattivi richiedono poco spazio, mentre i volumi soggetti a molte scritture possono richiedere una parte significativa della dimensione originale.
Per snapshot di lunga durata e scenari che ne prevedono un numero elevato, prendere in considerazione gli thin snapshot all'interno di un thin pool. Essi utilizzano lo spazio del pool condiviso su richiesta invece di riservare in anticipo una quantità fissa, risultando generalmente più efficienti nell'utilizzo dello spazio.
Se il Logical Volume originale cambia più di quanto lo snapshot sia in grado di contenere, lo snapshot diventa non valido e i dati da esso acquisiti vanno persi. Dimensionare lo snapshot in modo da coprire la quantità di modifiche prevista durante il suo ciclo di vita.
Utilizzare uno snapshot
Uno snapshot può essere montato come qualsiasi altro Logical Volume. Per le operazioni di backup e ispezione, montarlo in sola lettura a meno che non sia effettivamente necessario l'accesso in scrittura:
sudo mkdir -p /mnt/snapshot sudo mount -o ro /dev/myvg/myvolume_snap /mnt/snapshot
Una volta montato, lo snapshot può essere utilizzato per la lettura, il backup o l'ispezione.
Rimuovere uno snapshot
Quando lo snapshot non è più necessario, rimuoverlo con lvremove:
sudo lvremove /dev/myvg/myvolume_snap
La rimozione di uno snapshot libera lo spazio che aveva riservato. Tutti i dati scritti direttamente nello snapshot, anziché nel volume originale, andranno persi.
Per riportare il volume originale allo stato acquisito dallo snapshot, utilizzare lvconvert --merge invece di lvremove:
sudo lvconvert --merge /dev/myvg/myvolume_snap
Dopo l'unione, lo snapshot viene consumato e rimosso automaticamente. Se il volume originale è attualmente in uso, l'unione viene posticipata fino alla successiva attivazione del volume.
Thin provisioning
Un thin pool è un tipo speciale di Logical Volume che assegna lo spazio di archiviazione su richiesta. I Logical Volume creati al suo interno (thin volume) possono essere creati con una dimensione dichiarata superiore allo spazio libero effettivamente disponibile nel pool; solo i blocchi che vengono scritti consumano spazio di archiviazione reale.
Questa tecnologia viene utilizzata ampiamente nella virtualizzazione, dove molti dischi virtuali condividono un unico pool di archiviazione, ma raramente raggiungono tutti contemporaneamente la capacità dichiarata.
Creare un thin pool
Creare un thin pool mythinpool da 50 GB nel Volume Group myvg:
sudo lvcreate -L 50G -T -n mythinpool myvg
L'opzione -L imposta la dimensione del pool, -T indica a lvcreate di creare un thin pool e -n imposta il nome del pool. LVM assegna il pool dallo spazio libero del Volume Group; al termine del comando è possibile specificare Physical Volume specifici se il pool deve essere posizionato su determinati dispositivi.
Creare un thin volume
Creare un thin volume mythinvolume da 10 GB all'interno di mythinpool:
sudo lvcreate -V 10G -T myvg/mythinpool -n mythinvolume
L'opzione -V imposta la dimensione virtuale del thin volume, -T fa riferimento al thin pool e -n imposta il nome del nuovo volume.
Utilizzare un thin volume
Un thin volume viene utilizzato come qualsiasi altro Logical Volume. Creare un file system al suo interno:
sudo mkfs.ext4 /dev/myvg/mythinvolume
Successivamente il thin volume può essere montato e utilizzato come un normale dispositivo a blocchi.
Poiché i thin pool possono essere sovraassegnati, è necessario monitorarne l'utilizzo effettivo. Sia lo spazio dati sia lo spazio dei metadati possono esaurirsi indipendentemente e entrambi sono critici: se un thin pool esaurisce lo spazio dati o lo spazio dei metadati mentre viene eseguita una scrittura su un thin volume, le operazioni di scrittura su quel volume inizieranno a non riuscire.
L'utilizzo attuale dello spazio dati e dei metadati di ogni Logical Volume, compresi i thin pool, può essere verificato con lvs:
sudo lvs -o +data_percent,metadata_percent
Quando data_percent o metadata_percent si avvicina al 100%, estendere il thin pool con lvextend prima che si riempia completamente.
Riferimento dei comandi
Comandi LVM comuni raggruppati per livello.
Physical Volume:
- pvcreate inizializza un dispositivo a blocchi come Physical Volume.
- pvdisplay mostra informazioni dettagliate sui Physical Volume.
- pvs mostra una tabella riepilogativa compatta dei Physical Volume.
- pvresize aggiorna un Physical Volume dopo che il dispositivo sottostante è stato ridimensionato.
Volume Group:
- vgcreate crea un Volume Group da uno o più Physical Volume.
- vgextend aggiunge un Physical Volume a un Volume Group.
- vgreduce rimuove un Physical Volume da un Volume Group.
- vgdisplay mostra informazioni dettagliate sui Volume Group.
- vgs mostra una tabella riepilogativa compatta dei Volume Group.
Logical Volume:
- lvcreate crea un Logical Volume.
- lvextend e lvresize modificano le dimensioni di un Logical Volume.
- lvremove rimuove un Logical Volume.
- lvconvert --merge unisce uno snapshot nuovamente al volume di origine.
- lvdisplay mostra informazioni dettagliate sui Logical Volume.
- lvs mostra una tabella riepilogativa compatta dei Logical Volume.
Per l'utilizzo quotidiano, i comandi riepilogativi brevi pvs, vgs e lvs sono generalmente più pratici delle varianti dettagliate *display. Ogni comando supporta --help per visualizzare l'elenco completo delle opzioni.