Grazie a Heinz Mauelshagen il Logical Volume Manager (LVM) e' disponibile anche per Linux.
Un Logical Volume Manager permette ad un sistema operativo di utilizzare dei dispositivi logici virtuali per l'accesso al disco che mascherano
la natura dei dispositivi fisici (hard disk) su cui risiedono i dati.
In pratica e' possibile utilizzare un device virtuale di cui possono fare parte diversi hard disk fisici, anche di natura, velocita' e
dimensioni diverse.
L'implementazione LVM su Linux (dalla version 2.4 e' presente nel thread ufficiale del kernel, inclusa gia. nella suse in tutte le
distribuzioni e presente nella RedHat dalla 8.0) e' stata sviluppata dalla software house Sistina e mette a disposizioni features quali:
--> Possibilita' di modificare i volumi logici online, senza interruzione del servizio (utile, ad esempio, per ampliare una partizione virtuale);
--> Gestione di molteplici gruppi di volumi logici;
--> Funzionalita' di mirroring, striping o concatening;
--> Possibilita' di eseguire snapshot in tempo reale senza smontare la partizione (fondamentale per operazioni di backup);
--> Strumenti di gestione in command line semplici da usare;
--> Supporto per software di High availability.
I vantaggi di usare un sistema LVM esistono sia su sistemi piccoli che grandi:
--> su sistemi di piccole dimensioni (workstation o server con pochi hard disk) LVM permette di gestire piu' agilmente lo spazio su disco:
ridimensionare una partizione fisica troppo piena di dati e' problematico e pericoloso, mentre e' semplice ed immediato cambiare le dimensioni
di un volume logico.
--> su sistemi di grandi dimensioni, con numerosi dischi fissi da gestire, e' possibile ottimizzare meglio lo storage, modificarne le dimensioni
o sostituire dischi guasti senza interrompere il servizio.
Le componenti basilari di LVM sono:
--> Volume Group (VG) I gruppi di volume, sono il livello di astrazione piu' alta, contengono volumi fisici e logici.
--> Physical Volume (PV) Di fatto sono i singoli hard disk o le loro partizioni, ogni HD o partizione e' un PV
(ma anche un /dev/md0 lo puo' essere, in quanto si presenta come device autonomo e singolo)
--> Logical Volume (LV) Si presenta come un device a blocchi standard, e' paragonabile ad una partizione di un hard disk ed e' quello che viene
referenziato come mount device per una data directory e che va formattato con il filesystem che si desidera.
--> Physical Extent (PE) Ogni volume fisico viene diviso in blocchi di dati di dimensione fisse, chiamati "physical extent".
Questi sono associati (1 a 1) con i:
--> Logical Extent (LE) I blocchi di dati, della stessa dimensione, con cui e' diviso un volume logico.
Diversi volumi logici possono avere LE di dimensioni diverse, ma sempre uguali all'interno dello stesso volume.
A differenza del sistema di partizionamento dischi dove ogni disco e' diviso in partizioni contigue di taglia fissa, LVM permette di considerare i
i dischi,meglio conosciuti come Volumi Fisici (Physical Volumes PV), come un grande spazio (Volume) disponibile per la scrittura di dati,
formato da estensionidi ugual grandezza (volume extents).
Un sistema formato con LVM consiste in un numero arbitrario di volumi fisici, organizzati in Volumes group (VG).
Un volume group consiste in uno o piu' physical volume. Vi puo' essere piu' di un VG in un sistema. Una volta creato il volume group,
diventa l'unita' base di un data storage.
L'intero spazio disponibile per lo storage dei dati, rappresentato da un volume group, puo' essere partizionato in partizioni virtuali
chiamate volumi logici (Logical Volumes LV) di varia grandezza.
Un logical volume puo' comprendere piu' physical volume o una porzione di un volume fisico.
La grandezza di un logical volume e' rappresentata dal numero dei suoi extents.
Una volta creati, gli LV possono essere utilizzati con un normale special file
(come i normali dischi: /dev/sd[a-z]* o /dev/hd[a-z]*) chiamati /dev/VolumeGroupName/LogicalVolumeName
In termini pratici, per mettere in piedi un sistema basato su LVM:
--> Si creano dei volumi fisici, definendoli sulla base di hard disk o partizioni esistenti con il comando pvcreate
--> Si crea un volume group, con due o piu' volumi fisici, con il comando vgcreate.
Se in tempi successivi si devono aggiungere nuovi volumi fisici al gruppo si puo' usare il comando vgextend
--> In un volume group esistente si possono creare i volumi logici veri e propri, con il comando lvcreate
--> Il volume logico creato si presenta come un device a blocchi con nome tipo /dev/nome_vg/nome_lv, che puo' essere normalmente
formattato con il filesystem che si desidera (ext2, ext3, reiserfs...) e montato nella directory che si desidera (/home, /var ...)
>ome una normale partizione. Ricordiamo che la partizione /boot non puo' trovarsi in un gruppo di LV perche' il boot loader non e'
in grado di leggerla.
Se desideriamo che la partizione / si trovi su un volume logico dobbiamo creare una partizione /boot sepatata.
In un Volume Group possono esistere svariati Logical Volume che possono essere facilmente ridimensionati, rimossi, creati, rinominati.
Facendo un paragone con un normale hard disk e la logica con cui viene usato su un sistema Unix, i LV e' come se fossero delle partizioni
"flessibili" di un disco fisso (il VG) a "capienza variabile", in quanto composto da un numero modificabile di dischi fisici.
La mappatura fra Psysical Extent e Logical Extend, le unita' di storage minime, puo' essere impostata in due diversi modi:
--> Linear. I LE di un LV vengono mappati sequenzialmente ai PE di uno o piu' PV.
In pratica un volume logico composto da due volumi fisici, avra', ad esempio, i LE da 1 a 100 che coincidono con i PE da 1 a 100
(sempre di uguali dimensioni) sul primo volume fisico e i LE da 101 a 200 che coincidono con i PE da 1 a 100 sul secondo volume fisico.
--> Striped. Analogamente ad un Raid 1, i LE verranno mappati alternativamente su PE di diversi volumi fisici.
In questo modo le performance potrebbero migliorare (in particolare se si usano volumi fisici su bus diversi) ma una volta impostati inizialmente,
con questo metodo non e' piu' possibile aggiungere volumi fisici ad un volume logico.
Molte distribuzioni presentano LVM come un modulo del kernel: lvm-mod (Per caricarlo, nel caso non avvenga automaticamente:
modprobe lvm.mod) e provvedono all'avvio, nel caso in cui sia configurato un volume group, ad eseguire gli script di setup.
vgscan esegue uno scan di tutti i dischi in cerca di volume groups e crea i database con le impostazioni di base per tutti gli altri comandi lvm:
/etc/lvmtab e directroy /etc/lvmtab.d/
vgchange -ay Attiva i volume group conosciuti dal sistema.
Allo shutdown del sistema e' opportuno dare il comando (gia' previsto nelle distribuzioni che supportano nativamente LVM):
vgchange -an Disattiva i volume group conosciuti dal sistema.
Se non si ha a disposizione un kernel che ha gia' il driver LVM , la patch corrispondente si puo' trovare su ftp://linux.msede.com/lvm/v0.8final/
scompattiamo la patch
--> gzip -dc patch-2.3.46-LVM-0.8final.gz | ( cd /usr/src/linux; patch -p1)
--> cd /usr/src/linux e configuriamo LVM ed il supporto per i moduli si desidera caricarlo come modulo con "make config/xconfig/menuconfig"
--> Costruiamo un nuovo kernel
--> Ritorniamo nella directory dell'LVM (LVM/0.8final/), editiamo make.tmpl e cambiamo la macro TOP in modo che punti alla directory in
cui hai scompattato l'LVM.
--> "make" ed un "make install" (Saltiamo questo punto se l'LVM non e' stato configurato come modulo.)
--> Aggiungiamo "insmod lvm-mod" nel nostro script di startup o modifichiamo il "/etc/modules.conf" aggiungendo
alias block-major-58 lvm-mod
alias char-major-109 lvm-mod
--> Aggiungiamo anche "vgscan" e "vgchange -a y" ai file di startup in modo che la configurazione dell'LVM venga caricata ad ogni reboot.
--> Allo stesso modo"vgchange -a n" nello script di shutdown dopo aver smontato tutti i filesystem
Per diagnosticare cosa succede e' utile la directory /proc/lvm/ con i suoi contenuti che a loro volta forniscono dati simili a quelli
che si posson oottenere con comandi come lvdisplay, vgdisplay e pvdisplay.
Oltre alla gestione a linea di comando, esistono tool grafici come Webmin, che, fra le tante funzioni, permette di gestire volumi logici da GUI.
esempio:
dopo esserci assicurati che nel nostro kernel sia presente LVM
[root@ip0 /]# cat /proc/partitions
Visualizziamo innanzitutto quali partizioni sono presenti sui dischi collegati al sistema.
Si nota hda variamente partizionato e hdc e hdd senza partizioni
[root@ip0 /]# mount
/dev/hda2 on / type ext3 (rw,errors=remount-ro)
proc on /proc type proc (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
/dev/hda5 on /home type ext3 (rw)
/dev/hda6 on /public type ext3 (rw)
/dev/hda7 on /boot type ext3 (rw)
Tutto il sistema risiede infatti in hda, possiamo creare dei fisical device usando hdc e hdd
[root@ip0 /]# pvcreate /dev/hdc
pvcreate -- physical volume "/dev/hdc" successfully created
[root@ip0 /]# pvcreate /dev/hdd
pvcreate -- physical volume "/dev/hdd" successfully created
[root@ip0 /]# pvscan
Il comando pvscan e' utile per visualizzare lo stato dei PV
pvscan -- reading all physical volumes (this may take a while...)
pvscan -- inactive PV "/dev/hdc" is in no VG [3.36 GB]
pvscan -- inactive PV "/dev/hdd" is in no VG [2.37 GB]
pvscan -- total: 2 [5.73 GB] / in use: 0 [0] / in no VG: 2 [5.73 GB]
Possiamo creare un Volume Group, utilizzando i PV appena creati.
Notare che avremmo potuto usare un unico comando (vgcreate /dev/hdc /dev/hdd) ma abbiamo preferito provare ad estendere il gruppo
(chiamato "pluto") appena creato con il comando vgextend
[root@ip0 /]# vgcreate pluto /dev/hdc
vgcreate -- INFO: using default physical extent size 4 MB
vgcreate -- INFO: maximum logical volume size is 255.99 Gigabyte
vgcreate -- doing automatic backup of volume group "nome"
vgcreate -- volume group "pluto" successfully created and activated
[root@ip0 /]# vgdisplay
Comando utile per visualizzare lo stato di un Volume Group, notare come cambia l'output dopo aver aggiunto il PD hdd
--- Volume group ---
VG Name pluto
VG Access read/write
VG Status available/resizable
VG # 0
MAX LV 256
Cur LV 0
Open LV 0
MAX LV Size 255.99 GB
Max PV 256
Cur PV 1
Act PV 1
VG Size 3.36 GB
PE Size 4 MB
Total PE 860
Alloc PE / Size 0 / 0
Free PE / Size 860 / 3.36 GB
VG UUID 49Urj3-lrwC-3S3k-pF7p-NZ71-1bGg-44QOeF
[root@ip0 /]# vgextend pluto /dev/hdd
vgextend -- INFO: maximum logical volume size is 255.99 Gigabyte
vgextend -- doing automatic backup of volume group "pluto"
vgextend -- volume group "pluto" successfully extended
[root@ip0 /]# vgdisplay
--- Volume group ---
VG Name nome
VG Access read/write
VG Status available/resizable
VG # 0
MAX LV 256
Cur LV 0
Open LV 0
MAX LV Size 255.99 GB
Max PV 256
Cur PV 2
Act PV 2
VG Size 5.72 GB
PE Size 4 MB
Total PE 1464
Alloc PE / Size 0 / 0
Free PE / Size 1464 / 5.72 GB
VG UUID 49Urj3-lrwC-3S3k-pF7p-NZ71-1bGg-44QOeF
A questo punto possiamo creare un Logical Volume. Decidiamo di farlo grande 1 Gigabyte (-L 1G) e di chiamarlo "pippo".
Con il comando lvdisplay se ne visualizzano le informazioni di base.
Notare che con il comando lvcreate e' obbligatorio speficicare il Volume Group in cui crearlo e la dimensione del Logical Volume
(tramite i flag -l o -L).
[root@ip0 /]# lvcreate -L 1G -n pippo pluto
[root@ip0 /]# lvdisplay /dev/pluto/pippo
--- Logical volume ---
LV Name /dev/pluto/pippo
VG Name pluto
LV Write Access read/write
LV Status available
LV # 1
# open 0
LV Size 1 GB
Current LE 256
Allocated LE 256
Allocation next free
Read ahead sectors 1024
Block device 58:0
lvdisplay ha a disposizione l'opzione che restituisce una descrizione piu' completa e dettagliata.
Adesso il nostro Logical Volume /dev/pluto/pippo e' a tutti gli effetti un device a blocchi che possiamo formattare e montare su
una directory del nostro filesystem
[root@ip0 /]# mkfs.ext3 /dev/pluto/pippo
Se abbiamo l'esigenza di estendere o ridurre il nostro LV usiamo i comandi lvextend ed lvreduce
Se vogliamo eliminare un LV dobbiamo utilizzare il comando lvremove, ricordandoci di smontare prima l'LV, quindi
umount /dev/pluto/pippo
lvdisplay /dev/pluto/pippo
Se invece volessimo eliminare un VG dovremmo prima disattivarlo con
vgchange /dev/pluto
e poi rimuoverlo con
vgremove /dev/pluto
Per vedere come appare il modulo LVM
[root@ip0 /]# lsmod |grep lvm
lvm-mod 61792 3
E' consigliabile eseguire il reboot del sistema prima di utilizzare il Logical Volume,
in modo da essere sicuri che tutto si ripristini senza problemi