|
Contact me sending an e-mail (antispam defense activated) |
Title: Introduzione a LVM
Author: Sandro Tosi
Last modified: 2007-09-02
Cos'e` e vantaggi di LVM
~~~~~~~~~~~~~~~~~~~~~~~~
Su un pc e` necessario partizionare i propri dischi, per creare zone
di storage per i filesystem. Questa operazione e` molto critica, in
quanto richiede una stima precisa dello spazio necessario ad ogni
partizione.
La situazione di mancanza di spazio su filesystem e` comunemente nota,
e le classiche soluzioni richiedono ripartizionamenti, copia di dati
etc, rimandando soltanto in la` nel tempo il riverificarsi della
medesima situazione.
LVM viene in contro a queste problematiche, consentendo di gestire lo
spazio su dischi in modo dinamico e flessibile, riducendo/ingrandendo
le partizioni quando la situazione lo richiede.
I principali vantaggi sono:
o ingrandimento/riduzione della dimensione di un filesystem
l'astrazione dal disco "fisico" ha il vantaggio di non doversi piu`
preoccupare della geometria delle partizioni o di avere spazio
contiguo per aumentare un filesystem.
o aggiungere piu` storage fisico
se e` necessario, si possono aggiungere piu` drive ad LVM, il che
consente di avere piu` spazio a disposizione per ingrandire i
filesystem
o snapshot
e` possibile effettuare una "fotografia" ad un filesystem, in modo
che si possa utilizzare come "copia di backup". Il bello e` che non
e` necessario allocare l'intero spazio de filesystem per questo
o spostare LVM su un nuovo storage fisico
facilita di gestione delle risorse disco e rende gli aggiornamenti
molto piu` semplici.
o striping
memorizzare su differenti device, senza che sia necessario usare un
layer RAID.
Terminologia
~~~~~~~~~~~~
Physical Volume (pv)
e` un disco fisso o una sua partizione (anche volumi RAID); sono le
risorse fisiche di storage su cui verra` costruito LVM;
Volume Group (vg)
inizializza uno o piu` pv come un unico "disco virtuale", e che
possiamo considerare come una riserva di storage a cui possiamo
attingere.
Logical Volume (lv)
sono le aree finali che conterranno i nostri dati, e vengono creati
"ritagliando" spazio da un vg; qui dentro verranno creati
effettivamente i filesystem
E` un cerchio che si chiude: da partizioni distinte (pv) le abbiamo
unite in una singola area di storage (vg) da cui creiamo partizioni
logiche (lv) su cui utilizzare i filesystem.
Extents
sono le unita` minima di allocazione in un lv: ogni lv conterra` un
numero intero di extent. Possiamo considerarli come i blocchi dei
dischi fissi, ma di dimensioni piu` grandi (di default 4MB). La
dimensione e` la stessa per ogni vg, e questo rende piu` facile la
manutenzione (spostamenti, ridimensionamento, etc).
Utilizzare LVM
~~~~~~~~~~~~~~
Per creare un set LVM, prima di tutto e` necessario creare la
partizione sul disco fisico:
# cfdisk <device>
che dovra` essere di tipo "8E" ("Linux LVM"); diciamo, a questo punto,
che e` stata creata la partizione <partition>.
Ora si deve creare il pv sopra questa partizione:
# pvcreate <partition>
questo comando rendera` la partizione utilizzabile da LVM.
Ora si possono creare i vg:
# vgcreate <vg_name> <partition>
Adesso che disponiamo del vg, possiamo creare i lv, con il comando:
# lvcreate --space <space> -n <lv_name> <vg_name>
a questo punto, il volume e` disponibile come ogni altro device sotto
/dev/<vg_name>/<lv_name> o /dev/mapper/<vg_name>-<lv_name> (deve
essere presente il modulo del kernel "device mapper", dm_mod) e quindi
si puo` formattare e montare come fosse un disco "fisico":
# mkfs.<type> /dev/<vg_name>/<lv_name>
# mount /dev/<vg_name>/<lv_name> /<mount>/<point>
Per ottenere informazioni sui volumi LVM, ci sono alcuni comandi:
o pvdisplay
per ottenere informazioni sui pv presenti nel sistema
o vgdisplay
per ottenere informazioni sui vg presenti nel sistema
o lvdisplay
per ottenere informazioni sui lv presenti nel sistema
Resize con LVM
~~~~~~~~~~~~~~
Questa e` una delle principali caratteristiche di LVM, quindi
guardiamola in dettaglio.
Aggiungere spazio ad un vg e` molto semplice:
# vgextend <vg> <new_pv>
dove <new_pv> e` il pv (verosimilmente creato da poco) che vogliamo
rendere disponibile al vg in questione.
Ora che abbiamo a disposizione piu` spazio sul vg, possiamo espandere
anche un lv (o piu`):
# lvextend -L+<size> /path/to/lv
Se si volesse ridurre il lv, al posto del "+" si deve usare "-"
Una volta ridimensionato il lv, e` ancora necessario ridimensionare il
filesystem ivi contenuto, e questo deve essere fatto con l'utility
opportuna del proprio filesystem. Sebbene sia possibile ridimensionare
la partizione quando essa e` online, e` caldamente consigliato
ridimensionare il filesystem dopo averlo smontato. In piu`, quando si
deve restringere il filesystem, smontarlo prima e` d'obbligo, e le
operazioni da svolgere sono in ordine inverso: prima si ridimensiona
il filesystem, poi il lv (con lvreduce).
Quindi in caso di EXT2, faremo:
# umount /path/to/lv
# resize2fs /path/to/lv
# mount <fs>
Alcuni filesystem, pero`, consentono il resize a caldo (per esempio
XFS e ReiserFS): controllate bene prima la documentazione opportuna in
quanto si corre il rischio di perdere l'intero contenuto del
filesystem.
Una comoda utility, da utilizzare al posto di lvextend + fs_resize, e`
e2fsadm che fa tutto questo per conto nostro:
# e2fsadm -L+2G /lv/device
che esegue:
- fsck del filesystem
- lvextend
- resize del filesystem
RAID con LVM
~~~~~~~~~~~~
LVM consente di creare un semplice RAID0: mentre si crea un vg, con
vgcreate, se si specificano piu` partizioni (eventualmente su dischi
diversi) allora si va a creare un'area di storage che si espande su
piu` dischi, proprio come il RAID0:
# vgcreate <name> <partition1> <partition2> ...
Ovviamente, ci sono gli stessi pericoli di un RAID0: la perdita di una
partizione, comporta la perdita dell'intero vg.
Quello che spesso avviene, invece, e` la creazione di un set LVM sopra
ad un array RAID, in modo da ottenere la ridondanza garantita dal RAID
in unione alla flessibilita` fornita da LVM.
Creare snapshot con LVM
~~~~~~~~~~~~~~~~~~~~~~~
Prendiamo una situazione reale: effettuare il backup. Mentre il backup
gira, non e` possibile accedere ai file, in quanto altrimenti la copia
potrebbe non essere consistente; certo, fermare le attivita` (anche
per molto tempo, a seconda della dimensione dei dati) puo` non essere
accettabile, per esempio per il backup di un database ERP.
LVM fornisce una funzionalita` che puo` tornare molto utile in questa
situazione: lo snapshot. Essa consente di creare una copia di un lv in
un determinato momento, e potervi accedere anche in caso di modifica
dei dati di origine. Una nota importante: non stiamo clonando un lv, e
quindi non occuperemo l'intero spazio del lv di origine; ma vediamo
come funziona:
# lvcreate --size <size> --snapshot -n <my_snap> /path/to/lv
# mount <my_snap> /<mnt>
Se si utilizza "df" verra` mostrato come /<mnt> utilizzi lo stesso
spazio di /path/to/lv, ma in realta` al nostro vg richiede soltanto
una dimensione pari a <size>.
Lo snapshot fa si` che, accedendo ai dati in esso contenuti, se non
sono cambiati, in realta` accediamo ai dati del lv di origine.
Se invece i dati vengono cambiati ecco cosa avviene: LVM in automatico
scrive i blocchi "originali" nell'area di snapshot, mentre aggiorna
realmente i blocchi su lv (la tecnica e` nota come copy-on-write,
COW).
In questo modo, accedendo ai dati tramite lo snapshot, parte dei
blocchi (quelli non modificati) sono acceduti sul lv, mentre parte dei
blocchi (quelli modificati all'origine) vengono letti dall'area di
snapshot.
Dal momento che soltanto i blocchi modificati sono memorizzati nello
snapshot, appare chiaro come mai non viene utilizzato lo stesso spazio
del lv d'origine.
A questo punto, il backup puo` essere preso senza problemi dallo
snapshot, mentre le applicazioni (o gli utenti) possono continuare a
lavorare sul lv d'origine.
Una volta terminato l'utilizzo dello snapshot, puo` essere cancellato
(e ricreato quando diventera` necessario).
Rimuovere un PV
~~~~~~~~~~~~~~~
Cerchiamo di descrivere i task da fare per rimuovere un pv.
Prima di tutto si verifica se ci sono physical extent ("Allocated PE")
allocati con:
# pvdisplay /dev/PV
Se ci sono PE allocati in qualche vg, allora e` necessario riallocarli
in altri pv, con il comando
# pvmove /dev/PV /dev/PV_dst1 /dev/PV_dst2 ...
se non si specificano i pc destinazione, LVM dovrebbe riallocare i PE
dove possibile. L'unica limitazione di pvmove e` la richiesta di un
numero contiguo di PE liberi nei PV di destinazione equivalente a
quello dei PE da spostare.
Se non c'erano PE allocati (quindi nessun vg sta usando PE di questo
pv) o se abbiamo effettuato il passo precedente, possiamo rimuovere il
pv dai vg che lo contengono con
# vgreduce <vg_name> /dev/PV
ed infine possiamo eliminare il pv con
# pvremove /dev/PV
Si noti inoltre che il comando pvmove consente di riallocare tutti i
PE di un certo lv su un altro pv.
Un messaggio di errore "tipico"
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In caso di / su LVM, durante lo shutdown della macchina si possono
notare messaggi di errore simili a:
Shutting down LVM Volume Groups...
Can't deactivate volume group "<vgname>" with 1 open logical volume(s)
...
<device> still in use
ma non c'e` da preoccuparsi. Durante lo spegnimento, LVM viene
disattivato, ma dal momento che / e` su LVM, andrebbe prima smontata,
ma questo e` impossibile, in quanto altrimenti la procedura di
shutdown non potrebbe proseguire.
Leggere l'HOWTO
~~~~~~~~~~~~~~~
Mai come in questo caso e` opportuna la lettura dell'LVM HOWTO, in
quanto quando si lavora con i propri dati, e` sempre bene essere
preparati piuttosto che perderli! |