Cenni sulla creazione di pool di storage con LVM

lvm

Premessa

Supponiamo di voler aggregare dei dispositivi in un unico storage. Potrebbero essere 3 hd nella propria workstation. O un pool di pendrive.

Ognuno di essi avrà dimensioni differenti e se le usassi singolarmente, quasi certamente la loro dimensione condizionerebbe il loro utilizzo.

Visto che la volta scorsa ho accennato a device mapper, vale la pena spendere due parole sui volumi logici e sulla loro utilità.

Il fatto di poter aggregare dispositivi fisici diversi in un unico (o più) volume virtuale che si può affettare a piacimento, è un'innegabile flessibilità. Inoltre, ogni operazione di estensione o riduzione sarà eseguita sui volumi logici che rappresentano l'astrazione dei dispositivi fisici sottostanti.

Si deve tenere conto però che aggregare dispositivi di natura molto differente (ad es. dischi ssd e dischi a rotazione) può comportare un'imprevedibilità non trascurabile in termini di prestazioni.

Tutto ciò avviene attraverso dei tool disponibili nella userland grazie ai quali:

  1. si fa il mapping fra dispositivi fisici e volumi fisici
  2. si aggregano i volumi fisici in gruppi di volumi
  3. si “affettano” i gruppi di volume in volumi logici

Oltre a poter rimuovere/aggiungere/ridimensionare volumi fisici, gruppi di volume e volumi logici.

Prova sul campo

Nel nostro laboratorio supporremo di avere 3 dischi di dimensioni differenti che vogliamo usare come un unico volume da partizionare in base ad una necessità che non sia legata alla dimensione del dispositivo fisico.

Per simulare tutto ciò, farò uso di file associati dinamicamente a dei loop device attraverso losetup

Emulazione – Fase 1 di 2

Si inizia con la creazione di 3 file container di dimensioni differenti che emuleranno i “device fisici”

fallocate -l 800M disco1.img
fallocate -l 500M disco2.img
fallocate -l 300M disco3.img

Emulazione – Fase 2 di 2

I block device, solitamente originati nel momento in cui avviene la connessione fisica all'host, in questo caso saranno ottenuti associando i file container ai loop device con losetup

losetup -Pf --show disco1.img
  /dev/loop12
losetup -Pf --show disco2.img
  /dev/loop13
losetup -Pf --show disco3.img
  /dev/loop14

Tutto ciò che è stato fatto finora, serve solo ai fini dell'emulazione. Con dispositivi fisici si può cominciare direttamente dal passo 1

Passo 1

Prendiamo nota dell'ip dei loop device( 12,13,14 in questo esempio) e cominciamo a creare i physical volume.

pvcreate /dev/loop12
pvcreate /dev/loop13
pvcreate /dev/loop14 

Passo 2

Dopo aver mappato i volumi fisici con i dispositivi, si farà l'aggregazione in un unico volume group.

vgcreate vg_lab /dev/loop12 /dev/loop13 /dev/loop14

Passo 3

Infine, la creazione dei logical volume. I volumi logici saranno di 100 MiB, 700 MiB, 788 MiB. Non ne fanno parte i 12 MiB dell'header LVM (4 MiB per ogni disco fisico):

lvcreate -n lv_lab_1 vg_lab -L 100M
lvcreate -n lv_lab_2 vg_lab -L 700M
lvcreate -n lv_lab_3 vg_lab -l 100%FREE

Questa definizione va bene per la didattica.

Dilingentemente abbiamo fatto ogni singolo passaggio come bravi scolaretti, ma siccome siamo bravi e c'è un modo più compatto per eseguire alcuni passaggi, vale la pena scoprire quali.

Tralasciando la fase di inizializzazione, mi riferisco ai primi 3 passi, che possono collassare in un unico passaggio perché la creazione di un volume group nel passo 3, noto il dispositivo a blocchi del passo 1, può creare implicitamente i physical volume del passo 2.

In realtà i passi 1 e 2 possono collassare in unico passaggio perché la creazione di un volume group crea contestualmente anche i physical volume.

E quindi, emulazione a parte, sintetizzando:

Passo 1bis (passi 1, 2, 3 e 4):

vgcreate vg_lab /dev/loop12 /dev/loop13 /dev/loop14 

lvcreate -n lv_lab_1 vg_lab -L 100M
lvcreate -n lv_lab_2 vg_lab -L 700M
lvcreate -n lv_lab_3 vg_lab -l 100%FREE

Questo è il minimo indispensabile per creare dei volumi logici.

Dopo aver creato i volumi logici, bisognerà utilizzarli.

I volumi logici sono volumi a cui device mapper fa corrispondere dei block device virtuali sui quali si creeranno dei file system con la formattazione (un exfat e due ext4), come avviene con qualunque altro volume fisico attraverso il corrispondente block device, e si creeranno i punti di montaggio.

# creazione punti di mount
mkdir  disco1 disco2 disco3

# formattazione volumi logici
mkfs.exfat -L "Disco 1" /dev/mapper/vg_lab-lv_lab_1 
mkfs.ext4 -L "Disco 2" /dev/mapper/vg_lab-lv_lab_2
mkfs.ext4 -L "Disco 3" /dev/mapper/vg_lab-lv_lab_3

lvm

Mount LVM Ogni volta che dovremo usare i volumi logici faremo così:

vgchange -ay vg_lab
mount -t exfat -o defaults /dev/mapper/vg_lab-lv_lab_1 disco1
mount -t ext4 -o defaults /dev/mapper/vg_lab-lv_lab_2 disco2
mount -t ext4 -o defaults /dev/mapper/vg_lab-lv_lab_3 disco3

Umount LVM Per smontarli invece basterà:

umount disco1 disco2 disco3
vgchange -an vg_lab

Tutto quello che s'è visto finora, risponde all'esigenza iniziale: come posso aggregare più volumi in unico volume?

Ma riprendendiamo il passo 1bis, per vedere qualcosa di completamente inutile (all'apparenza) ma non per questo meno interessante.

# Passo 1bis
# Fin qua nulla di nuovo.
vgcreate vg_lab $(losetup -Pf --show disco1.img) $(losetup -Pf --show disco2.img) $(losetup -Pf --show disco3.img) 

lvcreate -n lv_lab_1 vg_lab -L 100M
lvcreate -n lv_lab_2 vg_lab -L 700M
lvcreate -n lv_lab_3 vg_lab -l 100%FREE

# Passo 2
vgcreate vg_lab_2 $(losetup -Pf --show /dev/vg_lab/lv_lab_3)
lvcreate -n lv_lab_4 vg_lab_2 -l 100%FREE

La particolarità del passo 2, completamente inutile, ha il solo scopo di mostrare come device mapper mi permetta di stratificare i volumi virtuali attraverso i corrispondenti dispositivi a blocchi virtuali per creare delle vere e proprie matrioske di volumi virtuali.

nested lvm

In questo caso, /dev/mapper/vg_lab-lv_lab_3 diventa un dispositivo a blocchi su un loop device ed è un attimo che quel dispositivo a blocchi diventi a sua volte un gruppo di volumi su cui creare un ulteriore volume logico.

Un discreto nonsense anche se... (to be continued)