Obiettivo: ampliare lo spazio su un disco di Ubuntu, aggiungendo un nuovo hard disk ed estendendo il disco con LVM
Prima di inoltrarci in questa guida sui volumi logici suggerisco di dare un’occhiata, per chi fosse ancora alle prime armi, a questo articolo sull’installazione di Ubuntu con LVM. Questo articolo prosegue sulla medesima configurazione dell’articolo citato, dove si suppone che abbiamo già installato Ubuntu predisponendolo per utilizzare l’LVM.
Quello che faremo sarà aggiungere un nuovo disco da 50 GB e poi aggiungere un altro disco da 20 GB col quale espandere il precedente.
LVM sta per logical volume manager (ovvero gestore logico dei volumi) un meccanismo attraverso il quale Linux può accorpare diversi dischi fisici in un’unico volume logico. E’ qualcosa che assomiglia, e sottolineo che si tratta solo di una somiglianza, alle configurazioni in RAID. L’idea potrebbe essere schematizzata nel modo seguente:
Il concetto di fondo è molto semplice e potremmo riassumerlo nel modo seguente: con due hard disk da 50 GB ciascuno posso creare un’unico “disco logico”, ovvero lo spazio che vede il sistema operativo, da 100 GB e posso continuare ad incrementarlo a piacere in base alle mie esigenze. Noi quindi aggiungeremo un disco 50GB e poi lo estenderemo con uno da 20GB, ottenendo uno spazio complessivo di 70GB.
Le potenzialità del LVM non si esauriscono qui, ma per quello che ci serve sapere in questo momento tanto può bastare.
In questo articolo utilizzerò ancora una volta VirtualBox, dove andrò ad aggiungere, al disco già esistente, puta caso da 50GB un secondo disco sempre da 50GB con il quale estendere la memoria a disposizione del mio sistema operativo.
Per aggiungere un nuovo disco alla mia macchina virtuale è sufficiente spostarsi, da VirtualBox, sulle Impostazioni della macchina virtuale e poi su Archiviazione.
A questo punto, come nell’immagine seguente, ci posizioniamo sul Controller SATA e clicchiamo sull’icona col disco ed il più verde e seguiamo la procedura guidata per aggiungere un secondo disco (da me chiamato DiscoUbuntuEsempio2.vdi) da 50 GB.
Fatto questo avviamo la nostra macchina virtuale come al solito. Inutile dire che se stessimo lavorando su una macchina fisica sarebbe sufficiente aggiungere fisicamente un nuovo hard disk al controller SATA.
Una volta dentro Ubuntu andiamo anzitutto a visualizzare l’elenco dei dischi fisici attualmente configurati.
1 |
sudo pvdisplay |
Faccio notare che pv sta per phisical volume, ovvero i dischi fisici collegati all’LVM. Il risultato dovrebbe essere qualcosa di simile a questo.
Nel mio caso ho già collegato il secondo disco, ma solo un disco, quello dell’installazione, è configurato all’interno dell’LVM. Il disco nello specifico è /dev/sda5. (per essere precisi il disco è /dev/sda, mentre quello è il puntatore ad una delle “partizioni” — senza entrare troppo nel merito, che in questo momento potrebbe solo confondere le idee, possiamo dire che un singolo disco, sda in questo caso, può essere “visto” dal sistema operativo in diversi modi)
Adesso andiamo a visualizzare invece tutti i dischi collegati alla mia macchina.
1 |
sudo fdisk -l |
Il risultato sarà esteso perché dovrebbe mostrare anche la RAM e tutti gli altri eventuali dischi e memorie collegati. Nel mio caso ad un certo punto appare:
Faccio notare che abbiamo due dischi, sda, di cui abbiamo parlato poc’anzi, e il nuovo disco sdb che abbiamo aggiunto da poco e che non è partizionato.
A questo punto creiamo una nuova partizione sul disco sdb.
1 |
sudo fdisk /dev/sdb |
Ci verrà chiesto che cosa vogliamo fare. Le opzioni in questo momento sono:
- n = nuova partizione
- p = partizione primaria
- 1 = imposta la partizione la prima del disco
Scegliamo n per creare una nuova partizione.
Adesso ci viene chiesto se vogliamo farla primaria (p) o estesa (e). Scegliamo p per farla primaria.
Numero della partizione: 1
Alla domanda sul first sector, primo settore, digitiamo il valore suggerito di default, per me 2048.
Stesso discorso per il last sector, ovvero l’ultimo settore, scegliamo il valore suggerito di default (si può anche premere semplicemente INVIO)
Adesso abbiamo creato il nostro disco da 50GiB (ricordo che secondo il nuovo standard GiB sta per Gibibyte, che equivalgono a 1024 MiB, mentre 1GB equivale a 1000 MB, quindi 1 GiB ≠ 1 GB, inutile dire che per gli irriducibili come il sottoscritto si continuano a chiamare Gigabyte e andare di 1024 in 1024)
Continuando a trovarci su fdisk (che ci chiede un nuovo comando per proseguire o m per la guida), andiamo adesso a modificare il tipo di partizione creata digitando t e premendo INVIO.
- t – modifica tipo di partizione
- 8e – imposta su tipo LVM
Ci verrà chiesto il tipo di partizione e digitiamo 8e.
Se digitiamo L, alla richiesta del tipo di partizione, ci verrà mostrato il seguente elenco:
Se abbiamo fatto tutto bene ci verrà mostrato il seguente messaggio di conferma:
1 |
Changed type of partition 'Linux' to 'Linux LVM'. |
A questo punto è il momento di scrivere la partizione creta sul disco! Già, non l’abbiamo ancora scritta quindi nessuna di queste modifiche è ancora stata apportata. Le opzioni utili adesso sono:
- p = mostra le impostazioni di partizione prima della scrittura
- w = scrivi sul disco
Per scrupolo digitiamo p e verifichiamo che sia uscito qualcosa di simile.
Notiamo che sarà creato un puntatore /dev/sdb1 alla nuova partizione che ci accingiamo a creare.
Adesso premiamo w per scrivere tutte le modifiche sul nostro disco (inutile dire che ogni eventuale dato sul disco andrà perso).
Se tutto è andato bene riceveremo un messaggio di conferma come il seguente:
1 2 3 |
The partition table has been altered. Calling ioctl() to re-read partition table. Syncing disks. |
Adesso dobbiamo creare il nostro volume fisico. Da terminale digitiamo:
1 |
sudo pvcreate /dev/sdb1 |
Adesso creiamo un nuovo gruppo dei volumi (in questo caso abbiamo un singolo volume) e lo andiamo a chiamare secondo-gruppo (il gruppo esistente, come visto con pvdisplay si chiama ubuntu-vg, il nome è a piacere purché sia una parola singola). Digitiamo:
1 |
sudo vgcreate secondo-gruppo /dev/sdb1 |
Adesso dobbiamo creare soltanto il volume logico e dargli un nome, per esempio spazio-web. Tra poco capirete meglio anche la scelta, intanto procediamo con:
1 |
sudo lvcreate -L 10G -n spazio-web secondo-gruppo |
Faccio notare che abbiamo creato così un volume logico di 10GB (passando la dimensione al comando -L 10G) sullo spazio complessivo disponibile di 50GB. Se avessi voluto utilizzare tutto lo spazio anziché passare il comando -L avrei dovuto scrivere
1 |
sudo lvcreate -l 100%FREE -n spazio-web secondo-gruppo |
Il motivo per cui scelgo di non usare tutto lo spazio, o per essere più precisi uno dei motivi possibili, potrebbe essere il seguente: questo disco intendo dedicarlo allo spazio web in /var/www montandolo al posto della cartella esistente. Così tutti i siti web ospitati dal mio server si troveranno su un disco separato da quello principale. In questo modo posso anche controllare l’espansione di tali siti, evitando che mi saturino l’intero disco prima che io possa espanderlo. Qualora la dimensione dei siti dovesse raggiungere i 10GB, i loro utenti (che in teoria potrebbero avere degli accessi dedicati allo spazio web, per esempio mediante FTP) non potranno aggiungere altri file, mentre io potrò espandere lo spazio e adoperarmi per aggiungere nuovi hard disk.
Per chiarire questa idea immaginiamo di ospitare sul server il sito web di Mario e quello di Luigi, due persone distinte e che non si conoscono. In tutto i loro siti condividono 10GB in questo momento; immaginiamo adesso che Luigi decida di caricare sul proprio server web 3 file da 9GB. Dopo il primo upload lo spazio sarebbe saturato e Luigi non potrebbe proseguire con il successivo. Questo provocherebbe degli alert (supponendo che io li abbia configurati) all’interno della macchina e mi permetterebbe di intervenire in due modi: anzitutto controllare come mai lo spazio è cresciuto a dismisura in poco tempo, e allo stesso tempo aggiungere magari un altro paio di GB per permettere a Mario di essere comunque operativo e non sentire la saturazione dello spazio condiviso.
Concludiamo tutta l’operazione formattando il nuovo volume logico appena creato:
1 |
sudo mkfs -t ext4 /dev/secondo-gruppo/spazio-web |
mkfs sta letteralmente per make filesystem e il comando -t mi permette di scegliere il tipo di file system.
Controlliamo la situazione digitando di nuovo:
1 |
sudo pvdisplay |
Dovremmo vedere qualcosa di simile a questo:
Questi sono i nostri due volumi fisici. Controlliamo adesso quelli logici digitando:
1 |
sudo lvdisplay |
Quello che dovrebbe apparirci è la seguente schermata:
In questo caso abbiamo due gruppi distinti di volumi e tre volumi logici. I due gruppi sono ubuntu-vg e secondo-gruppo, mentre i tre volumi logici sono spazio-web, root e swap_1.
Adesso montiamo il volume logico spazio-web sulla cartella /var/www/.
Attenzione! Montando il volume su uno spazio esistente tutto il contenuto di tale spazio verrà sovrascritto, quindi prima dovremmo copiare dentro il nuovo volume il contenuto attuale. I vecchi dati comunque non andranno persi, semplicemente non saranno più visibili. Per capire bene questo passaggio facciamo la seguente serie di operazioni.
Anzitutto controlliamo il contenuto della cartella /var/www digitando:
1 |
ls /var/www |
Quello che dovremmo vedere (ricordo che sulla mia macchina ho già configurato altri virtual host e siti) è qualcosa di simile a:
Il contenuto non è tanto importante quanto il fatto che dentro ci sia già qualcosa che vorremmo preservare.
Adesso montiamo su /var/www il volume spazio-web.
1 |
sudo mount -t ext4 /dev/secondo-gruppo/spazio-web /var/www |
A questo punto controlliamo nuovamente, come prima il contenuto della cartella /var/www
1 |
ls /var/www |
Il risultato che dovrebbe presentarsi è qualcosa di simile a questo:
Notiamo che non ci sono le cartelle di prima ma solamente una cartella lost+found che si trova anche nella radice (root) del nostro sistema operativo.
Nota: la cartella lost+found esiste su ogni partizione primaria ed ha come scopo quello di collezionare eventuali file danneggiati, perduti o recuperati da fsck (per esempio). Dentro a lost+found possono finire anche file o frammenti di file a seguito di un errore di sistema (es. kernel panic) o un arresto improvviso, oppure per via di inconsistenze del sistema dovute a software o altri generi di errori. In generale quello che si trova dentro a lost+found può essere cancellato perché già eliminato dal sistema o inutile.
A questo punto, a scopo dimostrativo, creiamo dentro la cartella /var/www un file vuoto chiamato file_petar_test.txt con il seguente comando:
1 |
sudo touch /var/www/file_petar_test.txt |
Questo lo facciamo per verificare il comportamento di mount (chiaramente non è necessario per una configurazione normale).
Adesso smontiamo la partizione in modo da copiare il contenuto originale di /var/www nella nuova partizione prima di montarla di nuovo:
1 |
sudo umount /var/www |
Il comando umount smonta la cartella scelta. Effettuando di nuovo un ls sulla cartella /var/www ritroveremo i file precedenti:
Adesso montiamo la partizione (il volume logico) spazio-web su una cartella provvisoria che creeremo dentro a /mnt (la cartella /mnt è pensata per creare dentro le cartelle sulle quali montare volumi aggiuntivi — come è facile immaginare non c’è niente di speciale in tale cartella e il mount può essere effettuato ovunque).
Creiamo quindi la cartella provvisoria con:
1 |
sudo mkdir /mnt/cartella_sw |
Faccio notare che il nome cartella_sw è totalmente arbitrario, l’unica condizione è che rispetti i criteri per la creazione delle cartelle in generale (sw starebbe nel mio caso per spazio-web).
Montiamo la partizione:
1 |
sudo mount -t ext4 /dev/secondo-gruppo/spazio-web /mnt/cartella_sw/ |
A questo punto possiamo copiare il contenuto da /var/www in /mnt/cartella_sw (se controlliamo il contenuto di quest’ultima cartella noteremo il nostro file txt di prova creato in precedenza)
1 |
sudo cp -a /var/www/. /mnt/cartella_sw/ |
In questo caso usiamo il comando cp per copiare, con il parametro -a gli diciamo di copiare ricorsivamente tutte le cartelle ed i file figli della cartella genitore. E’ importante scrivere /var/www/. (ovvero il percorso con incluso il punto) perché il . rappresenta il contenuto della cartella, stiamo cioè dicendo a cp che non vogliamo copiare anche /var/www, ma soltanto il suo contenuto e tutti i suoi figli.
Controllando con ls il contenuto di /mnt/cartella_sw ci accertiamo di aver copiato tutto ciò che c’era dentro a /var/www, troveremo ovviamente anche il file di prova creato precedentemente e lost+found.
A questo punto possiamo rimontare il volume logico sulla posizione /var/www (ricordiamoci di smontarlo dalla posizione corrente e cancellare la cartella /mnt/cartella_sw, lo facciamo solo per una questione di ordine). In sequenza eseguiamo quindi:
1 2 3 |
sudo umount /mnt/cartella_sw sudo mount -t ext4 /dev/secondo-gruppo/spazio-web /var/www sudo rmdir /mnt/cartella_sw/ |
Controllando il contenuto di /var/www a questo punto dovremmo vedere qualcosa di simile a:
Inutile dire che, in linea di principio, se questa fosse stata un’operazione definitiva, avrei dovuto svuotare il contenuto di /var/www per non occupare inutilmente lo spazio sul disco primario.
A questo punto vediamo alcuni altri comandi utili.
DF, PVS e LVS
Con il comando df (disk free) controlliamo lo spazio sulle partizioni montate.
1 |
df -h |
Il risultato dovrebbe essere simile a questo:
Notiamo che il volume logico ubuntu–vg-root (qui il formato è gruppo_volumi-volume_logico) è montato su / (la radice del sistema), mentre secondo–gruppo-spazio–web è montato su /var/www. Ci vengono mostrate anche le percentuali di utilizzo, 1% nel caso di /var/www.
Adesso vediamo le informazioni sui volumi logici utilizzando lvs.
1 |
sudo lvs |
Faccio notare che, a differenza di df, questo necessità di permessi di root per essere eseguito.
In questo caso ci vengono mostrate le informazioni su tutti i volumi logici che abbiamo creato, comprese le loro dimensioni.
Utilizziamo adesso pvs per visualizzare i volumi fisici:
1 |
sudo pvs |
Quello che otteniamo dovrebbe assomigliare al seguente risultato:
In questo caso vediamo i volumi fisici associati all’LVM, ed in particolare possiamo controllare lo spazio complessivo (PSize) e lo spazio libero (PFree). In particolare notiamo che su sdb1 abbiamo ancora 40GB liberi.
Quindi, riepilogando, abbiamo destinato il volume logico spazio-web, appartenente al gruppo secondo-gruppo, alla cartella /var/www. Il gruppo secondo-gruppo contiene in tutto spazio per 50GB, di cui stiamo usando solo 10GB per il volume logico spazio-web.
Estendere un volume logico
Adesso vogliamo dare altri 20GB allo spazio-web, espandendo quindi /var/www.
Per farlo ci sarà sufficiente utilizzare il comando lvextend:
1 |
sudo lvextend -L+20G /dev/secondo-gruppo/spazio-web |
Ci verrà data conferma che l’estensione è avvenuta con successo; l’estensione può avvenire finché il gruppo dei volumi a cui appartiene il volume logico dispone di spazio libero (PFree).
Utilizziamo di nuovo df -h per verificare la situazione:
1 |
df -h |
E dovremmo vedere qualcosa di simile a questo:
Notiamo che /var/www continua ad essere di 10GB! Questo perché oltre ad estendere il volume logico dobbiamo estendere anche il filesystem. Per farlo ci è sufficiente digitare:
1 |
sudo resize2fs /dev/secondo-gruppo/spazio-web |
Ricontrollando con df -h vediamo che la situazione è diventata come la volevamo all’inizio:
Aggiungere volume fisico al gruppo dei volumi
Aggiungiamo adesso un disco fisico da 20GB al gruppo dei volumi chiamato secondo-gruppo, in modo che lo spazio complessivo passi da 50GB a 70GB.
Per farlo dobbiamo aggiungere naturalmente un nuovo disco, io lo faccio sulla macchina virtuale in questo caso. Verifichiamo i dischi collegati:
1 |
sudo fdisk -l |
Il nuovo risultato dovrebbe essere simile al seguente:
Notiamo che abbiamo un disco su /dev/sdc da 20GB.
Adesso aggiungiamo il disco al gruppo di volume chiamato secondo-gruppo:
1 |
sudo vgextend secondo-gruppo /dev/sdc |
Controlliamo i nostri volumi fisici con:
1 |
sudo pvs |
Questo è il nuovo risultato:
Vediamo che su secondo-gruppo abbiamo ancora liberi 40G (la somma degli spazi liberi sui due dischi precedenti), quindi proviamo ad estendere spazio-web di altri 40GB, oltre ai 20GB precedentemente aggiunti. Eseguiamo i seguenti due comandi, come prima:
1 |
sudo lvextend -L+40G /dev/secondo-gruppo/spazio-web |
Eseguendo questo comando ci viene però detto “Insufficient free space: 10240 extents needed, but only 10238 available“, ci mancano giusto 2 extents (gli extents sono l’equivalente per le LVM dei cluster per i filesystem, entrambi sono le minime unità in cui viene suddiviso lo spazio). Per evitare il problema estendiamo il volume logico su tutto lo spazio disponibile:
1 |
sudo lvextend -l +100%FREE /dev/secondo-gruppo/spazio-web |
Notiamo come il comando assomigli al medesimo meccanismo, eccetto per il +, con il quale creiamo il volume logico su tutto lo spazio disponibile. Adesso estendiamo il filesystem.
1 |
sudo resize2fs /dev/secondo-gruppo/spazio-web |
Prima di poterlo fare potrebbe esserci richiesto un controllo del filesystem medesimo, visto che lo abbiamo esteso poc’anzi.
1 |
sudo e2fsck -f /dev/secondo-gruppo/spazio-web |
In questo modo eseguiamo il controllo e poi effettuiamo di nuovo resize2fs.
A questo punto eseguendo df -h notiamo che /var/www corrisponde a circa 70GB.
OK. Ho barato un po’. Arrivati a questo punto potreste in realtà notare che /var/www non è più collegata al volume logico spazio-web. Questo è successo se avete riavviato il computer per montare il secondo disco aggiuntivo. Per ottenere il risultato precedente è sufficiente montare di nuovo il volume logico, come in precedenza, oppure definire il mount in modo permanente (questo vale per qualunque disco, non solo per i volumi logici).
Montare un disco in modo permanente
Per montare il volume logico in modo permanente, ovvero che rimanga montato dopo ogni riavvio, è necessario modificare il file /etc/fstab.
1 |
sudo nano /etc/fstab |
Per montare il disco utilizziamo la seguente sintassi:
- PERCORSO_VOLUME_LOGICO PUNTO_DI_MOUNT ext4 rw,defaults 0 0
Quindi in fondo al file scriviamo:
1 |
/dev/mapper/secondo--gruppo-spazio--web /var/www ext4 rw,defaults 0 0 |
Faccio notare che /dev/mapper/secondo–gruppo-spazio–web è il percorso che ci viene dato da df -h
Salviamo e riavviamo la macchina per verificare se va tutto bene. ATTENZIONE! Prestate moltissima attenzione alla sintassi, un qualche errore potrebbe bloccare l’avvio del sistema e costringerci ad intervenire in modalità di ripristino. La soluzione sarebbe comunque semplice, basterebbe rimuovere l’ultima riga aggiunta a fstab.
Se tutto è andato a dovere eseguendo df -h vedremo /dev/mapper/secondo–gruppo-spazio–web montata su /var/www
3 thoughts on “LVM, gestore logico dei volumi su Ubuntu [per pinguini alle prime armi]”