Gestire i dischi tramite il Logical Volume Manager (LVM) garantisce maggiore elasticità rispetto alla classico approccio basato esclusivamente sulle partizioni. Una spiegazione introduttiva di LVM è stata data due capitoli fa al capoverso Logical Volume, non la ripeteremo, qualora la riteniate utile prima di partire vi invitiamo a visionarla.
Sarà bene comprendere che per utilizzare un disco LVM innanzi tutto lo battezza. In pratica inserisce una label che identifica lo spazio come gestito da LVM. I primi quattro settori di un disco sono controllati da LVM al boot. Per garantire compatibilità con lo MBR di norma la label è inserita nel secondo settore. LVM gestisce gli spazi in extents. Gli extents sono le frazioni minime, non ulteriormente frazionabili, in cui uno spazio LVM è automaticamente suddiviso. Un Physical Volume può essere indifferentemente un disco o una partizione, ciò consentirà di adottare anche strategie ibride. Ovviamente quando l’intero disco sarà utilizzato con LVM non è necessario installare alcuna tabella delle partizioni. Qualora sia presente è buona norma distruggerla. Forniremo un utile comando da CLI per ottenere questo effetto. Quello che segue non è però un comando da usare alla leggera poiché risulta devastante per i dati contenuti nel disco pertanto siate matematicamente certi di lanciarlo solo sul disco giusto effettuando tutti i controlli del caso.
fprincipe@html3:~$ sudo dd if=/dev/zero of=/dev/sdd bs=1k count=1
1+0 records in
1+0 records out
1024 bytes (1.0 kB, 1.0 KiB) copied, 0.0151983 s, 67.4 kB/s
fprincipe@html3:~$ sudo blockdev --rereadpt /dev/sdd
Dovrete sostiture a /dev/sdd (utilizzato in fase di test) il percorso del disco che intendete "nuclearizzare".
Altra cosa da tenere presente è che per ragioni di affidabilità viene di norma sconsigliata la collocazione della partizione /boot all’interno di un volume LVM poiché la stessa deve risultare raggiungibile anche in situazioni di accesso minimale.
Inizializazzione e creazione
Prenderemo subito l’avvio con esempi pratici di utilizzo, come di consueto commentati e debitamente illustrati.
Il primo comando che utilizzeremo è pvcreate che per l’appunto inizializza uno spazio di storage. Con pvcreate /dev/sdb1 /dev/sdc1 inizializziamo quindi le due “prime” partizioni sui dischi sdb e sdc creando i Physical Volume (PV). A questo punto incorporeremo i PV di nostra scelta in insiemi chiamati Volume Group (VG). Il comando da adoperare è vgcreate a cui daremo come argomento il nome del raggruppamento seguito dai device da inserire nel gruppo. Ora non dobbiamo far altro che creare i Logical Volume che desideriamo utilizzare tramite il comando lvcreate con argomento -n per il nome e -L seguito da un valore espresso in forma umanamente intelligibile per dichiarare la capienza (nell'esempio “G” è usato per intendere gigabyte).
fprincipe@html3:~$ sudo pvcreate /dev/sdb1 /dev/sdc1
Physical volume "/dev/sdb1" successfully created.
Physical volume "/dev/sdc1" successfully created.
fprincipe@html3:~$ sudo vgcreate test /dev/sdb1 /dev/sdc1
Volume group "test" successfully created
fprincipe@html3:~$ sudo lvcreate -n lv01 -L 20g notest
Volume group "notest" not found
Cannot process volume group notest
fprincipe@html3:~$ sudo lvcreate -n lv01 -L 20g test
Logical volume "lv01" created.
fprincipe@html3:~$ sudo lvcreate -n lv02 -L 10g test
Logical volume "lv02" created.
fprincipe@html3:~$ sudo lvdisplay
--- Logical volume ---
LV Path /dev/test/lv01
LV Name lv01
VG Name test
LV UUID QkenZG-cdVf-Qbtx-HHbr-0x9F-2Kcn-M8J1nP
LV Write Access read/write
LV Creation host, time html3, 2018-07-10 18:29:18 +0000
LV Status available
# open 0
LV Size 20.00 GiB
Current LE 5120
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:0
--- Logical volume ---
LV Path /dev/test/lv02
LV Name lv02
[...]
fprincipe@html3:~$ sudo pvdisplay
--- Physical volume ---
PV Name /dev/sdb1
VG Name test
PV Size
Qualora dovessimo richiedere di generare un Logical Volume attingendo a un Volume Group che non può esaudire la richiesta otterremo in risposta un errore. Subito sopra possiamo vedere un esempio di richiesta indirizzata a un volume group inesistente. In ogni momento potremo ottenere una panoramica generale con i due comandi pvdisplay e lvidsplay che ci daranno in output, rispettivamente, la situazione dei volumi fisici e di quelli logici.
Passiamo oltre. Ora abbiamo dei contenitori (i volumi logici) in cui è possibile inserire un filesystem. Ecco un esempio di utilizzo che verrà commentato immediatamente a seguire.
fprincipe@html3:~$ sudo mkfs.ext4 /dev/test/lv01
mke2fs 1.44.1 (24-Mar-2018)
Creating filesystem with 5242880 4k blocks and 1310720 inodes
Filesystem UUID: ec077e8a-8efa-4548-b337-0b286eb2ac49
[...]
Writing superblocks and filesystem accounting information: done
fprincipe@html3:~$ mkdir lv01
fprincipe@html3:~$ sudo mount -t ext4 /dev/test/lv01 lv01
fprincipe@html3:~$ df -h
Filesystem Size Used Avail Use% Mounted on
udev 464M 0 464M 0% /dev
[...]
tmpfs 99M 0 99M 0% /run/user/1000
/dev/mapper/test-lv01 20G 45M 19G 1% /home/fprincipe/lv01
fprincipe@html3:~$ sudo lvextend -L +10g test/lv01
Size of logical volume test/lv01 changed from 20.00 GiB (5120 extents) to30.00 GiB (7680 extents).
Logical volume test/lv01 successfully resized.
fprincipe@html3:~$ df -h
Filesystem Size Used Avail Use% Mounted on
udev 464M 0 464M 0% /dev
[...]
/dev/mapper/test-lv01 20G 45M 19G 1% /home/fprincipe/lv01
fprincipe@html3:~$ sudo resize2fs /dev/mapper/test-lv01
resize2fs 1.44.1 (24-Mar-2018)
Filesystem at /dev/mapper/test-lv01 is mounted on /home/fprincipe/lv01; on-line resizing required
old_desc_blocks = 3, new_desc_blocks = 4
The filesystem on /dev/mapper/test-lv01 is now 7864320 (4k) blocks long.
fprincipe@html3:~$ df -h
Filesystem Size Used Avail Use% Mounted on
udev 464M 0 464M 0% /dev
[...]
tmpfs 99M 0 99M 0% /run/user/1000
/dev/mapper/test-lv01 30G 44M 28G 1% /home/fprincipe/lv01
fprincipe@html3:~$ sudo lvextend -l +100%FREE test/lv01
Size of logical volume test/lv01 changed from
La LV Path è per noi l’equivalente dell’indirizzo di un nuovo storage. Potremo quindi creare su di esso un filesystem, nel caso d'esempio ext4.
Creiamo un mountpoint. Il comando mount non fa altro che montare il fileystem al mountpoint in questione.
Come possiamo vedere, se interrogato con df, il nuovo filesystem ci offre una disponibilità secondo le attese, poco al di sotto dei 20Gb (i filesystem ext4, come gli ext3, spendono un po’ del proprio spazio per implementare alcune funzioni di controllo).
Allargare e rimpicciolire
Siamo ora in grado di osservare una delle potenzialità di LVM. Con lvextend -L possiamo specificare la quantità di spazio da aggiungere a un Logical Volume espresso in Gb. E' altresì possibile dilatare un Logical Volume anche utilizzando l’opzione -l a cui di norma si dovrebbe passare una quantità di extent ma che accetta anche definizioni parametriche espresse quale percentuale. Detta percentuale può essere calcolata sullo spazio libero del volume group con %FREE, sul volume fisico con %PVS o sull’intera capienza nominale del volume group con %VG. Ovviamente, dopo aver allargato il contenitore, dovremo anche allargare il filesystem contenuto. Il comando che abbiamo adoperato è resize2fs che può essere adoperato per gonfiare un filesystem ext2/ext3/ext4 fino alla massima dimensione possibile. Lo stesso comando può essere anche utilizzato con l'opzione -M per rimpicciolire il filesystem in modo da fargli occupare la minima quantità di spazio in funzione del suo contenuto.
LVM offre molte altre funzionalità, nel prossimo capitolo ne sarà presentata la gestione avanzata.