In questo post voglio discutere dell’utilizzo di LVM per la gestione del proprio filesystem su sistema operativo Linux.
LVM, acronimo di Logical Volume Manager, è un sistema di virtualizzazione per gestire a piacimento il proprio filesystem. In particolare consente di utilizzare più dispositivi differenti (interi dischi o partizioni) come mattoni per costruire un unico dispositivo virtuale che ha come dimensione la somma dei singoli dispositivi utilizzati.
In tal modo è possibile gestire questo spazio che si viene a creare in maniera molto più flessibile di quella che si ha con i normali schemi di partizionamento.
L’uso di questo meccanismo ci tira fuori in maniera semplice ed elegante da situazioni spiacevoli che si vengono a creare quando su un server (ma forse ancor di più su una macchina desktop) si è a corto di spazio su una delle partizioni a disposizione.
In assenza di LVM in tali situazioni ci si trova, nel caso più semplice, a sostituire un disco con uno più grande ed a clonarne il contenuto del primo. Quando questa possibilità viene a mancare, ci si trova a dover riorganizzare in maniera drastica i propri files, perché magari si ha una partizione con decine di gigabytes liberi ed un’altra con solo pochi MB a disposizione.
Se invece ci si è affidati ad LVM allora in pochi minuti si risolve il tutto con un paio di comandi da terminale.
Come funziona LVM?
Come detto in precedenza LVM è un sistema che consente di utilizzare i propri device come mattoni per la costruzione di un unico device più grande che possiamo gestire a piacimento.
Per la scrittura di questo post quasi tutti gli spunti sono stati presi da questo completissimo howto (in lingua inglese) che esplora tutte le potenzialità di LVM e descrive in dettaglio tutti i comandi a disposizione.
Quando si parla di LVM si ha a che fare con tre termini:
- Physical Volumes
- Volume Groups
- Logical Volumes
I physical volumes (PV) sono i volumi fisici, come detto in precedenza si tratta tipicamente di dischi e partizioni. I PV devono essere inizializzati (ovvero formattati) per essere utilizzati da LVM. Una volta inizializzati tramite ad esempio fdisk sono divisi in blocchi (di default di 4MB) chiamati physical extents (PE). Uno o più PV vanno a costituire quello che è chiamato volume group (VG), un gruppo di volumi non è altro che un “contenitore” dal quale prelevare spazio per creare un logical volume (LV). Un logical volume è quello che poi andremo ad usare per creare le partizioni visibili al sistema da formattare con il filesystem che si preferisce (ext3, reiserfs, xfs, etc.).
Questa figura presa dall’HowTo citato in precedenza chiarisce bene il meccanismo

Funzionamento di LVM
LVM in azione
Vediamo cosa è necessario fare per mettere il tutto in pratica. Per utilizzare LVM non occorrono particolari moduli di kernel, l’unico requisito è che il kernel in uso supporti il device mapper, ma qualsiasi kernel recente dovrebbe farlo. Di seguito occorre avere installato i comandi per la gestione di LVM, per ottenerli su debian è sufficiente installare il pacchetto lvm2 con
# aptitude install lvm2
Il pacchetto lvm2 consiglia di installare anche il pacchetto dmsetup, che contiene dei tool per interagire con il device mapper, di solito è utile seguire i recomends di aptitude, per cui conviene installare anche questo pacchetto (se eseguite aptitude in modalita ncurses il pacchetto verrà installato automaticamente).
A questo punto non resta che inizializzare le partizioni per essere utilizzate con lvm, per far ciò si userà fdisk. Nel seguente esempio ho inizializzato un disco appena montato sulla macchina, visibile come sdb, per l’utilizzo con lvm.
# fdisk /dev/sdb The number of cylinders for this disk is set to 4427. There is nothing wrong with that, but this is larger than 1024, and could in certain setups cause problems with: 1) software that runs at boot time (e.g., old versions of LILO) 2) booting and partitioning software from other OSs (e.g., DOS FDISK, OS/2 FDISK) Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 1 First cylinder (1-4427, default 1): Using default value 1 Last cylinder or +size or +sizeM or +sizeK (1-4427, default 4427): Using default value 4427 Command (m for help): t Selected partition 1 Hex code (type L to list codes): 8e Changed system type of partition 1 to 8e (Linux LVM) Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. Syncing disks.
I comandi dati ad fdisk (in modalità interattiva) sono stati i seguenti: n per creare una nuova partizione, p per dirgli di creare una partizione primaria, ho accettato i valori di default quando mi chiedeva il primo e l’ultimo cilindro in modo da fargli utilizzare tutto lo spazio a disposizione, t per scegliere il tipo di partizione, 8e come tipo di partizione (corrispondente ad lvm) ed infine w per fargli scrivere la tabella delle partiizoni.
Il risultato dopo questo comando è il seguente
# fdisk -l Disk /dev/sdb: 36.4 GB, 36420075008 bytes 255 heads, 63 sectors/track, 4427 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Disk identifier: 0x00094580 Device Boot Start End Blocks Id System /dev/sdb1 1 4427 35559846 8e Linux LVM
A questo punto il processo di partizionamento va ripetuto per tutti i dischi che si vogliono usare per andare a creare il volume group. Nell’esempio andrò a creare un VG costituito dal solo sdb, in quanto sarà sempre possibile aggiungere in seguito PV ad un VG già esistente per incrementarne le dimensioni. In ogni caso, una volta create le partizioni per ospitare LVM è necessario creare al loro interno i physical volumes. I PV si manipolano con i comandi che iniziano con le lettere pv. Per la creazione di un PV è sufficiente utilizzare il comando pvcreate in questo modo
# pvcreate /dev/sdb1 Physical volume "/dev/sdb1" successfully created # pvdisplay "/dev/sdb1" is a new physical volume of "33.91 GB" --- NEW Physical volume --- PV Name /dev/sdb1 VG Name PV Size 33.91 GB Allocatable NO PE Size (KByte) 0 Total PE 0 Free PE 0 Allocated PE 0 PV UUID gWsaa0-1VEp-LMfN-GrVc-Y1wg-dkzF-Bny3Ga
Come si vede dall’output il volume è stato creato correttamente, è possibile analizzare i PV presenti sulla macchina con il comando pvdisplay, mentre con il comando pvscan viene mostrato un output più conciso relativo ai volumi trovati. Inoltre è possibile manipolare i PV con i seguenti comandi dal chiaro utilizzo pvremove per cancellare un PV, pvmove per spostare extents da un PV ad un altro, pvchange per cambiarne gli attributi. Il loro utilizzo è ben documentato nelle pagina di manuale.
Una volta creato uno o più PV è il momento di creare un volume group, per manipolare i volumi ci sono i comandi analoghi a quelli per i PV solo che questa volta cominciano con vg. Per creare un volume group è sufficiente usare il comando vgcreate passandogli come argomenti i nomi dei PV da utilizzare, come in questo esempio:
# vgcreate mailboxes /dev/sdb1 Volume group "mailboxes" successfully created # vgdisplay --- Volume group --- VG Name mailboxes System ID Format lvm2 Metadata Areas 1 Metadata Sequence No 1 VG Access read/write VG Status resizable MAX LV 0 Cur LV 0 Open LV 0 Max PV 0 Cur PV 1 Act PV 1 VG Size 33.91 GB PE Size 4.00 MB Total PE 8681 Alloc PE / Size 0 / 0 Free PE / Size 8681 / 33.91 GB VG UUID S009sc-04hf-Nwr1-fCPB-GkWS-OhP4-2D4Xsy # vgrename mailboxes mailboxes-vg Volume group "mailboxes" successfully renamed to "mailboxes-vg"
In questo caso ho prima creato il VG mailboxes utilizzando sdb1, e successivamente l’ho rinominato in mailboxes-vg con il comando vgcreate. Una volta creati uno o più volume groups si può passare a creare i logical volumes veri e propri, con la famiglia di comandi lv*. Ad esempio per creare un unico LV nel VG appena creato basta eseguire
# lvcreate --name mailboxes -l 100%VG mailboxes-vg Logical volume "mailboxes" created # lvscan ACTIVE '/dev/mailboxes-vg/mailboxes' [33.91 GB] inherit
In questo caso ho assegnato tutto lo spazio a disposizione nel VG con il flag -L 100%VG al volume mailboxes, in alternativa avrei potuto specificarne le dimensioni in GB sempre usando il flag -L. Una cosa molto importante è il nome che andremo ad assegnare al logical volume, in quanto questo nome, assieme al nome del VG, ci servirà per l’utilizzo con gli strumenti per la creazione di filesystem e per l’utilizzo con il comando mount (e con il file /etc/fstab). Infatti il path nel sistema del volume appena creato segue lo schema /dev/<nome-vg>/<nome-lm>. Andiamo a creare un filesystem di tipo ext3 nel volume appena creato con il comando mkfs.ext3
# ll /dev/mailboxes-vg/mailboxes lrwxrwxrwx 1 root root 35 2009-10-29 20:29 /dev/mailboxes-vg/mailboxes -> /dev/mapper/mailboxes--vg-mailboxes # mkfs.ext3 /dev/mailboxes-vg/mailboxes mke2fs 1.41.3 (12-Oct-2008) Filesystem label= OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) 2223872 inodes, 8889344 blocks 444467 blocks (5.00%) reserved for the super user First data block=0 Maximum filesystem blocks=0 272 block groups 32768 blocks per group, 32768 fragments per group 8176 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 4096000, 7962624 Writing inode tables: done Creating journal (32768 blocks): done Writing superblocks and filesystem accounting information: done This filesystem will be automatically checked every 32 mounts or 180 days, whichever comes first. Use tune2fs -c or -i to override.
Come dicevo prima è sufficiente usare la combinazione VG-LV per referenziare il volume appena creato. A questo punto abbiamo un filesystem pronto per essere utilizzato in maniera del tutto trasparente come se fosse una normale partizione, per cui andiamo a montarla sul sistema
# mkdir vmailtmp
# mount /dev/mailboxes-vg/mailboxes vmailtmp/
# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 259M 111M 134M 46% /
tmpfs 1014M 0 1014M 0% /lib/init/rw
udev 10M 688K 9.4M 7% /dev
tmpfs 1014M 0 1014M 0% /dev/shm
/dev/sda9 13G 12G 973M 93% /home
/dev/sda8 373M 11M 343M 4% /tmp
/dev/sda5 4.6G 816M 3.6G 19% /usr
/dev/sda6 13G 8.4G 3.9G 69% /var
/dev/mapper/mailboxes--vg-mailboxes
34G 177M 32G 1% /root/vmailtmp
Come si vede l’operazione è del tutto trasparente e si può usare il nuovo filesystem come un normale filesystem, con il grande vantaggio che se si necessita di altro spazio si può aggiungerne alla partizione senza dover fare nessun intervento di spostamento di files o clonazione di hard disk o altri artifici del genere.
A breve la seconda parte dell’articolo con gli esempi di utilizzo per il resize al volo delle partizioni.




















http://www.codewithstyle.eu is very informative. The article is very professionally written. I enjoy reading http://www.codewithstyle.eu every day.