Cenni sulla creazione di pool di storage con 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:
- si fa il mapping fra dispositivi fisici e volumi fisici
- si aggregano i volumi fisici in gruppi di volumi
- 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
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.
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)