Questo articolo fa seguito alla prima parte pubblicata in precedenza
Vediamo il grande vantaggio di LVM con un caso pratico di utilizzo. Il problema è quello di cui si è parlato nell’introduzione della prima parte, ovvero una partizione a corto di spazio. Nella macchina di esempio si ha un’installazione standard di Debian su una macchina con un unico disco da 500Gb partizionato in questo modo:
# fdisk -l Disk /dev/sda: 500.1 GB, 500107862016 bytes 255 heads, 63 sectors/track, 60801 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Disk identifier: 0x00062b0c Device Boot Start End Blocks Id System /dev/sda1 * 1 31 248976 83 Linux /dev/sda2 32 60801 488135025 5 Extended /dev/sda5 32 60801 488134993+ 8e Linux LVM
Questo schema di partizioni è necessario in quanto il kernel Linux non può fare boot da un volume LVM per cui si è creata una partizione di boot in sda1 da 250Mb circa montata su /boot e tutto il resto dello spazio si è dedicato ad una partizione per LVM. Nella macchina è presente un unico VG che viene suddiviso tra tutte le partizioni di sistema, utilizzando però solamente lo spazio necessario e lasciando una buona percentuale dello spazio sul VG libera per poterla assegnare in futuro dove fa più comodo. La configurazione del volume group è la seguente
# vgdisplay --- Volume group --- VG Name host.example.com System ID Format lvm2 Metadata Areas 1 Metadata Sequence No 12 VG Access read/write VG Status resizable MAX LV 0 Cur LV 6 Open LV 6 Max PV 0 Cur PV 1 Act PV 1 VG Size 465.52 GB PE Size 4.00 MB Total PE 119173 Alloc PE / Size 44509 / 173.86 GB Free PE / Size 74664 / 291.66 GB VG UUID 02JBN6-1zmU-wLS9-OwWu-GgaI-hQBE-NsPInM
Una parentesi sui nomi da assegnare ai volume groups, in generale è buona norma come nome di volume un identificativo univoco, come ad esempio il nome dns della macchina su cui è montato. Questa pratica può tornare utile nel caso un volume group venga trasferito da una macchina ad un’altra, infatti in caso di due VG distinti con lo stesso nome su un unico sistema possono portare a problemi.
Chiusa la parentesi vediamo come è stato assegnato lo spazio disponibile nel VG per le varie partizioni di sistema
# lvdisplay
--- Logical volume ---
LV Name /dev/host.example.com/root
VG Name host.example.com
LV UUID JPb2OM-9DFV-TRjF-0zVH-Bb0l-op0A-0GW6Vu
LV Write Access read/write
LV Status available
# open 1
LV Size 1.27 GB
Current LE 325
Segments 2
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 254:0
--- Logical volume ---
LV Name /dev/host.example.com/usr
VG Name host.example.com
LV UUID s5CnI7-daQD-MWCz-1T0a-KUnG-EHAC-xttn3i
LV Write Access read/write
LV Status available
# open 1
LV Size 15.00 GB
Current LE 3840
Segments 2
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 254:1
--- Logical volume ---
LV Name /dev/host.example.com/var
VG Name host.example.com
LV UUID ml8Zr0-CmRO-HQCs-ZyyO-0iZ4-5jMh-00UrVV
LV Write Access read/write
LV Status available
# open 1
LV Size 100.00 GB
Current LE 25600
Segments 2
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 254:2
--- Logical volume ---
LV Name /dev/host.example.com/swap_1
VG Name host.example.com
LV UUID LGZdu4-V8lT-K9om-dPot-ppeE-PUBp-w2IyDK
LV Write Access read/write
LV Status available
# open 2
LV Size 2.59 GB
Current LE 664
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 254:3
--- Logical volume ---
LV Name /dev/host.example.com/tmp
VG Name host.example.com
LV UUID GhDlT3-jwj1-2dOr-i4ly-XY8D-XTdB-01b5Jm
LV Write Access read/write
LV Status available
# open 1
LV Size 5.00 GB
Current LE 1280
Segments 2
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 254:4
--- Logical volume ---
LV Name /dev/host.example.com/home
VG Name host.example.com
LV UUID 222F4B-NQPL-TUDz-wOSs-D4h4-XfmH-4LLuWM
LV Write Access read/write
LV Status available
# open 1
LV Size 50.00 GB
Current LE 12800
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 254:5
# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/host.example.com-root
1.3G 108M 1.1G 9% /
tmpfs 2.0G 0 2.0G 0% /lib/init/rw
udev 10M 616K 9.4M 7% /dev
tmpfs 2.0G 0 2.0G 0% /dev/shm
/dev/sda1 236M 22M 202M 10% /boot
/dev/mapper/host.example.com-home
50G 17G 31G 36% /home
/dev/mapper/host.example.com-tmp
4.9G 12M 4.6G 1% /tmp
/dev/mapper/host.example.com-usr
15G 874M 14G 7% /usr
/dev/mapper/host.example.com-var
99G 617M 93G 1% /var
Tutte le partizioni di sistema sono state ricavate dallo stesso VG ad eccezione della partizione di boot, lo spazio libero in ogni partizione si può vedere con il comando df. Nella configurazione di esempio si ha che il VG ha ancora a disposizione quasi 300GB non assegnati e che la partizione montata su / non ha moltissimo spazio riservato per essa, per cui si presta ad essere ridimensionata prendendo un po di spazio dal volume group. Vediamo come con due semplici comandi eseguiti come utente root si può eseguire questa operazione al volo, senza neanche bisogno di smontare la partizione. Il primo passo da fare è quello di aumentare la dimensione del logical volume, questa operazione viene eseguita tramite il comando lvextend. Questo comando prende come argomento il nome del logical volume da ridimensionare e tramite una delle due opzioni -l o -L si può specificare come intervenire sulla dimensione dell’LV. Nel nostro caso andiamo ad aumentare di 1GB la dimensione del volume con
# lvextend -L +1GB /dev/host.example.com/root Extending logical volume root to 2.27 GB Logical volume root successfully resized
Il comando è stato eseguito e ci viene mostrata la nuova dimensione del volume in output. Il flag L serve per specificare le dimensioni in unità binarie, come argomento di questa opzione si deve passare un numero, opzionalmente seguito da un suffisso per l’unità di misura. Tale numero viene interpretato come dimensione voluta per il volume. Se invece, come nell’esempio, si mette un + davanti alla dimensione indicata la dimensione del volume verrà incrementata di tale grandezza. Usando invece il flag -l l’unità di misura presa in considerazione sarà il logical extent, ovvero il frammento minimo in cui è suddiviso un volume group.
Siamo a metà dell’opera, per adesso abbiamo solamente ingrandito il volume, ma la partizione su tale volume ha ancora la vecchia dimensione, pertanto lo spazio libero è rimasto immutato. Quello che dobbiamo fare adesso è espandere il filesystem che si trova sul volume che abbiamo ingrandito in maniera tale da fargli usare tutto lo spazio a disposizione. Il filesystem ext3 supporta l’online resizing, ovvero è possibile ridimensionarlo in tempo reale senza neppure smontarlo. Tuttavia nell’eseguire queste operazioni è bene accertarsi che il filesystem non contenga errori per cui prima di eseguire il resize controlliamo il filesystem con
# e2fsck -n /dev/host.example.com/root e2fsck 1.41.3 (12-Oct-2008) Warning! /dev/host.example.com/root is mounted. Warning: skipping journal recovery because doing a read-only filesystem check. /dev/host.example.com/root: clean, 10789/329912 files, 151503/1331200 blocks
Importantissimo il flag -n che dice ad fsck di lavorare in modailtà read-only, infatti a noi interessa solamente conoscere lo stato del filesystem che in questo caso risulta essere clean (In alternativa per conoscere lo stato del filesystem è possibile eseguire il comando dumpe2fs -h /dev/host.example.com/root | grep state. Per cui ci accingiamo ad eseguire il resize vero e proprio con il comando resize2fs. Questo comando invocato con il solo nome della partizione da ridimensionare la va ad espandere in modo tale da occupare tutto lo spazio a disposizione
# resize2fs /dev/host.example.com/root resize2fs 1.41.3 (12-Oct-2008) Filesystem at /dev/host.example.com/root is mounted on /; on-line resizing required old desc_blocks = 6, new_desc_blocks = 10 Performing an on-line resize of /dev/host.example.com/root to 2379776 (1k) blocks. The filesystem on /dev/host.example.com/root is now 2379776 blocks long.
A questo punto abbiamo finito, possiamo controllare che il risultato ottenuto sia quello che ci eravamo prefissati nuovamente con il comando df
# df -h /
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/host.example.com-root
2.2G 108M 2.0G 6% /
Ridurre la dimensione del filesystem
Il comando complementare per ridurre la dimensione di un LV è lvreduce che ha sintassi identica ma nel specificare la grandezza dell’LV si può usare un – per sottrarre la grandezza alla dimensione corrente del volume.
Mentre non ci sono controindicazioni ad espandere un volume, bisogna fare molta attenzione quando lo si riduce, in quanto è nostro compito compattare il filesystem che si trova su quel volume prima della riduzione del volume, altrimenti si andrà quasi sicuramente incontro ad una perdita di dati.
Inoltre il resize online dei filesystem ext3 non è supportato, per cui è necessario smontare il filesystem prima di ridimensionarlo.
In ogni caso i passi da eseguire per ridurre un filesystem su ext3 sono i seguenti:
- smontaggio del volume (umount)
- controllo d’integrità forzato del filesystem (e2fsck -f <device>)
- ridimensionamento del filesystem (resize2fs <device> <size>
- ridimensionamento partizione (lvreduce)
C’è da prestare massima attenzione nel passare la stessa dimensione finale ai comandi resize2fs e lvreduce, altrimenti perderete sicuramente dei dati. Un trucco per evitare problemi potrebbe essere il seguente: invocate resize2fs con un parametro size che sia minore della dimensione finale che volete ottenere per il filesystem. Poi eseguite lvmreduce con il valore finale desiderato, ed infine resize2fs senza specificare il parametro size.
Ad esempio se volete ridimensionare una partizione da 50GB a 20GB (supponendo che lo spazio occupato sia intorno ai 18GB o meno) eseguite questa serie di comandi dopo aver smontato e verificato il filesystem
# resize2fs /dev/vgname/lvname 19G # lvreduce -L 20G /dev/vgname/lvname # resize2fs /dev/vgname/lvname
C’è da notare che anche se avrete preso tutte queste precauzioni, lvmreduce vi chiederà di confermare il comando in quanto potenzialmente pericoloso, è perfettamente normale che sia così, non state facendo nulla di sbagliato.
Conclusioni
Abbiamo visto come ridimensionare al volo un filesystem su LVM e quali comandi utilizzare per espandere il filesystem e per manipolare le varie entità create con LVM.
Per quanto riguarda l’integrità dei dati c’è da sapere che LVM non è un sistema con ridondanza, per cui in una configurazione semplice unire due o più dischi porterà quasi certamente alla perdita di dati in caso di rottura di un disco.
Per risolvere questo problema l’uso di LVM quando è richiesta alta affidabilità dei dati va abbinato ad una soluzione di tipo RAID 1 oppure RAID 5 (da evitare il livello 0 che fa più o meno lo stesso lavoro di LVM ma con meno flessibilità).
Per approfondire questo argomento e vedere esempi di utilizzo di tutti i comandi del pacchetto lvm2 vi rimando al tutorial lvm di howtoforge. Questo tutorial, oltre ad essere molto approfondito mette a disposizione un’immagine VMWare con una macchina Debian configurata per supportare LVM e RAID utilissima per fare esperimenti.



















