Ricerca nel sito web

Introduzione al thin provisioning di LVM


LVM (Logical Volume Manager) è una tecnologia che ci consente di creare uno strato di astrazione sui dispositivi di archiviazione fisici e implementare schemi di partizionamento flessibili in cui i volumi logici sono più facili da ridurre, ingrandire o rimuovere rispetto alle classiche partizioni "nude". Mentre il provisioning "thick" di LVM richiede l'allocazione di una quantità fissa di spazio di archiviazione su un volume logico LVM al momento della creazione, utilizzando il provisioning "thin", lo spazio di archiviazione viene allocato solo quando necessario.

In questo tutorial apprendiamo i concetti di base alla base del thin provisioning LVM e vediamo come creare e gestire thin pool e volumi LVM su Linux.

In questo tutorial imparerai:

  • I concetti di base alla base del thin provisioning di LVM
  • Come creare piscine e volumi sottili

introduzione

Il thin provisioning si basa sul concetto di thin pool e volumi. Quando utilizziamo il thin provisioning, non allochiamo spazio su disco per un volume logico al momento della creazione: forniamo solo una dimensione "virtuale" per loro. Prima di vedere come creare thin pool e volumi, dobbiamo creare un gruppo di volumi e popolarlo con almeno un volume fisico.

Creazione di un gruppo di volumi

Iniziamo utilizzando un'ipotetica partizione /dev/vda1 di 20 GiB come volume fisico LVM:

$ sudo pvcreate /dev/vda1

Per creare un gruppo di volumi (per il bene di questo tutorial lo chiameremo “vg0”) e allo stesso tempo aggiungervi il volume fisico, eseguiamo il seguente comando:

$ sudo vgcreate vg0 /dev/vda1

Possiamo usare il comando vgdisplay per visualizzare la nostra configurazione attuale. In questo caso, restituisce il seguente output:

--- Volume group ---
VG Name vg0
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 1
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 0
Open LV 0
Max PV 0
Cur PV 1
Act PV 1
VG Size <20.00 GiB
PE Size 4.00 MiB
Total PE 5119
Alloc PE / Size 0 / 0
Free PE / Size 5119 / <20.00 GiB
VG UUID jXRrgk-YfNA-Qisj-XxmE-FtCs-chzj-w1idAM

Creazione di un thin pool LVM

Creiamo un thin pool LVM proprio come qualsiasi altro volume logico; l'unica differenza è che utilizziamo l'opzione --thinpool. Supponiamo di voler creare un thin pool denominato “lxcfgpool”; ecco il comando da eseguire:

$ sudo lvcreate --thinpool lxcfgpool -L15GiB vg0

Come puoi vedere, non abbiamo utilizzato tutto lo spazio disponibile nel gruppo di volumi: questa è una misura di sicurezza per garantire un certo margine di espansione per il pool (ne parleremo tra poco). Per verificare che il thin pool sia stato creato, possiamo usare il comando lvs:

$ sudo lvs
LV        VG  Attr       LSize  Pool Origin Data% Meta% Move Log Cpy%Sync Convert
lxcfgpool vg0 twi-a-tz-- 15.00g             0.00  10.57

Osservando l'output, possiamo vedere che al momento non vengono utilizzati dati nel pool, mentre il 10,57% dello spazio viene utilizzato per i metadati. Il primo bit lv_attr, come riportato nella colonna “Attr”, indica il tipo di volume. Una t, come previsto, significa che abbiamo a che fare con un pool ridotto. Aggiungendo l'opzione -a al comando, possiamo raccogliere ancora più informazioni:

$ sudo lvs -a
LV                VG  Attr       LSize  Pool Origin Data% Meta% Move Log Cpy%Sync Convert
[lvol0_pmspare]   vg0 ewi------- 16.00m 
lxcfgpool         vg0 twi-a-tz-- 15.00g             0.00  10.57 
[lxcfgpool_tdata] vg0 Twi-ao---- 15.00g 
[lxcfgpool_tmeta] vg0 ewi-ao---- 16.00m

Poiché abbiamo utilizzato l'opzione -a, i volumi logici “interni” esistenti sono stati inclusi nell'output: a tali volumi non è possibile accedere direttamente dall'utente. A cosa servono? Viene creato un thin pool combinando due volumi logici "standard": uno è destinato a contenere i dati (la "T" nel primo bit lv_attr sta per thin pool data), l'altro è destinato a contenere i metadati (“e”). Viene inoltre creato un volume logico aggiuntivo pmspare (Pool Metadata spare) con le stesse dimensioni del LV dei metadati: viene utilizzato per operazioni di riparazione/ripristino.

Creazione di volumi sottili

Una volta che abbiamo un pool sottile, possiamo creare volumi logici sottili. Creare un volume sottile è davvero semplice. Utilizziamo ancora il comando lvcreate; questa volta, però, invece di specificare la dimensione “statica” del volume, utilizziamo l'opzione -V per specificare la sua dimensione “virtuale”, ovvero la quantità massima di spazio che può occupare. Nell'esempio seguente, creiamo un volume logico thin denominato "thinvolume0" con una dimensione virtuale di 10 GiB:

$ sudo lvcreate -V 10GiB -T vg0/lxcfgpool -n thinvolume0

Il nostro primo volume sottile è pronto. Ora proviamo a crearne un altro della stessa dimensione:

$ sudo lvcreate -V 10GiB -T vg0/lxcfgpool -n thinvolume1

Il comando viene eseguito con successo, tuttavia, questa volta riceviamo una serie di avvisi:

WARNING: Sum of all thin volume sizes (20.00 GiB) exceeds the size of thin pool vg0/lxcfgpool and the size of whole volume group (<20.00 GiB).
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.
Logical volume "thinvolume1" created.

Il primo messaggio è abbastanza chiaro: la somma delle dimensioni virtuali dei due volumi thin (10 GiB ciascuno), è maggiore della dimensione del thin pool. Questo è uno scenario ancora valido perché, come abbiamo già detto, lo spazio viene allocato solo quando viene utilizzato.

Il secondo messaggio ci avverte che non abbiamo attivato la protezione contro l'esaurimento dello spazio della pool sottile. Un pool sottile non dovrebbe mai rimanere senza spazio, altrimenti potrebbero verificarsi danneggiamenti del file system. Impostando l'opzione thin_pool_autoextend_threshold su un valore percentuale < 100 nel file di configurazione /etc/lvm/lvm.conf, possiamo fare in modo che il thin pool venga esteso automaticamente quando viene raggiunta la soglia specificata. Va da sé che affinché questa operazione abbia successo deve esserci spazio disponibile nel gruppo di volumi. La quantità di spazio aggiunto al pool quando viene esteso automaticamente può essere configurata tramite l'opzione thin_pool_autoextend_percent, che, per impostazione predefinita, è solitamente impostata sul 20% dello spazio del pool.

L'importanza del taglio

Con una configurazione di thin provisioning, è molto importante utilizzare periodicamente utilità come fstrim per garantire che i blocchi liberati nei volumi thin ritornino nel pool come spazio disponibile. Dimostriamolo. Abbiamo i nostri volumi thin, ora creiamo su di essi i filesystem:

$ sudo mkfs.ext2 /dev/vg0/thinvolume0
$ sudo mkfs.ext2 /dev/vg0/thinvolume1

Ora montiamo il volume logico “thinvolume0” e simuliamo la creazione di un file da 1 GiB utilizzando dd:

$ sudo mount /dev/vg0/thinvolume0 /mnt
$ sudo dd if=/dev/zero of=/mnt/test bs=1M count=1024

Ecco lo stato del pool dopo aver creato il file:

$ sudo lvs
LV          VG  Attr       LSize  Pool      Origin Data% Meta% Move Log Cpy%Sync Convert
lxcfgpool   vg0 twi-aotz-- 15.00g                  8.87  13.55
thinvolume0 vg0 Vwi-aotz-- 10.00g lxcfgpool        11.65
thinvolume1 vg0 Vwi-a-tz-- 10.00g lxcfgpool        1.65

Come puoi vedere, ora viene utilizzato l'8,87% dello spazio della piscina. Vediamo cosa succede se eliminiamo il file appena creato:

$ sudo rm /mnt/test

Controlliamo ancora lo stato del pool:

$ sudo lvs
LV          VG  Attr       LSize  Pool      Origin Data% Meta% Move Log Cpy%Sync Convert
lxcfgpool   vg0 twi-aotz-- 15.00g                  8.87  13.55
thinvolume0 vg0 Vwi-aotz-- 10.00g lxcfgpool        11.65
thinvolume1 vg0 Vwi-a-tz-- 10.00g lxcfgpool        1.65

Sembra che non sia cambiato nulla. Ora eseguiamo fstrim sul filesystem montato:

$ sudo fstrim /mnt
/mnt: 9.7 GiB (10461900800 bytes) trimmed

Controlliamo un'ultima volta lo stato del pool:

$ sudo lvs
LV          VG  Attr       LSize  Pool      Origin Data% Meta% Move Log Cpy%Sync Convert
lxcfgpool   vg0 twi-aotz-- 15.00g                  2.19  11.30
thinvolume0 vg0 Vwi-aotz-- 10.00g lxcfgpool        1.65
thinvolume1 vg0 Vwi-a-tz-- 10.00g lxcfgpool        1.65

Questa volta, come puoi vedere, lo spazio tagliato è stato restituito alla piscina.

Pensieri conclusivi

A differenza del “thick provisioning”, che richiede l’allocazione di una quantità fissa di spazio ai volumi logici al momento della creazione, il thin provisioning di LVM permette di creare un pool di spazio (un thin pool) e dei volumi thin logici basati su di esso, specificandone solo la dimensione virtuale. Lo spazio del pool viene allocato ai volumi thin solo quando richiesto. In questo tutorial abbiamo visto brevemente come creare una thin pool e dei volumi thin.

Articoli correlati: