LVM2

partizionamento dinamico con dischi logici in Linux

La mission

Durante l'installazione di Linux ci si ritrova a dover fare delle scelte importanti: come dividere lo spazio tra le varie partizioni, quanto spazio lasciare alla home, quanto a /usr ... io solitamente metto tutto nella stessa partizione, in modo da poterla sfruttare al meglio, ma se si riempie come aggiungervi spazio?
Due strade ci si propongono: la prima, un po' rischiosa, è quella di ridimensionare le partizioni con tool come parted (o il commerciale, ma ottimo, Partition Magic), l'altra è utilizzare un sistema di partizioni logiche che astragga l'hardware dei dischi fissi in qualche contenitore che, appunto in modo dinamico, possa essere dimensionato a piacere.
Dicevo rischioso, il primo metodo in quanto è fortemente consigliato un backup, e che puo' portare (seppur collaudato) al danneggiamento dei dati o delle partizioni (purtroppo è successo anche a me).
Del secondo ci occuperemo in questa guida.

Terminologia di LVM2

LVM è un sistema per astrarre i device fisici (l'hardware, i dischi fissi) che solitamente uno vede come /dev/hda, /dev/hdb... in dischi virtuali. Un disco virtuale puo' essere costituito da una sola partizione logica, o da N partizioni (anche su dischi diversi). Il tutto è gestito in modo dinamico: se c'è sufficente spazio vuoto nel set di dischi un disco fisico puo' essere tolto dal volume logico o aggiunto.

LVM crea dei "Volume Group" (VG) che è il piu' alto livello di astrazione, esso conterrà volumi fisici e logici.
I Phisical Volume (PV) che sono proprio i nostri hard disk (o qualcosa che ci assomiglia).
I Logical Volume (LV) sono l'equivalente delle partizioni: un disco fisico è composto da diverse partizioni, ovvero: il phisical volume puo' essere composto da diverse LV.
Inoltre (per la cronaca) all'interno dei volumi logici o fisici si effettua una ulteriore suddivisione in phisical o logical extents.

Vantaggi

Dinamicità

Il bello della gestione dinamica delle partizione sta nella comodità di aggiungere disci fisici ai volume group senza dover preoccuparci di backup o di spostare i dati.
Abbiamo un volume group che si sta riempiendo? E' sufficiente comprare un nuovo disco fisso (un Phisical Volume) e aggiungerlo al Volume Group: il volume group diventerà piu' grande in maniera del tutto trasparente.

Velocità

In piu', se si usano diversi dischi per lo stesso VG, è possibile ottenere un aumento (seppur piuttosto leggero) delle prestazioni in quanto i byte consecutivi del VG saranno suddivisi in diversi dischi fisici (striping) in questo modo (con 2 dischi):
VG1, byte 1 = byte1 del PV1
VG1, byte 2 = byte1 del PV2
VG1, byte 3 = byte2 del PV1
VG1, byte 4 = byte2 del PV2 , eccetera.
quindi scrivendo 200byte, il lavoro verrà diviso equamente tra i due dischi.

Snapshot per backup

Questa funzione è molto comoda per fare dei backup: supponiamo di star usando un disco (magari in un fileserver) e di volerne fare un backup, normalmente, se non blocchiamo l'accesso al disco, rischiamo che i dati nel backup (che potrebbe durare minuti o ore) cambino durante la scrittura rendendo il backup inconsistente. Lo snapshot serve proprio per questo: mentre il backup del VG "datiimportanti" viene effettuato si crea uno snapshot sul VG "snap" (di grandezza arbitraria, vedi dopo). Se avvengono modifiche a "datiimportanti" queste vengono messe in "snap" (così "datiimportanti" è consistente durante il backup), una volta terminato il backup lo snapshot viene eliminato e le modifiche riportate in "datiimportanti".
Lo snapshot puo' essere anche molto piu' piccolo della partizione "datiimportanti", ma DEVE essere SUFFICIENTEMENTE GRANDE da contenere tutte le modifiche che vengono effettuate durante il backup. Lo snapshot conterrà solo le modifiche effettuate mentre la partizione sarà bloccata.

Cominciamo...

Assicuriamoci di avere installato il pacchetto lvm2 (in Debian) e di avere attivato nel kernel il supporto per LVM2 (Devices - MultiDevice support (RAID and LVM) - Device mapper support, e le opzioni Crypt, Snapshot e Mirror).
Vi consiglio di usare un filesystem flessibile per i vostri volumi logici: ReiserFS in questo caso vince la battaglia contro ext3 e xfs in termini di funzionalità. Assicuratevi quindi di avere anche il supporto per ReiserFS compilato nel kernel (e il pacchetto reiserfsprogs).
Non usate LVM anche per /boot a meno di non crearvi un immagine per l'avvio con initrd, tenete invece /boot come una piccola partizione classica e tutto il resto in LVM.

I passaggi da seguire sono questi:

Inizializzate il phisical volume:

Dato un disco fisico (/dev/hde) o una partizione (/dev/hde1) inizializzate il pv con
# pvcreate /dev/hde
Physical volume "/dev/hde" successfully created

Create un volume group che contenga il pv:

Questo sarà l'equivalente a un disco virtuale, che andrà poi "partizionato" (con i logical volumes).
vgcreate nomegruppo phisicalvolume
per esempio:
vgcreate dati /dev/hde

Create il logical volume

Questo è l'equivalente della partizione vera e propria che andrà formattato con il filesystem che preferite, il device sarà raggiungibile con /dev/nomegruppo/nomevolume. Dovete scegliere una grandezza per il device (con vgdisplay potete vedere i dettagli del vg nel quale creerete il lv).
Volendo potete usare l'opzione -n nomevolume per specificare un nome al lv.
Per specificare la dimensione in Kb, Mb, Gb digitate
lvcreate -Lsize{m,k,g} nomegruppo
(scegliete il suffisso appropriato).
Per esempio per creare un disco di 20Gb nel vg dati e dargli nome main:
lvcreate -L20g -n main dati
Se volete specificare la dimensione in logical extens dovete invece usare l'opzione -l.

... e finiamo

Formattare e usare il logical volume

Ora potete formattare il device /dev/nomegruppo/nomevolume, per esempio (con ReiserFS):
mkfs.reiserfs /dev/dati/main
quindi (una volta creato il mountpoint) mount -t reiserfs /dev/dati/main mountpoint e inserite in /etc/fstab la riga
/dev/dati/main /mnt/dati reiserfs ro,users,auto,umask=0 0 0

Ridimensionare un logical volume esistente

Per ridimensionare un LV esistente dovete tener conto che ci sono due entità in gioco: Il logical volume (che come abbiamo più volte ripetuto ha la funzionalità equivalente di una partizione) e la partizione vera e propria (ReiserFS per esempio) che è contentuta nel LV. Per rimpicciolire il LV dobbiamo quindi rimpicciolire la partizione usando i tool del filesystem da noi addottato (non tutti i filesystem consentono un ridimensionamento online, a volte dovremo smontare la partizione), e quindi rimpicciolire anche il LV.
Un metodo è questo, vediamo come togliere 1Gb alla partizione /home del device (LV) /dev/dati/home:
umount /home
resize_reiserfs -s -1Gb /dev/dati/home
lvreduce -L -1G dati/home
resize_reiserfs /dev/dati/home
Abbiamo prima smontato la partizione home, per poterla ridimensionare. Poi con "resize_reiserfs" abbiamo rimpicciolito la partizione (di 1Gb in meno), poi con lvreduce abbiamo rimpicciolito anche il LV che la conteneva. Infine chiamando "resize_reiserfs" senza parametri facciamo in modo che la partizione prenda tutto lo spazio del LV (non dovrebbe essere necessario, ma essendo un comando comodo molte altre volte... eccolo!)

Altre operazioni comuni

Per aggiungere ad un volume group esistente:
vgextend nomegrouppo phisicalvolume
Per rimuovere un VG:
vgremove nomegruppo
Per rimuovere un PV bisogna prima assicurarsi che non sia in uso da da qualche LV (e usare in quel caso pvmove): per vedere le informazioni sul PV:
pvdisplay device
e usare vgreduce nomegruppo phisicalvolume per togliere il volume dal gruppo.

Questi sono alcuni dei comandi utili, tutti cominciano con {vg, pv, lv} seguito dall'azione, possa l'autocompletamento illuminare la vostra via.

Reference

LVM HOWTO
HOWTO Install Gentoo on an LVM2 root partition
Erik Postma's Web page
Ultima modifica: 21/03/10 15:09
dariosky's home