Gentoo Logo

Disclaimer : La versione originale di questo articolo è stata pubblicata da IBM developerWorks ed è di proprietà di Westtech Information Services. Questo documento è una versione aggiornata dell'articolo originale, e contiene numerosi miglioramenti apportati dal Gentoo Linux Documentation team.
Questo documento non è mantenuto attivamente.


Imparare Linux LVM, Parte 2

1.  L'aggiornamento di cvs.gentoo.org

Introduzione

Nel primo articolo su LVM, sono stati spiegati i concetti che stanno dietro a LVM. Adesso è il momento di mettere in azione quanto visto su LVM. In questo articolo, verrà messo a punto LVM sul server cvs ufficiale di Gentoo Linux, cvs.gentoo.org. Anche se cvs.gentoo.org ha un solo disco rigido, la flessibilità di LVM comporta ugualmente un incredibile miglioramento rispetto alle tecniche classiche di partizionamento statico. Verranno mostrati tutti i passi del processo di conversione a LVM, così che gli interessati potranno effettuare una transizione simile su una delle proprie macchine.

Avvertenza: In quanto implementare LVM è un grosso cambiamento per il sistema (che coinvolge la creazione di nuove partizioni e altre azioni potenzialmente pericolose) può essere una buona idea effettuare un backup completo del sistema prima di intraprendere il cammino. Nel caso non si intenda effettuare un backup, l'autore si augura che la macchina usata sia destinata agli esperimenti e non contenga dati importanti. È importante osservare che l'autore non ha mai incontrato alcun problema nel passaggio a LVM, ma è sempre meglio essere preparati nel caso in cui qualcosa vada storto.

Fatte le dovute premesse, si può procedere. Prima di iniziare il processo di conversione, è stato fatto un aggiornamento di cvs.gentoo.org così che venissero usati i pacchetti che seguono. Nel momento in cui è stato effettuata la transizione a LVM, queste erano le ultime versioni disponibili (vedere Risorse più avanti in questo articolo):

  • Linux kernel 2.4.1-ac19
  • LVM 0.9.1_beta5
  • reiserfs-utils 3.6.25

Per iniziare, il disco rigido. cvs.gentoo.org ha un buon disco rigido nuovo IBM da 45 GB al suo interno; comunque, quando è stato installato Gentoo Linux su cvs, sono stati partizionati solamente 10 gigabytes circa del disco, lasciando i rimanenti 35 GB per partizioni future. Questi sono alcuni piccoli trucchi di cui l'utente ha bisogno quando non usa LVM: lasciare parti del disco non partizionate è un modo rozzo ma efficace per permettere future espansioni. Comunque, con LVM esiste un approccio migliore.

Il problema dello spazio

Nelle poche settimane precedenti, era stato notato che la partizione ReiserFS di root era diventata lenta riempiendosi, come si può notare dal seguente stampato di df:

Codice 1.1: Spazio libero quasi esaurito

Filesystem           1k-blocks      Used Available Use% Mounted on
/dev/hda3              9765200   6989312   2775888  72% /
tmpfs                   269052         0    269052   0% /dev/shm

In realtà, una partizione di root piena al 72% non è esattamente una crisi, ma neanche una splendida situazione. ReiserFS, come molti altri filesystem, degrada nelle prestazioni via via che si riempie, ed era solo questione di tempo prima che il suddetto filesystem di root fosse completamente pieno e le sue performance subissero una tracollo.

È stato deciso quindi di porre rimedio al problema usando LVM per creare un nuovo volume logico fuori sui 35 GB di spazio attualmente non partizionato alla fine del disco rigido. Perciò è stato creato un filesystem su questo volume e sono stati spostati una buona parte dei contenuti di /dev/hda3 su di esso.

Se chi legge ha intenzione di fare una transizione simile su una delle proprie macchine, la prima cosa di cui ha bisogno è trovare una parte del proprio filesystem di root adatta da spostare su un volume logico. Per l'autore, la scelta è stata facile: l'albero sotto /home occupava circa 5.7 GB. Muovendo /home sul volume logico, il filesystem di root dovrebbe scendere all'incirca al 20% della sua capacità. Dato che molti dei nuovi dati verranno poi aggiunti su /home, il filesystem di root dovrebbe probabilmente restare all'incirca intorno al 20% della propria capacità: una situazione veramente promettente.

L'inizio di una soluzione

Per iniziare la conversione, è stato aggiunto prima di tutto alla partizione lo spazio inutilizzato alla fine del disco rigido. Usando cfdisk, è stata creata una partizione di 35 GB (/dev/hda5) e impostato il tipo di tale partizione a 8E (il tipo ufficiale per le partizioni LVM). Dopo questo cambiamento, la tabella delle partizioni risultava la seguente:

Codice 1.2: La nuova tabella delle partizioni

# sfdisk -l
Disk /dev/hda: 89355 cylinders, 16 heads, 63 sectors/track
Units = cylinders of 516096 bytes, blocks of 1024 bytes, counting from 0
   Device Boot Start     End   #cyls   #blocks   Id  System
/dev/hda1   *      0+    247     248-   124960+  83  Linux
/dev/hda2        248     743     496    249984   82  Linux swap
/dev/hda3        744   20119   19376   9765504   83  Linux
/dev/hda4      20120   89354   69235  34894440    5  Extended
/dev/hda5      20120+  89354   69235- 34894408+  8e  Linux LVM

Dal momento in cui era presente una partizione vuota di 35 GB, era possibile procedere alla sua inizializzazione per l'uso con LVM. Di seguito la procedura: primo, inizializzazione dei 35 gigabytes come volume fisico; quindi, creazione di un gruppo di volume utilizzando il sopra citato volume fisico, e infine, allocazione di alcune entità nel gruppo di volume, andando così a creare un volume logico che dovrebbe contenere il nuovo filesystem e ospitare tutti i file che si trovano al momento in /home.

Per iniziare il processo, è stato usato il comando pvcreate per inizializzare /dev/hda5 come volume fisico:

Codice 1.3: Creazione del volume fisico

# pvcreate /dev/hda5
pvcreate -- physical volume "/dev/hda5" successfully created

pvcreate allestisce in questo caso una speciale area di "gestione" su /dev/hda5, chiamata VGDA (volume group descriptor area). LVM utilizza quest'area per tenere traccia di come le entità fisiche sono allocate, tra le altre cose.

Il passo successivo consiste nel creare il gruppo di volume e aggiungere /dev/hda5 a questo gruppo. Il gruppo di volume dovrebbe funzionare come una vasca di entità (pezzi di blocchi di memoria). Una volta creato il gruppo di volume, possono venire creati tanti volumi logici quanti si desidera. Nel caso specifico, è stato deciso che il gruppo di volume dovrebbe essere chiamato "main":

Codice 1.4: Creazione del gruppo di volume

# vgcreate main /dev/hda5
vgcreate -- INFO: using default physical extent size 4 MB
vgcreate -- INFO: maximum logical volume size is 255.99 Gigabyte
vgcreate -- doing automatic backup of volume group "main"
vgcreate -- volume group "main" successfully created and activated

Il comando vgcreate fa un paio di cose. Oltre a creare il gruppo di volume "main", impone anche a /dev/hda5 di usare entità di 4 Mb, la dimensione predefinità per le entità. Questo significa che ogni volume logico che verrà creato dallo specifico gruppo di volume potrà essere espanso e ridotto tramite incrementi di 4 Mb.

A causa delle limitazioni del kernel, la dimensione delle entità determina la dimensione massima che un volume logico può assumere. Come è possibile notare dal precedente esempio, una dimensione per entità pari a 4 MB impone una limitazione alla dimensione del volume logico pari a 256 gigabyte, che è una dimensione per volumi logici facilmente raggiungibile se vengono aggiunti diversi componenti ad alta capacità al proprio gruppo di volume. Se esiste la possibilità che i volumi finiscano col diventare più grandi di 256 GB a testa, è raccomandabile di specificare una dimensione maggiore per le entità al momento dell'uso di vgcreate. La dimensione dell'entità può variare liberamente fra 8 KB e 512 MB, e deve essere sempre un multiplo di due. Aumentando la dimensione delle entità al di sopra dei 4 MB, la dimensione massima per volumi fisici sarà scalata di conseguenza, fino a un massimo di 1 petabyte (anche se la dimensione limite attuale nel mondo reale è pari a 2 terabytes su sistemi x86). Per esempio, volendo creare un gruppo di volume con entità di dimensione pari a 32 megabyte, dovrà essere digitato:

Codice 1.5: Impostare una dimensione maggiore per le entità

# vgcreate -s 32M main /dev/hda5

32 MB è una buona dimensione per le entità, dato che una granularità di 32 MB è ancora gestibile e porta la dimensione massima per volumi logici a 2 terabytes all'avvio. Una volta che il gruppo di volume è stato creato, è possibile visualizzarne le informazioni digitando vgdisplay:

Codice 1.6: Esaminare le informazioni di volume

# vgdisplay
--- Volume group ---
VG Name               main
VG Access             read/write
VG Status             available/resizable
VG #                  0
MAX LV                256
Cur LV                0
Open LV               0
MAX LV Size           255.99 GB
Max PV                256
Cur PV                1
Act PV                1
VG Size               33.28 GB
PE Size               4 MB
Total PE              8519
Alloc PE / Size       0 / 0
Free  PE / Size       8519 / 33.28 GB
VG UUID               2qC2H2-iA8s-qW6F-cwXx-JVIh-I6VC-VVCGmn

Adesso che il gruppo di volume è pronto, sarà possibile creare un volume logico. Nel caso specifico è stato deciso di renderlo inizialmente di dimensione pari a 8 gigabytes e chiamarlo "lv_home":

Codice 1.7: Creazione del volume logico

# lvcreate -L8G -nlv_home main
lvcreate -- doing automatic backup of "main"
lvcreate -- logical volume "/dev/main/lv_home" successfully created

Quindi, è stato creato un filesystem sul volume:

Codice 1.8: Creazione del filesystem

# mkreiserfs /dev/main/lv_home


  <----------- MKREISERFSv2 ----------->

   Block size 4096 bytes
   Block count 2097152
   Used blocks 8275
           Journal - 8192 blocks (18-8209), journal header is in block 8210
           Bitmaps: 17, 32768, 65536, 98304, 131072, 163840,
           196608, 229376, 262144, 294912, 327680, 360448,
           393216, 425984, 458752, 491520, 524288, 557056,
           589824, 622592, 655360, 688128, 720896, 753664,
           786432, 819200, 851968, 884736, 917504, 950272,
           983040, 1015808, 1048576, 1081344, 1114112,
           1146880, 1179648, 1212416, 1245184, 1277952,
           1310720, 1343488, 1376256, 1409024, 1441792,
           1474560, 1507328, 1540096, 1572864, 1605632,
           1638400, 1671168, 1703936, 1736704, 1769472,
           1802240, 1835008, 1867776, 1900544, 1933312,
           1966080, 1998848, 2031616, 2064384
   Root block 8211
Hash function "r5"
ATTENTION: ALL DATA WILL BE LOST ON '/dev/main/lv_home'! (y/n)y
journal size 8192 (from 18)
Initializing journal - 0%....20%....40%....60%....80%....100%
Syncing..done.

Una volta creato il filesystem, è possibile montarlo su /mnt/newhome:

Codice 1.9: Montare il nuovo volume

# mkdir /mnt/newhome
# mount /dev/main/lv_home /mnt/newhome
# df
Filesystem           1k-blocks      Used Available Use% Mounted on
/dev/hda3              9765200   6989840   2775360  72% /
tmpfs                   291388         0    291388   0% /dev/shm
/dev/main/lv_home      8388348     32840   8355508   1% /mnt/newhome

Come è stato possibile vedere prima, tutto è quasi pronto per copiare sopra tutti i dati in /home. Prima di cominciare, è meglio passare al runlevel 1 per assicurarsi che nessun utente o processo voglia accedere o modificare file in /home mentre vengono copiati:

Codice 1.10: Passare al runlevel 1

# init 1

A questo punto, comincia la copia dei file:

Codice 1.11: Copiare i file nella nuova cartella

# cp -avx /home/* /mnt/newhome

Nel caso in esempio, la copia è stata completate in circa dieci minuti. Quindi, è stata fatta una copia di backup dell'originale cartella /home in /home.old, nel caso in cui qualcosa sia andato storto durante la copia. È stato poi creato un nuovo punto di montaggio, e rimontata la nuova home su /home:

Codice 1.12: Il nuovo punto di montaggio

# cd /
# mv home home.old
# mkdir home
# umount /mnt/newhome
# mount /dev/main/lv_home /home

Adesso, è arrivato il momento di mettere a punto il server così che la nuova partizione /home possa risultare disponibile ogni volta che la macchina viene avviata. Prima di tutto, deve essere modificato il file /etc/fstab così da includere l'opzione /home:

Codice 1.13: Modificare fstab


#fs                 mountpoint       type         opts          dump/pass
/dev/hda3           /                reiserfs     defaults      1 1
/dev/main/lv_home   /home            reiserfs     defaults      2 2
/dev/hda2           none             swap         sw            0 0
/dev/hda1           /boot            reiserfs     noauto        0 0
/dev/cdrom          /mnt/cdrom       iso9660      noauto,ro     0 0
proc                /proc            proc         defaults      0 0
none                /dev/pts         devpts       mode=620      0 0
tmpfs               /dev/shm         tmpfs        defaults      0 0

In seguito, vanno apportate modifiche minori agli script di inizializzazione. Questo si ottiene modificando lo script d'avvio "checkroot" così che il seguente comando possa essere eseguito immediatamente dopo che la partizione di root è stata ri-montata in lettura/scrittura:

Codice 1.14: Modificare lo script d'avvio

/sbin/vgscan
/sbin/vgchange -a y

Ancora, deve essere modificato lo script per smontare i filesystem che viene chiamato allo spegnimento, così che il seguente comando possa essere eseguito immediatamente dopo che tutti i filesystem sono stati smontati:

Codice 1.15: Modificare lo script di spegnimento

/sbin/vgchange -a n

Una volta completati questi passi, basta riavviare la macchina, e notare con piacere che tutto funziona perfettamente. Dopo un giorno o più senza alcun problema, potrà essere cancellata /home.old per liberare un po' di spazio sul filesystem di root. Il passaggio a LVM è avvenuto con successo.

La bellezza di LVM

Mentre la transizione a LVM non la si può definire banale, una volta che il passaggio è completo, gestire i filesystem diventa tremendamente facile. Per fare un esempio, l'autore ha deciso di ridimensionare il proprio volume logico su /home, aggiungendo circa 2 gigabytes ulteriori di spazio alla fine del filesystem. Per prima cosa, ha aggiunto capacità addizionale al proprio volume logico "lv_home", e poi ha usato il programma resize_reiserfs per espandere il filesystem così che potesse usare questa capacità addizionale. Di seguito i due comandi che permettono tutto questo:

Codice 1.16: Usare spazio aggiuntivo

# lvextend -L+2G /dev/main/lv_home
# resize_reiserfs -f /dev/main/lv_home

Nell'arco di circa un secondo, il filesystem su /home è stato allargato di 2 GB; sorprendentemente, non c'è stato bisogno di riavviare, passare al runlevel 1, o anche smontare /home per effettuare il ridimensionamento. Tutto ha continuato a funzionare come aveva fatto prima. Non è fantastico? Di seguito lo stato attuale del filesystem, dopo l'operazione:

Codice 1.17: Spazio sul filesystem

# df
Filesystem           1k-blocks      Used Available Use% Mounted on
/dev/hda3              9765200   1413340   8351860  15% /
/dev/main/lv_home     10485436   5609836   4875600  54% /home

È possibile scoprire come LVM può realmente rendere il lavoro di un amministratore di gran lunga più facile. Nel futuro, c'è la speranza di poter muovere parti addizionali del filesystem di root su LVM, ed eventualmente anche convertire il filesystem di root all'interno di un volume logico su LVM. Le risorse seguenti aiuteranno ad apprendere altro ancora riguardo a LVM.

Risorse

  • Per i concetti relativi a LVM e consigli su come recuperare le ultime patch per il kernel e avere gli strumenti sul proprio sistema, si veda l'articolo precedente, Imparare Linux LVM, Parte 1.
  • Collegamento all'archivio LVM su RedHat.
  • Gli impazienti vorranno dare un'occhiata all'LVM HOWTO di Heinz Mauelshagen, che contiene diversi esempi su come impostare gruppi di volume e volumi logici.
  • Esiste anche un interessante HOWTO che mostra all'utente come impostare il proprio filesystem di root su un volume logico. Una volta che LVM-0.9.1_final sarà rilasciato, l'autore potrebbe provare a farlo.
  • Andreas Dilger è coinvolto con il progetto Linux LVM e possiede un ben fatto ridimensionatore di filesystem ext2 online.
  • ReiserFS è un eccellente filesystem (specialmente in combinazione con LVM). Se si sta usando ReiserFS, si vorrà prelevare l'archivio reiserfs-utils, che contiene un programma chiamato reiserfs_resize -- permette il ridimensionamento al volo del filesystem ReiserFS.
  • Per maggiori informazioni su come impostare volumi per il RAID software in Linux, vedere la Parte 1 e la Parte 2 della serie di Daniel sul RAID software.
  • Per un ripasso, vedere il tutorial su come compilare il kernel Linux di Daniel.


Stampa

Aggiornato il 22 gennaio 2006

Oggetto: In questo articolo, Daniel condivide col lettore l'esperienza avuta spostando il filesystem in /home su cvs.gentoo.org in un volume logico LVM. Dopo il cambiamento, sono stati osservati i benefici di LVM quando la partizione in cui risiede /home su cvs.gentoo.org viene dinamicamente ridimensionata in tempo reale, senza riavviare, smontare /home, o addirittura passare al runlevel 1. Tutti i processi continuano a lavorare senza interruzioni. L'analisi dettagliata passo passo di Daniel riguardo alla conversione aiuterà chiunque sia interessato nel mettere in pratica una transizione simile sulla propria macchina.

Daniel Robbins
Autore

Michele Caini
Traduzione

Donate to support our development efforts.

Copyright 2001-2014 Gentoo Foundation, Inc. Questions, Comments? Contact us.