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! |