Repository 32bit  Forum
Repository 64bit  Wiki

Slackware LVM2 HOWTO: differenze tra le versioni

Da Slacky.eu.
(Recupero della vecchia Partizione)
m (Nozioni Fondamentali)
 
(12 revisioni intermedie di un utente non mostrate)
Riga 44: Riga 44:
Storicamente, ridimensionare partizioni o aggiungere nuovi dischi ad un sistema già configurato è funzionante sono sempre state operazioni macchinose e problematiche, spesso con risultati deludenti. LVM permette di eseguire queste ed altre operazioni in modo semplice ed efficiente.
Storicamente, ridimensionare partizioni o aggiungere nuovi dischi ad un sistema già configurato è funzionante sono sempre state operazioni macchinose e problematiche, spesso con risultati deludenti. LVM permette di eseguire queste ed altre operazioni in modo semplice ed efficiente.
Alcune distribuzioni (RedHat, Mandrake, Suse) offrono la possibilità di installare l'intero sistema in LVM a partire dalla prima installazione tramite il software di Setup. Purtroppo questo non accade con Slackware Linux, che pur supportandolo a livello Kernel non ci fornisce nessuna "facilities" per configurare il sistema per l'utilizzo di LVM.
+
Alcune distribuzioni (RedHat, Mandrake, Suse) offrono la possibilità di installare l'intero sistema in LVM a partire dalla prima installazione tramite il software di Setup. Questo non accade con Slackware Linux, che pur supportandolo a livello Kernel non ci fornisce nessuna "facilities" per configurare il sistema per l'utilizzo di LVM, fornendo però tutti gli strumenti per poterlo fare manualmente nel pieno rispetto della filosofia della distribuzione.
Questa guida ha il duplice scopo tanto di comprendere il funzionamento di LVM, quando di permettere di utilizzarlo con efficienza sulla ''distribuzione con la pipa'' ad ogni livello. Vedremo quindi come integrare LVM in un sistema Slackware già avviato e funzionante senza alterare il root filesistem (/), come migrare un sistema non LVM in uno LVM e come installare Slackware fin da subito su storage configurati per LVM.
Questa guida ha il duplice scopo tanto di comprendere il funzionamento di LVM, quando di permettere di utilizzarlo con efficienza sulla ''distribuzione con la pipa'' ad ogni livello. Vedremo quindi come integrare LVM in un sistema Slackware già avviato e funzionante senza alterare il root filesistem (/), come migrare un sistema non LVM in uno LVM e come installare Slackware fin da subito su storage configurati per LVM.
Riga 152: Riga 152:
E' consigliabile, come da esempio, compilare tutto staticamente. In questo modo è possibile eliminare eventuali possibilità d'errore dovute al mancato caricamento dei moduli. Il kernel di default di Slackware utilizza LVM staticamente, per cui non è necessario alterarne la configurazione.
E' consigliabile, come da esempio, compilare tutto staticamente. In questo modo è possibile eliminare eventuali possibilità d'errore dovute al mancato caricamento dei moduli. Il kernel di default di Slackware utilizza LVM staticamente, per cui non è necessario alterarne la configurazione.
  +
  +
Se si desidera utilizzare la partizione root (/) su una partizione LVM, è bene anche assicurarsi che le opzioni sull'initrd siano attivate nel modo seguente, sotto '''General Setup'''
  +
  +
[*] Initial RAM filesystem and RAM disk (initramfs/initrd) support
  +
() Initramfs source file(s)
  +
  +
Inoltre, è bene assicurarsi che siano compilati staticamente all'interno del kernel il supporto al proprio controller IDE/SATA/SCSI e tutto ciò che serve per farli funzionare. Stesso discorso per il supporto ai filesystem che intendiamo utilizzare, fra cui sicuramente ext2 per la partizione di boot (vedi oltre).
=Partizionamento dei dischi=
=Partizionamento dei dischi=
Come detto precedentemente, LVM è in gradi di lavorare con dischi interi non partizionati.
+
Come detto precedentemente, LVM è in grado di lavorare con dischi interi non partizionati.
Considerato però che difficilmente si avranno dischi privi di partizioni (ad esempio per la necessità di creare quantomeno la partizione di swap) e che l'assenza di partizioni, per quanto non dia problemi ad LVM può dare seri problemi ad altri sistemi operativi od anche solo confonderci, dato che è molto facile scambiare un disco non partizionato per un disco vuoto, ne consegue che è necessaria una buona conoscenza dei tool di partizionamento, nonché acquisire qualche nozione fondamentale sulle partizioni.
Considerato però che difficilmente si avranno dischi privi di partizioni (ad esempio per la necessità di creare quantomeno la partizione di swap) e che l'assenza di partizioni, per quanto non dia problemi ad LVM può dare seri problemi ad altri sistemi operativi od anche solo confonderci, dato che è molto facile scambiare un disco non partizionato per un disco vuoto, ne consegue che è necessaria una buona conoscenza dei tool di partizionamento, nonché acquisire qualche nozione fondamentale sulle partizioni.
Riga 165: Riga 172:
Secondo lo schema di partizionamento PC-BIOS (quello usato da Linux, Windows e la maggior parte dei sistemi PC-compatibili), ogni hard disk può contenere massimo 4 partizioni principali, o primarie.
Secondo lo schema di partizionamento PC-BIOS (quello usato da Linux, Windows e la maggior parte dei sistemi PC-compatibili), ogni hard disk può contenere massimo 4 partizioni principali, o primarie.
Ad ogni partizione può essere associato un "tipo" secondo lo schema che è possibile trovare sul [http://www.win.tue.nl/~aeb/partitions/partition_types-1.html sito di Andries Brouwer]. Lo scopo del tipo è unicamente quello di permettere la visualizzazione o meno della partizione ai vari sistemi operativi, indipendentemente dal filesystem in esso utilizzato. Questo significa che, anche se una partizione è marchiata come "Linux", teoricamente sarebbe possibile formattarla come NTFS, in quanto il tipo è solo un "etichetta", non ne determina nessuna caratteristica particolare. Questo non è però possibile, poiché dal momento in cui Windows vede la partizione marchiata come Linux semplicemente la ignora (o peggio la riconosce come corrotta, ed inizia a manifestare strani sintomi allergici).
+
Ad ogni partizione può essere associato un "tipo" secondo lo schema che è possibile trovare sul [http://www.win.tue.nl/~aeb/partitions/partition_types-1.html sito di Andries Brouwer]. Lo scopo del tipo è unicamente quello di permettere la visualizzazione o meno della partizione ai vari sistemi operativi, indipendentemente dal filesystem in esso utilizzato. Questo significa che, anche se una partizione è marchiata come "Linux", teoricamente sarebbe possibile formattarla come NTFS, in quanto il tipo è solo un "etichetta", non ne determina nessuna caratteristica particolare. Questo non è però praticamente realizzabile nell'esempio specifico, poiché dal momento in cui Windows vede la partizione marchiata come Linux semplicemente la ignora (o peggio la riconosce come corrotta, ed inizia a manifestare strani sintomi allergici).
Senza scendere eccessivamente nel dettaglio sulle motivazioni per cui è possibile avere massimo 4 partizioni primarie su un hard disk, è palese che 4 è un numero veramente ridotto e limitativo.
Senza scendere eccessivamente nel dettaglio sulle motivazioni per cui è possibile avere massimo 4 partizioni primarie su un hard disk, è palese che 4 è un numero veramente ridotto e limitativo.
Riga 449: Riga 456:
* '''Comandi per la gestione dei gruppi di volumi (VG)'''
* '''Comandi per la gestione dei gruppi di volumi (VG)'''
** ''vgscan'' - cerca VG esistenti all'interno dei dischi fisici. con l'opzione speciale --mknodes, aggiorna il contenuto di /dev in modo da riflettere l'effettivo stato del sistema.
** ''vgscan'' - cerca VG esistenti all'interno dei dischi fisici. con l'opzione speciale --mknodes, aggiorna il contenuto di /dev in modo da riflettere l'effettivo stato del sistema.
** ''vgcreate'' - permette di cerare un VG sulla base di un PV
+
** ''vgcreate'' - permette di creare un VG sulla base di un PV
** ''vgdisplay'' - permette di visualizzare le informazioni su un LV
** ''vgdisplay'' - permette di visualizzare le informazioni su un LV
** ''vgextend'' - permette di aggiungere PV ad un VG
** ''vgextend'' - permette di aggiungere PV ad un VG
Riga 466: Riga 473:
Lo scenario più semplice è senza dubbio quello in cui si vuole aggiungere una partizione gestita con LVM all'interno di un filesystem funzionante, ad esempio in sostituzione della directory che contiene le home degli utenti (/home).
Lo scenario più semplice è senza dubbio quello in cui si vuole aggiungere una partizione gestita con LVM all'interno di un filesystem funzionante, ad esempio in sostituzione della directory che contiene le home degli utenti (/home).
  +
  +
===Schema di partizionamento===
Prenderemo come base lo schema di partizionamento della sezione su fdisk, quindi:
Prenderemo come base lo schema di partizionamento della sezione su fdisk, quindi:
Riga 476: Riga 485:
dove /dev/hda4 è la partizione che vogliamo usare per la nuova /home.
dove /dev/hda4 è la partizione che vogliamo usare per la nuova /home.
  +
  +
===Creazione del PV (Volume Fisico)===
Procediamo quindi alla creazione del PV:
Procediamo quindi alla creazione del PV:
Riga 497: Riga 508:
Come possiamo vedere, per il momento il PV è inerte, non utilizzabile poiché non associato a nessun VG.
Come possiamo vedere, per il momento il PV è inerte, non utilizzabile poiché non associato a nessun VG.
  +
  +
===Crazione del VG (Gruppo di Volumi)===
Procediamo quindi alla creazione del VG, che chiameremo "vgtest":
Procediamo quindi alla creazione del VG, che chiameremo "vgtest":
Riga 550: Riga 563:
Come potete vedere, LVM visualizza le informazioni tanto in Extents (PE o LE, a seconda del caso), quando in spazio "human readable". Questo perché in fase di creazione dei LV, è possibile utilizzare tanto la prima quanto la seconda forma per specificare le dimensioni.
Come potete vedere, LVM visualizza le informazioni tanto in Extents (PE o LE, a seconda del caso), quando in spazio "human readable". Questo perché in fase di creazione dei LV, è possibile utilizzare tanto la prima quanto la seconda forma per specificare le dimensioni.
  +
  +
===Creazione del LV (Volume Logico)===
A questo punto, è possibile procedere alla creazione del LV dentro vgtest, che chiameremo "newhome":
A questo punto, è possibile procedere alla creazione del LV dentro vgtest, che chiameremo "newhome":
Riga 613: Riga 628:
Block device 253:1
Block device 253:1
Tutto è andato per il meglio! A questo punto, è possibile formattare la partizione con il filesystem che preferiamo.
+
Tutto è andato per il meglio!
  +
  +
===Formattazione e montaggio del LV===
  +
  +
A questo punto, è possibile formattare la partizione con il filesystem che preferiamo.
Ad esempio, per formattare la partizione con il filesystem ext3, digitiamo:
Ad esempio, per formattare la partizione con il filesystem ext3, digitiamo:
Riga 647: Riga 662:
Oppure effettuare una migrazione completa dei dati.
Oppure effettuare una migrazione completa dei dati.
  +
  +
===Migrazione dei dati nella nuova partizione===
A tal scopo, dobbiamo innanzitutto montare il filesystem in una cartella temporanea, allo scopo di copiare i dati presenti nella home attuale
A tal scopo, dobbiamo innanzitutto montare il filesystem in una cartella temporanea, allo scopo di copiare i dati presenti nella home attuale
Riga 779: Riga 796:
* '''-c''' - pulisce l'albero dei file di initrd nel caso esista, in modo da partire con un nuovo albero
* '''-c''' - pulisce l'albero dei file di initrd nel caso esista, in modo da partire con un nuovo albero
* '''-L''' - attiva il supporto ad LV
+
* '''-L''' - attiva il supporto ad LVM
* '''-r''' - specifica quale partizione andrà usata come root (/)
* '''-r''' - specifica quale partizione andrà usata come root (/)
* '''-f''' - specifica il tipo di filesystem da usare per la partizione di root
* '''-f''' - specifica il tipo di filesystem da usare per la partizione di root
Riga 891: Riga 908:
a questo punto, possiamo inizializzare la vecchia partizione con LVM ed aggiungerla al LV principale, in modo da recuperarne lo spazio
a questo punto, possiamo inizializzare la vecchia partizione con LVM ed aggiungerla al LV principale, in modo da recuperarne lo spazio
====Recupero della vecchia Partizione====
+
====Recupero della vecchia partizione====
Innanzitutto, dobbiamo inizializzare la vecchia partizione con LVM, per cui procediamo come al solito con pvcreate
Innanzitutto, dobbiamo inizializzare la vecchia partizione con LVM, per cui procediamo come al solito con pvcreate
Riga 1 025: Riga 1 042:
mount -t proc proc /mnt/proc
mount -t proc proc /mnt/proc
mount -t sysfs sys /mnt/sys
+
mount -t sysfs sysfs /mnt/sys
a questo punto, tramite il comando "chroot" è possibile "imbrogliare" la shell e fargli credere che la nostra root non comincia dalla sua posizione reale attuale, ma dal mountpoint di /dev/myvg/mylv
a questo punto, tramite il comando "chroot" è possibile "imbrogliare" la shell e fargli credere che la nostra root non comincia dalla sua posizione reale attuale, ma dal mountpoint di /dev/myvg/mylv

Versione attuale delle 13:01, 18 nov 2007


Indice

[modifica] Disclaimer

L'autore di questa guida, i suoi collaboratori e slacky.eu non si riterranno responsabili di eventuali danni provocati al vostro computer.

[modifica] Prerequisiti

Questa guida usa come riferimento la distribuzione Slackware GNU/Linux 12.0. I principi in essa esposti comunque sono applicabili a qualsiasi distribuzione GNU/Linux.

Ovviamente, per poter avere successo nell'operazione, è necessario avere una buona conoscenza della distribuzione, una buona padronanza dei comandi di base e della procedura di configurazione e compilazione del Kernel. Per quanto riguarda Slackware, consultare la pagina Compilazione e ricompilazione Kernel su Slackware di questa stessa Wiki.

Per compiere gran parte delle operazioni (o per recuperare il sistema in caso di errore) sarà necessario avere a disposizione il primo CD d'installazione di Slackware Linux (o il DVD), reperibili dal sito ufficiale Slackware.

Si consiglia caldamente:

  • di leggere ogni singola parte di questo manuale, anche quelle ritenute inutili. Ogni sezione contiene informazioni preziose che possono fare la differenza.
  • di stampare la guida prima di procedere al suo utilizzo. In questo modo, se modificando il kernel o lilo si dovessero commettere degli errori, si potrà comunque avere accesso alle informazioni utili a recuperare l'utilizzo del sistema. Questo è molto utile inoltre considerato che parte delle operazioni descritte in questa guida richiederanno il riavvio della macchina.
  • di conservare sempre un kernel configurato e funzionante, aggiungendo il kernel modificato (nel caso sia necessario) come kernel aggiuntivo ed opzionale, per lo stesso motivo di cui sopra.

Nel corso di questa guida, verranno modificati una serie di file configurazione vitali per il funzionamento della propria distribuzione, per questo motivo, è cosa saggia effettuare una copia di backup di ognuno di questi file.

Nello specifico, modificheremo:

  • il file /etc/fstab, responsabile della configurazione dei mountpoint a filesystem fisici e virtuali
cp /etc/fstab /home/home_utente/fstab.backup
  • il kernel
cp /usr/src/linux/.config /home/home_utente/config.backup
  • il file di configurazione di lilo
cp /etc/lilo.conf /home/home_utente/lilo.conf.backup

E' consigliabile anche effettuare un backup dei dati sensibili e della configurazione di sistema, nell'ipotesi che durante una delle operazioni i filesystem oggetto dovessero corrompersi.

[modifica] Introduzione

LVM è un acronimo che sta per "Logical Volume Manager". Come da howto ufficiale, LVM fornisce una visione "ad alto livello" (cioè slegata dall'effettiva configurazione fisica) delle partizioni e dei dischi presenti in un sistema. Lo scopo è permettere una maggiore flessibilità nell'utilizzo dello spazio di storage, permettendone più agevolmente la riorganizzazione indipendentemente dall'allocazione fisica.

Storicamente, ridimensionare partizioni o aggiungere nuovi dischi ad un sistema già configurato è funzionante sono sempre state operazioni macchinose e problematiche, spesso con risultati deludenti. LVM permette di eseguire queste ed altre operazioni in modo semplice ed efficiente.

Alcune distribuzioni (RedHat, Mandrake, Suse) offrono la possibilità di installare l'intero sistema in LVM a partire dalla prima installazione tramite il software di Setup. Questo non accade con Slackware Linux, che pur supportandolo a livello Kernel non ci fornisce nessuna "facilities" per configurare il sistema per l'utilizzo di LVM, fornendo però tutti gli strumenti per poterlo fare manualmente nel pieno rispetto della filosofia della distribuzione.

Questa guida ha il duplice scopo tanto di comprendere il funzionamento di LVM, quando di permettere di utilizzarlo con efficienza sulla distribuzione con la pipa ad ogni livello. Vedremo quindi come integrare LVM in un sistema Slackware già avviato e funzionante senza alterare il root filesistem (/), come migrare un sistema non LVM in uno LVM e come installare Slackware fin da subito su storage configurati per LVM.

[modifica] Lo scenario standard

In un sistema normale, i dispositivi di storage sono normalmente uno o più hard disk collegati alla stessa macchina. Perché i sistemi operativi possano utilizzare lo spazio a disposizione sui dischi disponibili, è necessario quantomeno eseguire due operazioni:

  • creare una o più partizioni
  • formattare le partizioni

si può pensare all'operazione di partizionamento come alla suddivisione logica di uno spazio fisico. In pratica, si andranno a definire uno o più spazi "geometrici" al cui interno il sistema operativo potrà immagazzinare i dati. Se un disco fosse un edificio, le partizioni sarebbero gli appartamenti. L'utilità delle partizioni risiede nel fatto che si possono creare spazi differenti all'interno dello stesso dispositivo fisico per usi e consumi diversi, magari addirittura per sistemi operativi differenti, impostando limiti fisici che non possono essere prevaricati. Anche nel caso in cui non si desideri suddividere un hard disk in più parti, è normalmente necessario comunque creare una partizione che ne occupi la sua totalità perché i sistemi operativi possano farne uso, dato che normalmente non possono lavorare al di fuori delle partizioni. Ogni partizione può avere differenti caratteristiche. Senza scendere troppo in dettagli tecnici, si può dire che ogni partizione ha, quantomeno, un punto d'inizio ed un punto di fine. Inoltre, ogni partizione ha un tipo, definito tramite un codice numerico. Tipi comuni di partizioni possono essere "Linux", "Linux Swap", "NTFS/HPFS", etc. L'alterazione delle partizioni è, in se, un operazione non distruttiva. Questo significa che ripristinando al loro stato originale tabelle di partizioni alterate o corrotte, è possibile recuperare i dati in esse contenuti, se nel mentre non ne è stato modificato o corrotto il contenuto.

Perché un sistema operativo possa utilizzare una partizione, non basta crearla. E' necessario anche creare un filesystem all'interno della partizione stessa, operazione comunemente detta "formattazione" (dato che uno degli effetti secondari della formattazione è la cancellazione dei dati contenuti nella partizione stessa, è errore comune pensare che formattare significhi cancellare i dati). Per filesystem s'intende un metodo di memorizzazione ed ordinamento dei dati. Il tipo di filesystem utilizzato determina un insieme di fattori, quali lo spazio effettivo che potrà essere utilizzato della partizione, le prestazioni, l'affidabilità in caso di crash, le features e via dicendo. Il tipo di filesystem che è possibile utilizzare dipende dal sistema operativo. Ben pochi sistemi operativi supportano così tanti tipi di filesystem diversi quanto il kernel linux. Tipi comuni di Filesystem possono essere ext2, ext3, reiserfs, ntfs, etc.

In un computer in cui è installato linux, non è inusuale avere gli hard disk suddivisi in numerose partizioni, con più di un filesystem in uso. Questo accade per diversi motivi.

La necessità di avere più di una partizione nasce dal fatto che, determinati dati, come ad esempio i file necessari al boot, è preferibile scriverli con filesystem meno evoluti e più supportati dai bootloader (ext2 e lilo, solitamente). Altri dati, come il sistema operativo stesso ad esempio, è preferibile invece scriverli con un filesystem più performante e che resista meglio ad eventuali perdite di dati (ext3 o reiserfs, solitamente). Un altro motivo può essere semplicemente che si vogliano separare i file personali degli utenti o i file temporanei dal resto del sistema. Quantomeno, è necessario avere una partizione per lo swap, dato che linux scrive le informazioni di swap su una partizione a parte. Per questo motivo, quasi certamente si avranno almeno due o tre partizioni sugli hard disk in uso su linux.

I problemi iniziano a sorgere nel momento in cui si desidera cambiare le dimensioni di queste partizioni, o aggiungerne di nuove. Per la loro stessa natura, le partizioni in un sistema standard sono abbastanza "rigide", in quanto al fine di usare appieno lo spazio a disposizione con ogni probabilità saranno state create con gli spazi adiacenti, magari in modo che occupino l'intera superficie del disco. Per cui, per effettuare operazioni di ridimensionamento o creazione è necessario usare tool appositi che effettuano numerose procedure, nell'ordine:

  • ridimensionare il filesystem in modo che non occupi tutta la partizione a lui assegnata, eventualmente deframmentandone i dati
  • cambiare la dimensione della partizione in modo da liberare spazio sul dispositivo
  • spostare le partizioni in modo che siano nuovamente adiacenti

effettuando verifiche, simulazioni, etc. Questo processo è spesso molto lento ed ogni genere d'imprevisto può succedere nel mentre, causando nello scenario peggiore la perdita dei dati.

[modifica] Lo scenario LVM

LVM si pone fra il sistema operativo e la sua visione delle partizioni fisiche. In pratica, il sistema operativo non userà più direttamente le partizioni fisiche reali, ma quelle fittizie create da LVM, i cosiddetti "Volumi Logici" (Logical Volume, LV).

I volumi logici, a loro volta, verranno creati all'interno dei cosiddeti "Gruppi di Volumi" (Volume Group, VG) il cui scopo è raggruppare uno o più "Volumi Fisici" (Phisical Volume, PV), che poi altro non sono che i dischi fisici o le partizioni esistenti al loro interno inizializzati per l'uso con LVM.

Quindi, ricapitolando, normalmente il sistema operativo usa partizioni fisiche create all'interno di dischi fisici. Con LVM il sistema operativo userà Volumi Logici creati all'interno di Gruppi di Volumi. I Gruppi di Volumi vengono creati con uno o più Volumi Fisici, ossia partizioni e/o dischi fisici.

Volendo schematizzare lo scenario standard, avremo una situazione di questo tipo:

Disco Fisico -> partizione -> filesystem

nello scenario LVM, invece, avremo:

Disco Fisico -> partizione (PV) -> Gruppo (VG) -> Volume Logico (LV)-> Filesystem

oppure, considerato che LVM può gestire i dischi senza che vi siano partizioni al loro interno:

Disco Fisico (PV) -> Gruppo (VG) -> Volume Logico (LV)-> Filesystem

Precedentemente abbiamo detto che per poter gestire lo spazio su un disco un sistema operativo necessita sempre e comunque di una partizione. Con LVM questo non è necessario in quanto il sistema operativo non lavorerà con il disco o le partizioni fisiche, ma con i volumi logici, che lui vedrà esattamente come vede normalmente le partizioni.

A che scopo quindi creare un gruppo di volumi, se alla fine il sistema operativo dialoga principalmente con i volumi logici? Il motivo è che i gruppi di volumi permettono di unire in un unico spazio virtuale differenti spazi fisici, che poi possono essere usati nella loro interezza per creare volumi logici.

Per fare un esempio concreto, supponiamo di avere due Hard Disk da 200gbyte installati in un sistema tipo. In uno scenario standard, dovremo creare due partizioni separate su entrambi gli hard disk, formattarle entrambe e quindi montarle in differenti mountpoint del nostro filesystem, ad esempio una per il root filesystem (/) ed una per le cartelle degli utenti (/homes). Le limitazioni di questa soluzione appaiono subito evidenti, in quanto difficilmente useremo tutti i 200 gbyte del primo disco per il sistema operativo, mentre è molto facile che i 200 gbyte del secondo disco non bastino per i dati degli utenti.

Con LVM possiamo unire il primo ed il secondo disco in un unico Volume Group da 400gbyte, quindi al suo interno creare due partizioni logiche, una per il root filesystem (/) da 20 gbyte ed una per le home degli utenti (/home) con lo spazio restante. Sarà LVM a gestire la memorizzazione dei dati distribuendola sui due differenti hard disk, senza che il sistema operativo ne abbia sentore alcuno.

In realtà LVM può fare molto altro ancora e può essere usato in un milione di modi diversi, lo scopo di questo esempio era solo quello di comprendere la natura e le potenzialità dei Volume Group e di LVM.

Prima di proseguire, riassumiamo i termini LVM che useremo nel resto della guida

  • PV, Phisical Volume - una partizione od un disco fisico inizializzati per l'uso con LVM.
  • VG, Volume Group - uno o più PV uniti a formare un unico spazio per la creazione di LV.
  • LV, Logical Volume - il sostituto delle partizioni, al cui interno viene creato il filesystem.
  • PE, Physical Extent - il blocco dati in cui LVM suddivide, per propria utilità, i volumi fisici. Ha la stessa dimensione dei LE.
  • LE, Logical Extent - il blocco dati in cui LVM suddivide i volumi logici.

[modifica] LVM1 ed LVM2

Esistono due versioni di LVM attualmente disponibili per Linux.

LVM2 è l'ultima e migliore versione disponibile, retro compatibile con LVM1 quasi in ogni sua parte, distribuito di default con la serie 2.6 del kernel (per quanto esistano patch per attivare il supporto nella serie 2.4).

LVM1 è la vecchia versione, distribuita di default con i kernel di serie 2.4.

Non esiste un reale motivo per preferire LVM1, pertanto in questa guida faremo riferimento ad LVM2.

[modifica] Configurazione del Kernel

Il punto di partenza consiste quindi nel disporre di un sistema con Kernel 2.6.x con supporto LVM2 compilato.

Slackware 12 viene fornita di default con un kernel 2.6 con supporto LVM2, con tutti i tool necessari al suo utilizzo, quindi non è richiesta l'installazione di software aggiuntivi. Nel caso non si stia usando il kernel standard, è necessario verificare che le dovute opzioni siano attivate ed eventualmente ricompilare il kernel.

Le opzioni richieste si trvano sotto Device Drivers --> Multi-device support (RAID and LVM)

[*] Multiple devices driver support (RAID and LVM)
    <*>   Device mapper support
    [ ]     Device mapper debugging support

Volendo, è possibile abilitare anche le opzioni aggiuntive

    <*>     Crypt target support
    <*>     Snapshot target (EXPERIMENTAL)
    <*>     Mirror target (EXPERIMENTAL)
    <*>     Zero target (EXPERIMENTAL)
    <*>     Multipath target (EXPERIMENTAL)
    <*>       EMC CX/AX multipath support (EXPERIMENTAL)
    <*>     I/O delaying target (EXPERIMENTAL)

E' consigliabile, come da esempio, compilare tutto staticamente. In questo modo è possibile eliminare eventuali possibilità d'errore dovute al mancato caricamento dei moduli. Il kernel di default di Slackware utilizza LVM staticamente, per cui non è necessario alterarne la configurazione.

Se si desidera utilizzare la partizione root (/) su una partizione LVM, è bene anche assicurarsi che le opzioni sull'initrd siano attivate nel modo seguente, sotto General Setup

[*] Initial RAM filesystem and RAM disk (initramfs/initrd) support 
()    Initramfs source file(s)      

Inoltre, è bene assicurarsi che siano compilati staticamente all'interno del kernel il supporto al proprio controller IDE/SATA/SCSI e tutto ciò che serve per farli funzionare. Stesso discorso per il supporto ai filesystem che intendiamo utilizzare, fra cui sicuramente ext2 per la partizione di boot (vedi oltre).

[modifica] Partizionamento dei dischi

Come detto precedentemente, LVM è in grado di lavorare con dischi interi non partizionati. Considerato però che difficilmente si avranno dischi privi di partizioni (ad esempio per la necessità di creare quantomeno la partizione di swap) e che l'assenza di partizioni, per quanto non dia problemi ad LVM può dare seri problemi ad altri sistemi operativi od anche solo confonderci, dato che è molto facile scambiare un disco non partizionato per un disco vuoto, ne consegue che è necessaria una buona conoscenza dei tool di partizionamento, nonché acquisire qualche nozione fondamentale sulle partizioni.

[modifica] Nozioni Fondamentali

Come abbiamo detto, lo scopo delle partizioni è di suddividere logicamente in aree lo spazio fisico degli hard disk. Ogni partizione avrà determinate caratteristiche, come il suo punto d'inizio, il su punto di fine ed il tipo. Tutte queste informazioni vengono memorizzate all'interno della "Partition Table", un piccolo spazio presente nell'MBR degli hard disk. Lo scopo dell'MBR non è solo quello di contenere la Partition Table, ma anche di contenere le istruzioni necessarie ad avviare uno o più dei sistemi operativi presenti nelle partizioni (bootloader). A loro volta, le partizioni hanno un proprio MBR, chiamato "Volume Boot Record", il quale volendo può contenere a sua volta un altro bootloader. L'MBR (Master Boot Record) è il primo settore (settore 0) degli Hard Disk, della grandezza di 512 byte, così come il VBR è il primo settore delle partizioni.

Senza scendere troppo nel dettaglio, basti sapere gli hard disk sono suddivisi dal punto di vista hardware in tracce (o cilindri), facce e settori (CHS: Cylinder-Head-Sector), così come un asse cartesiano è diviso in coordinate X/Y.

Secondo lo schema di partizionamento PC-BIOS (quello usato da Linux, Windows e la maggior parte dei sistemi PC-compatibili), ogni hard disk può contenere massimo 4 partizioni principali, o primarie. Ad ogni partizione può essere associato un "tipo" secondo lo schema che è possibile trovare sul sito di Andries Brouwer. Lo scopo del tipo è unicamente quello di permettere la visualizzazione o meno della partizione ai vari sistemi operativi, indipendentemente dal filesystem in esso utilizzato. Questo significa che, anche se una partizione è marchiata come "Linux", teoricamente sarebbe possibile formattarla come NTFS, in quanto il tipo è solo un "etichetta", non ne determina nessuna caratteristica particolare. Questo non è però praticamente realizzabile nell'esempio specifico, poiché dal momento in cui Windows vede la partizione marchiata come Linux semplicemente la ignora (o peggio la riconosce come corrotta, ed inizia a manifestare strani sintomi allergici).

Senza scendere eccessivamente nel dettaglio sulle motivazioni per cui è possibile avere massimo 4 partizioni primarie su un hard disk, è palese che 4 è un numero veramente ridotto e limitativo.

Per ovviare a questo limite, il partizionamento di tipo PC-BIOS prevede la possibilità di creare una ed una soltanto partizione "estesa" al posto di una delle quattro partizioni primarie. La partizione estesa non può contenere dati in se, ma può a sua volta essere divisa in più partizioni "logiche", abbattendo così il limite delle 4 partizioni.

In un hard disk quindi potremo avere:

  • una o più partizioni primarie fino ad un massimo di quattro
  • una o più partizioni primarie fino ad un massimo di tre ed una partizione estesa, suddivisa in una o più partizioni logiche

E' buon costume avere almeno una partizione primaria all'interno di un disco, in quanto molti sistemi operativi/bootloader non sono in grado di avviarsi dall'interno di partizioni logiche.

A questo punto è possibile fare un piccolo "tour" dei principali tool disponibili, che quasi certamente dovremo utilizzare nel corso di questa guida.

[modifica] fdisk

fdisk è il più vecchio tool di configurazione disponibile nelle distribuzioni moderne. Per questo, oltre ad essere il più stabile ed affidabile, è anche quello con l'interfaccia meno amichevole. Basta poco comunque per impadronirsene e sicuramente il gioco vale la candela.

Con fdisk potremo solo ed unicamente modificare la tavola delle partizioni, NON il loro contenuto. Questo significa che se ridimensioniamo una partizione con fdisk senza prima modificare il filesystem in esso contenuto, con ogni probabilità non potremo più accedere ai dati, che diventeranno inaccessibili fino al ripristino della tavola delle partizioni originale. Pertanto, è bene utilizzare fdisk solo ed unicamente in contesti in cui dobbiamo creare, modificare o distruggere partizioni di cui non c'interessa il contenuto, come ad esempio nel caso di una prima installazione o nel caso in cui vogliamo liberarci di partizioni non più utilizzate.

Per avviare fdisk, usare la sintassi

fdisk /dev/DEVICE

dove per device intendiamo il dispositivo fisico che vogliamo partizionare. Quindi, ad esempio, per partizionare il primo disco IDE digiteremo:

fdisk /dev/hda

a questo punto fdisk visualizzerà un piccolo menù interattivo, con qualche avvertimento e qualche informazione

root@nuitari-laptop:~# fdisk /dev/hda

The number of cylinders for this disk is set to 9729.
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):

Possiamo tranquillamente ignorare l'avviso se disponiamo di un computer e di una versione di lilo sufficientemente recente. A questo punto, possiamo digitare uno qualsiasi dei comandi accettati da lilo. I più importanti sono i seguenti

  • p - visualizza la tavola delle partizioni, se presente
  • n - crea una nuova partizione
  • d - elimina una partizione esistente
  • t - cambia il tipo di una partizione
  • q - esce da fdisk senza salvare i cambiamenti
  • w - esce da fdisk salvando i cambiamenti

procediamo quindi con il visualizzare l'attuale tavola delle partizioni

Command (m for help): p

Disk /dev/hda: 80.0 GB, 80026361856 bytes
255 heads, 63 sectors/track, 9729 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/hda1   *           1        5099    40957686   8e  Linux LVM
/dev/hda2            5100        5224     1004062+  82  Linux swap
/dev/hda3            5225        5248      192780   83  Linux
/dev/hda4            5249        9729    35993632+   5  Extended
/dev/hda5            5249        9729    35993601    7  HPFS/NTFS

Le prime righe c'informano della dimensione e delle caratteristiche del nostro hard disk. Le informazioni utili al nostro scopo sono la dimensione (80.0 GB) ed il numero di cilindri (9729). fdisk usa il numero del cilindro per determinare dove inizia e dove finisce una partizione.

La successiva tabella ci mostra invece come è partizionato lo spazio sul nostro disco.

  • la colonna "Device" ci mostra con che nome/percorso Linux vede la partizione all'interno del nostro hard disk. La nomenclatura segue sempre una numerazione progressiva, per cui la prima partizione di /dev/hda sarà /dev/hda1, la seconda /dev/hda2 e via dicendo.
  • la colonna "Boot" ci dice se la partizione in questione ha il flag di bootabilità. Questo flag, che può essere assegnato ad una sola partizione primaria per disco, è utilizzato dal bootloader MS-DOS per determinare quale partizione avviare.
  • le colonne "Start" ed "End" mostrano il cilindro d'inizio e di fine delle varie partizioni. Sono considerabili come le coordinate geometriche delle partizioni. Possono essere utili, se salvate, per ripristinare partition table corrotte. In fase di creazione di partizioni nuove lilo supporta formati più umani per specificare le dimensioni. Volendo, digitando il comando u è possibile cambiare l'unità di misura in settori, un unità più precisa.
  • la colonna blocks mostra la dimensione della partizione in blocchi. La spiegazione di cosa è esattamente un blocco richiederebbe lunghe spiegazioni che esulano dal contesto. Diciamo solo che è un unità di misura usata da fdisk e da altri tool nel sistema per visualizzare lo spazio disponibile o totale di una partizione o di un filesystem, la cui dimensione è equivalente alla somma di due settori. Un settore è grande 512byte, per cui ogni blocco è genericamente grande 1024 byte, ossia 1k.
  • la colonna Id ci mostra con che tipo è stata etichettata la partizione [1]
  • la colonna System traduce la colonna Id in formato testuale, per nostra comodità.

Dall'esempio riportato, quindi, si può evincere quindi che il disco ha dimensione 80GB, che sono presenti 3 partizioni primarie, una partizione estesa ed una partizione logica all'interno dell'estesa.

Supponiamo ora di voler eliminare la partizione logica e quella estesa, una vecchia partizione windows, allo scopo di creare una nuova partizione da aggiungere al filesystem linux. Useremo il comando d.

Command (m for help): d
Partition number (1-5): 4

Command (m for help): p

Disk /dev/hda: 80.0 GB, 80026361856 bytes
255 heads, 63 sectors/track, 9729 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/hda1   *           1        5099    40957686   8e  Linux LVM
/dev/hda2            5100        5224     1004062+  82  Linux swap
/dev/hda3            5225        5248      192780   83  Linux

Come potete vedere dall'esempio, è stato sufficiente eliminare direttamente la partizione estesa. Le partizione logiche presenti al suo interno vengono eliminate automaticamente.

Procediamo ora a creare la nuova partizione. Useremo il comando n.

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Selected partition 4
First cylinder (5249-9729, default 5249):
Using default value 5249
Last cylinder or +size or +sizeM or +sizeK (5249-9729, default 9729):
Using default value 9729

Command (m for help): p

Disk /dev/hda: 80.0 GB, 80026361856 bytes
255 heads, 63 sectors/track, 9729 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/hda1   *           1        5099    40957686   8e  Linux LVM
/dev/hda2            5100        5224     1004062+  82  Linux swap
/dev/hda3            5225        5248      192780   83  Linux
/dev/hda4            5249        9729    35993632+  83  Linux

In questo esempio, la partizione creata è di tipo primaria, in quanto ho deciso che non mi servirà creare altre partizioni dopo di questa, per cui non c'era necessità di ricreare una partizione estesa. Una volta selezionato il tipo di partizione, fdsik chiede il cilindro da cui si vuol far partire la partizione. Di default, fdisk suggerirà il primo cilindro dello spazio disponibile, per cui come nel mio caso è sufficiente premere invio. Come secondo parametro, fdisk chiederà la dimensione della partizione che si vuole creare. Di default, fdisk proporrà come dimensione tutto lo spazio libero restante, per cui se si desidera che la partizione creata riempa tutto ciò che rimane dell'hard disk, è sufficiente premere invio. Se si desidera invece impostare una dimensione minore, è possibile digitare:

  • +size, dove size è il numero di blocchi. Ad esempio quindi digitare +1004062 per una partizione grande più o meno 100mbyte.
  • +sizeK, dove size è la dimensione in Kbyte. Considerato che un blocco equivale normalmente ad un K, questo parametro è molto simile al precedente.
  • +sizeM, dove size è la dimensione in MByte. Ad esempio quindi digitare +1000M per avere una partizione grande 1 Gbyte (si ricorda che 1GByte = 1000 Mbyte)

A questo punto, volendo, è possibile cambiare il tipo della partizione, di default impostato ad 83 (Linux). A questo scopo, useremo il comando t.

Command (m for help): t
Partition number (1-4): 4
Hex code (type L to list codes): L

 0  Empty           1e  Hidden W95 FAT1 80  Old Minix       be  Solaris boot
 1  FAT12           24  NEC DOS         81  Minix / old Lin bf  Solaris
 2  XENIX root      39  Plan 9          82  Linux swap      c1  DRDOS/sec (FAT-
 3  XENIX usr       3c  PartitionMagic  83  Linux           c4  DRDOS/sec (FAT-
 4  FAT16 <32M      40  Venix 80286     84  OS/2 hidden C:  c6  DRDOS/sec (FAT-
 5  Extended        41  PPC PReP Boot   85  Linux extended  c7  Syrinx
 6  FAT16           42  SFS             86  NTFS volume set da  Non-FS data
 7  HPFS/NTFS       4d  QNX4.x          87  NTFS volume set db  CP/M / CTOS / .
 8  AIX             4e  QNX4.x 2nd part 88  Linux plaintext de  Dell Utility
 9  AIX bootable    4f  QNX4.x 3rd part 8e  Linux LVM       df  BootIt
 a  OS/2 Boot Manag 50  OnTrack DM      93  Amoeba          e1  DOS access
 b  W95 FAT32       51  OnTrack DM6 Aux 94  Amoeba BBT      e3  DOS R/O
 c  W95 FAT32 (LBA) 52  CP/M            9f  BSD/OS          e4  SpeedStor
 e  W95 FAT16 (LBA) 53  OnTrack DM6 Aux a0  IBM Thinkpad hi eb  BeOS fs
 f  W95 Ext'd (LBA) 54  OnTrackDM6      a5  FreeBSD         ee  EFI GPT
10  OPUS            55  EZ-Drive        a6  OpenBSD         ef  EFI (FAT-12/16/
11  Hidden FAT12    56  Golden Bow      a7  NeXTSTEP        f0  Linux/PA-RISC b
12  Compaq diagnost 5c  Priam Edisk     a8  Darwin UFS      f1  SpeedStor
14  Hidden FAT16 <3 61  SpeedStor       a9  NetBSD          f4  SpeedStor
16  Hidden FAT16    63  GNU HURD or Sys ab  Darwin boot     f2  DOS secondary
17  Hidden HPFS/NTF 64  Novell Netware  b7  BSDI fs         fd  Linux raid auto
18  AST SmartSleep  65  Novell Netware  b8  BSDI swap       fe  LANstep
1b  Hidden W95 FAT3 70  DiskSecure Mult bb  Boot Wizard hid ff  BBT
1c  Hidden W95 FAT3 75  PC/IX
Hex code (type L to list codes): 8e
Changed system type of partition 4 to 8e (Linux LVM)

Command (m for help): p

Disk /dev/hda: 80.0 GB, 80026361856 bytes
255 heads, 63 sectors/track, 9729 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes 

   Device Boot      Start         End      Blocks   Id  System
/dev/hda1   *           1        5099    40957686   8e  Linux LVM
/dev/hda2            5100        5224     1004062+  82  Linux swap
/dev/hda3            5225        5248      192780   83  Linux
/dev/hda4            5249        9729    35993632+  8e  Linux LVM

Come si può vedere dall'esempio, fdisk innanzitutto chiede il numero della partizione che si desidera modificare, quindi chiede il codice del tipo che si vuole assegnare. E' possibile immettere L per avere un elenco dei tipi disponibili.

Nell'esempio si è scelto d'impostare LVM come tipo per la partizione. E' bene chiarire che NON è assolutamente sufficiente questo per rendere una partizione LVM, in quanto il tipo è solo un etichetta usata dai sistemi operativi per mostrare o nascondere le partizioni. Pertanto, potevamo benissimo lasciare come tipo 83 (Linux). Inoltre, è bene chiarire che essendo LVM un aggiunta abbastanza recente all'elenco dei tipi di partizioni, sistemi operativi non sufficientemente aggiornati potrebbero avere non pochi problemi a riconoscere il tipo della partizione. La decisione spetta a noi.

A questo punto, una volta partizionato l'hard disk, sarà possibile usare il comando w per uscire da fdisk salvando la tavola delle partizioni.

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table.
The new table will be used at the next reboot.
Syncing disks.
root@nuitari-laptop:~#

Come potete vedere, fdisk ha segnalato che non ha potuto accedere al disco in modo esclusivo, in quanto correntemente utilizzato. L'unico modo per evitare la visualizzazione di questo messaggio è usare fdisk all'interno di un sistema avviato da un disco differente, ad esempio dal CD-ROM/DVD d'installazione di Slackware. E' possibile comunque ignorare questo messaggio, in quanto trattasi di un semplice WARNING. Gli WARNING in generale servono a segnalare problemi potenzialmente pericolosi ma gestiti. Nella fattispecie, questo WARNING ci avvisa che non è stato possibile rileggere la tavola delle partizioni dopo la modifica, per cui è necessario riavviare il sistema per far si che il kernel le "veda".

Quello trattato in questo capitolo è solo un esempio, ma dovrebbe essere sufficiente per comprendere il funzionamento di questo potente tool.

E' bene fare MOLTA attenzione nell'uso di fdisk, per l'ultima volta, in quanto fdisk agisce SOLO ED UNICAMENTE sulla tavola delle partizioni, e non sui filesystem. Per ridimensionare o spostare partizioni contenenti dati che c'interessa conservare, è bene utilizzare programmi più avanzati, come GParted, QTParted o software commerciali come Partition Magic.

[modifica] cfdisk

cfdisk è il cugino con interfaccia utente di fdisk. Ha funzionalità molto simili a fdisk ma presenta un interfaccia pseudo-grafica gestibile tramite tastiera

                                                        cfdisk 2.12r

                                                    Disk Drive: /dev/hda
                                              Size: 80026361856 bytes, 80.0 GB
                                    Heads: 255   Sectors per Track: 63   Cylinders: 9729 

      Name              Flags             Part Type       FS Type                   [Label]                Size (MB)
 --------------------------------------------------------------------------------------------------------------------------
      hda1              Boot               Primary        Linux LVM                                         41940.71
      hda2                                 Primary        Linux swap                                         1028.16
      hda3                                 Primary        Linux ext2                                          197.41
      hda4                                 Primary        Linux LVM                                         36857.48



















       [Bootable]  [ Delete ]  [  Help  ]  [Maximize]  [ Print  ]  [  Quit  ]  [  Type  ]  [ Units  ]  [ Write  ]


                                       Toggle bootable flag of the current partition

motivo per cui è generalmente preferito dagli utenti meno esperti o da quelli più pigri. Rispetto a fdisk, presenta una minore affidabilità in contesti particolari (per un utilizzo su normali computer home, senza problemi alla tavola delle partizioni od esigenze specifiche è efficace quanto fdisk)

E' possibile avviarlo tanto come fdisk

cfdisk /dev/hda

quanto senza parametri. In tal caso cfdisk selezionerà automaticamente il primo disco rilevato. Per questo, è bene fare molta attenzione nell'usarlo senza parametri in sistemi con più di un disco.

Considerato che per cfdisk vale quanto detto per fdisk e che ha a disposizione un interfaccia pseudo-grafica come tanti altri applicativi, non ci dilungheremo molto in spiegazioni sul suo funzionamento. Basti sapere che con le frecce della tastiera SU e GIU è possibile selezionare dall'elenco visibile nella parte alta dello schermo la partizione su cui si vuole lavorare o lo spazio libero da partizionare. Con le frecce SINISTRA e DESTRA invece, si potrà selezionare che tipo di operazione effettuare, che cambierà a seconda del contesto.

E' bene ricordarsi che, a dispetto dell'interfaccia grafica che può far pensare altro, anche cfdisk come fdisk lavora solo ed unicamente sulla tavola delle partizioni, e non sui filesystem. Pertanto, ancora una volta, se si vuole ridimensionare o spostare partizioni su cui sono presenti dati, è bene utilizzare tool più avanzati.

[modifica] GParted e soci

GParted e QTParted sono interfacce grafiche per la GNU libparted, una libreria per la manipolazione delle partizioni, e per un insieme di tool specifici per la manipolazione dei filesystem, come E2fsprogs. Per dovere di cronaca, si tratta di cloni di Powerquest Partition Magic, ora Norton Partition Magic, il primo tool grafico commerciale capace di ridimensionare partizioni senza perdere l'usabilità del filesystem.

E' possibile usare GParted e QTParted direttamente dall'interno del sistema operativo. In questo modo però non sarà possibile modificare nessuna partizione in uso, fra cui sicuramente la partizione con montato il filesystem root (/). Per ottenere GParted per slackware, usare il repository di Slacky.eu.

E' possibile anche usare GParted e QTParted da distro live, come Knoppix, od addirittura da distro live realizzate appositamente per per questi programmi. Per esperienza personale consiglio GParted LiveCD. Usando questi tool da sistemi avviati ad hoc da CD-ROM/DVD, sarà possibile quindi editare ogni partizione presente sui nostri Hard Disk.

Trattandosi di programmi dotati di un ottima interfaccia grafica, in cui le operazioni di ridimensionamento etc si effettuano tutte con il mouse trascinando e spostando, non sono necessarie spiegazioni aggiuntive.

L'unica cosa che segnalo è che si tratta di processi molto lenti, per cui se pensate di ridimensionare partizioni molto grandi prendetevi il dovuto tempo.

[modifica] Utilizzo di LVM su Slackware GNU/Linux

Come detto nell'introduzione, questa guida si ripropone di insegnare ad utilizzare LVM su Slackware GNU/Linux in integrazione del proprio filesystem/schema di partizionamento od in sostituzione ad esso, sia convertendo uno schema preesistente che partendo da zero in fase d'installazione.

Innanzitutto è utile effettuare una breve panoramica dei comandi LVM.

[modifica] Panoramica dei comandi LVM

I comandi principali per l'utilizzo di LVM, sono i seguenti:

  • Comandi per la gestione dei volumi fisici (PV)
    • pvscan - cerca PV esistenti all'interno dei dischi fisici e li visualizza
    • pvcreate - permette di creare un PV
    • pvdisplay - permette di visualizzare informazioni su un PV
    • pvremove- permette di rimuovere la label LVM da un PV, in modo che non venga più riconosciuto come tale
  • Comandi per la gestione dei gruppi di volumi (VG)
    • vgscan - cerca VG esistenti all'interno dei dischi fisici. con l'opzione speciale --mknodes, aggiorna il contenuto di /dev in modo da riflettere l'effettivo stato del sistema.
    • vgcreate - permette di creare un VG sulla base di un PV
    • vgdisplay - permette di visualizzare le informazioni su un LV
    • vgextend - permette di aggiungere PV ad un VG
    • vgreduce - permette di rimuovere un PV da un VG
    • vgremove - permette di eliminare un VG, a patto che non esistano LV al suo interno
  • Comandi per la gestione dei volumi logici (LV)
    • lvscan - cerca LV esistenti all'interno dei dischi fisici e li visualizza
    • lvcreate - permette di creare un LV all'interno di un VG
    • lvdisplay - permette di visualizzare le informazioni su un LV
    • lvresize - permette di ridimensionare un LV
    • lvremove - permette di eliminare un LV da un VG

La maggior parte di questi comandi accettano gli stessi parametri. Piuttosto che analizzare ogni comando nel dettaglio, li analizzeremo man mano che dovremo usarli. Si consiglia di leggere ogni parte di questa sezione del manuale, come anche di tutto il resto, poiché gli stessi comandi non saranno descritti due volte.

[modifica] Integrazione di LVM all'interno di un filesystem esistente

Lo scenario più semplice è senza dubbio quello in cui si vuole aggiungere una partizione gestita con LVM all'interno di un filesystem funzionante, ad esempio in sostituzione della directory che contiene le home degli utenti (/home).

[modifica] Schema di partizionamento

Prenderemo come base lo schema di partizionamento della sezione su fdisk, quindi:

   Device Boot      Start         End      Blocks   Id  System
/dev/hda1   *           1        5099    40957686   8e  Linux LVM
/dev/hda2            5100        5224     1004062+  82  Linux swap
/dev/hda3            5225        5248      192780   83  Linux
/dev/hda4            5249        9729    35993632+  8e  Linux LVM

dove /dev/hda4 è la partizione che vogliamo usare per la nuova /home.

[modifica] Creazione del PV (Volume Fisico)

Procediamo quindi alla creazione del PV:

root@nuitari-laptop:~# pvcreate /dev/hda4
  Physical volume "/dev/hda4" successfully created

non è necessario altro, per la creazione del PV. A questo punto, per vedere cosa è successo, eseguiamo pvdisplay:

root@nuitari-laptop:~# pvdisplay /dev/hda4
  --- NEW Physical volume ---
  PV Name               /dev/hda4
  VG Name
  PV Size               34.33 GB
  Allocatable           NO
  PE Size (KByte)       0
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               SUjLpq-gmBW-NXJ8-57gW-2RZn-3ipA-aJTQr2

Come possiamo vedere, per il momento il PV è inerte, non utilizzabile poiché non associato a nessun VG.

[modifica] Crazione del VG (Gruppo di Volumi)

Procediamo quindi alla creazione del VG, che chiameremo "vgtest":

root@nuitari-laptop:~# vgcreate vgtest /dev/hda4
  Volume group "vgtest" successfully created

Visualizziamo ora le informazioni sul PV:

root@nuitari-laptop:~# pvdisplay /dev/hda4
  --- Physical volume ---
  PV Name               /dev/hda4
  VG Name               vgtest
  PV Size               34.32 GB / not usable 0
  Allocatable           yes
  PE Size (KByte)       4096
  Total PE              8787
  Free PE               8787
  Allocated PE          0
  PV UUID               SUjLpq-gmBW-NXJ8-57gW-2RZn-3ipA-aJTQr2

comepotete vedere, ora il PV è utilizzabile poiché aggiunto ad un VG. Vediamo le informazioni sul VG tramite vgdisplay:

root@nuitari-laptop:~# vgdisplay vgtest
  --- Volume group ---
  VG Name               vgtest
  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               34.32 GB
  PE Size               4.00 MB
  Total PE              8787
  Alloc PE / Size       0 / 0
  Free  PE / Size       8787 / 34.32 GB
  VG UUID               sg5T0u-aYfw-KB1A-pMp5-pcWq-rCAn-1xmTcF

Le righe interessanti sono:

  • VG Size - ci informa sulla dimensione a disposizione del VG, in formato "human readable", in questo caso 34.32 GB
  • PE Size - ci informa sulla dimensione delle PE (Physical Extent), ossia le sezioni in cui LVM ha diviso i PV, in questo caso 4.00 MB
  • Total PE - il numero totale di PE a disposizione del VG
  • Alloc PE / Size - quanti PE / spazio è stato utilizzato del VG, per il momento 0 / 0
  • Free PE / Size - quanti PE / spazio sono liberi e disponibili all'utilizzo, per il momento 8787 / 34.32 GB

Come potete vedere, LVM visualizza le informazioni tanto in Extents (PE o LE, a seconda del caso), quando in spazio "human readable". Questo perché in fase di creazione dei LV, è possibile utilizzare tanto la prima quanto la seconda forma per specificare le dimensioni.

[modifica] Creazione del LV (Volume Logico)

A questo punto, è possibile procedere alla creazione del LV dentro vgtest, che chiameremo "newhome":

root@nuitari-laptop:~# lvcreate -L 34.32G -n newhome vgtest
  Rounding up size to full physical extent 34.32 GB
  Logical volume "newhome" created

Il messaggio ci dice che LVM ha intuito che noi volevamo occupare tutto lo spazio disponibile, per cui ha adattato la dimensione imputata da noi in GB nel giusto numero di PE. Questo accade perché, ovviamente, la dimensione specificata in GB rappresenta un approssimazione. L'utilizzo dei PE permette di essere più precisi. Sapendo quindi (con vgdisplay) che abbiamo a disposizione sul nostro VG 8787 PE, avremmo potuto creare il LV anche nel seguente modo:

root@nuitari-laptop:~# lvcreate -l 8787 -n newhome vgtest
  Logical volume "newhome" created

A questo punto, se digitiamo vgdisplay, vediamo che le proprietà di del VG sono cambiate:

root@nuitari-laptop:~# vgdisplay vgtest
  --- Volume group ---
  VG Name               vgtest
  System ID
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  10
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                1
  Open LV               0
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               34.32 GB
  PE Size               4.00 MB
  Total PE              8787
  Alloc PE / Size       8787 / 34.32 GB
  Free  PE / Size       0 / 0
  VG UUID               sg5T0u-aYfw-KB1A-pMp5-pcWq-rCAn-1xmTcF

Come possiamo vedere, vgdisplay ci segnala che è presente al suo interno un LV (Cur LV: 1) e che tutto lo spazio a disposizione è stato allocato (Free PE / Size: 0 / 0)

Oltre a questo, nel momento in cui abbiamo creato il LV, LVM ha creato dentro /dev i nodi per accedere alla nuova partizione, secondo lo schema /dev/NOMEVG/NOMELV

root@nuitari-laptop:~# ls -R /dev/vg*
/dev/vgtest:
newhome

Per cui, da ora in poi potremo fare riferimento al LV usando il percorso "/dev/vgtest/newhome". Dovremo SEMPRE usare questo percorso per riferirci al LV, mai più dovremo usare il percorso alla partizione fisica /dev/hda4 finché sarà utilizzata all'interno di un contesto LVM.

Per visualizzare le informazioni sul LV appena creato, usiamo lvdisplay:

root@nuitari-laptop:~# lvdisplay /dev/vgtest/newhome
  --- Logical volume ---
  LV Name                /dev/vgtest/newhome
  VG Name                vgtest
  LV UUID                cOECiY-YmIc-tL3I-blX0-f7m5-v14G-cIX1Vl
  LV Write Access        read/write
  LV Status              available
  # open                 0
  LV Size                34.32 GB
  Current LE             8787
  Segments               1
  Allocation             inherit
  Read ahead sectors     0
  Block device           253:1

Tutto è andato per il meglio!

[modifica] Formattazione e montaggio del LV

A questo punto, è possibile formattare la partizione con il filesystem che preferiamo. Ad esempio, per formattare la partizione con il filesystem ext3, digitiamo:

root@nuitari-laptop:~# mkfs.ext3 /dev/vgtest/newhome
mke2fs 1.39 (29-May-2006)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
4505600 inodes, 8997888 blocks
449894 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=12582912
275 block groups
32768 blocks per group, 32768 fragments per group
16384 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 34 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.

A questo punto, possiamo decidere se utilizzare direttamente la nuova partizione creata con LVM, eliminando prima i dati della vecchia /home

rm -Rf /home
mkdir /home
mount -t ext3 /dev/vgtest/newhome /mnt/tmp

Oppure effettuare una migrazione completa dei dati.

[modifica] Migrazione dei dati nella nuova partizione

A tal scopo, dobbiamo innanzitutto montare il filesystem in una cartella temporanea, allo scopo di copiare i dati presenti nella home attuale

mkdir /mnt/tmp
mount -t ext3 /dev/vgtest/newhome /mnt/tmp

effettuare il backup del contenuto di /home

cd /home
find -xdev | cpio -pvmd /mnt/tmp

eliminare il contenuto della vecchia home e ricreare la cartella per il mountpoint

rm -Rf /home
mkdir /home

smontare il LV e rimontarlo come nuova /home

umount /mnt/tmp
mount -t ext3 /dev/vgtest/newhome /home

e gioire della nuova home directory. Ovviamente va anche aggiunta la riga relativa al file /etc/fstab

/dev/vgtest/newhome /mnt/tmp ext3 defaults 0 0

in modo che venga montata automaticamente ad ogni avvio.

[modifica] Migrazione ad LVM di un sistema esistente

Considerato che Slackware GNU/Linux non permette tramite l'utility di setup di definire uno schema LVM su cui installare il sistema, è molto probabile che la maggior parte degli utenti che leggeranno questa guida avranno un sistema privo di LVM.

Come fare quindi se non si è utilizzato LVM in fase di setup e si desidera migrare il proprio sistema nella sua interezza in uno schema LVM, ma senza per questo perdere dati ed impostazioni?

Con una serie di comandi ed un briciolo di attenzione, fortunatamente, questo è possibile.

Descritto in breve, migrare un sistema non LVM in uno LVM necessiterà dei seguenti passaggi:

  1. la creazione di uno schema di partizionamento che permetta l'avvio del sistema da partizione LVM, utilizzando GParted od uno strumento analogo. Questo schema dovrà consistere almeno in una partizione di swap, una piccola partizione per i file di boot ed una partizione LVM grande a sufficienza per duplicare il contenuto attuale del filesystem root (/)
  2. la copia dei dati all'interno della nuova partizione LVM, con le giuste opzioni per far si che rimangano inalterati
  3. la modifica dei file di boot in modo da permettere l'avvio con LVM dalla nuova partizione, il che include la creazione (o la modifica) d'un immagine initrd (initramfs)
  4. la fusione della vecchia partizione nel nuovo schema LVM, al fine di recuperarne lo spazio (previo test di funzionamento della nuova partizione, ovviamente).

Il prerequisito fondamentale è che se disponga di almeno metà del disco che si vuole convertire libero, in modo da poter fare la copia del filesystem root. Ovviamente se si hanno a disposizione dischi aggiuntivi liberi o liberabili, sufficientemente grandi da contenere root (/), è ugualmente buono. E' possibile recuperare un po' di spazio cancellando dati non più necessari, cancellando il contenuto delle cartelle temporanee, di spool, di log, di download degli aggiornamenti, etc..

[modifica] Creazione dello schema di partizionamento

Supponiamo di avere un sistema standard, con una partizione di swap ed una partizione per il filesystem root (/) su un disco da 100 Gbyte.

usando il comando df possiamo verificare se abbiamo spazio a sufficienza per compiere l'operazione

root@nuitari-laptop:~# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/hda2
                       98G   30G  68G   30% /

Una situazione di questo genere è ovviamente ideale, in quanto, come possiamo vedere, solo il 30% dello spazio è occupato. Abbiamo quindi spazio a sufficienza per creare tutte le partizioni necessarie (i 2 gbyte mancanti sono assegnati allo swap, /dev/hda1).

Nella fattispecie, dovremo creare come detto precedentemente una partizione grande a sufficienza almeno per contenere una copia dei dati ed una partizione per contenere i file necessari al boot.

La necessità di creare una partizione di boot consiste nel fatto che lilo e grub, i boot manager più diffusi su Linux, non sono in grado di avviare il kernel dall'interno di partizioni LVM. Per questo è indispensabile creare una partizione di supporto in cui memorizzare i file necessari per permettergli di leggere il contenuto delle partizioni LVM (initrd). Non è necessario molto spazio, a tale scopo. Un centinaio di MByte saranno più che sufficienti.

Quindi, ricapitolando, dovremo:

1) creare una partizione da 100mbyte, di tipo Linux, per memorizzare i file di boot. 2) rimpicciolire almeno della metà la partizione che contiene il filesystem root (/) 3) creare una nuova partizione LVM per root(/)

Per effettuare queste operazioni, possiamo tranquillamente utilizzare GParted Live CD. L'operazione richiederà un po'di tempo. Alla fine dell'operazione avremo quindi:

  • una partizione primaria di 2 GByte di tipo Linux Swap (/dev/hda1)
  • una partizione primaria di 35 GByte contenente il vecchio filesystem (/dev/hda2)
  • una partizione primaria di 100 MByte di tipo Linux per contenere i file di boot (/dev/hda3)
  • una partizione primaria di 62,9 Gbyte (lo spazio restante) di tipo LVM, per la migrazione dei dati (/dev/hda4)

Come si può notare, si è cercato di non cambiare l'ordine delle partizioni. Questo serve a preservare il funzionamento del sistema senza fare modifiche particolari ai file d'avvio: sarà quindi possibile a ripartizionamento avvenuto semplicemente riavviare il computer e riaccedere al proprio vecchio sistema.

[modifica] Migrazione dei dati nella nuova partizione

Una volta riavviato il sistema con il nostro nuovo schema di partizionamento, sarà possibile inizializzare realmente la nuova partizione per LVM ed effettuare la migrazione dei dati.

Procediamo innanzitutto ad inizializzare la nuova partizione, che chiameremo "mylv". Il gruppo che conterrà il LV sarà chiamato "myvg". Quindi, come root digitiamo:

pvcreate /dev/hda4
vgcreate myvg /dev/hda4
lvcreate -L 62.9G -n mylv myvg

Ovviamente dovremo sostituire la dimensione del LV con la dimensione a disposizione del nostro VG, in dimensioni "human readable" od in PE. Per scoprirle con precisione ricordo che è possibile utilizzare il comando vgdisplay dopo aver creato il VG.

A questo punto, procediamo a creare il filesystem desiderato sul nuovo LV, in questo esempio un EXT3, creare un mountpoint e montare l'LV all'interno del nostro filesystem

mkfs.ext3 /dev/myvg/mylv
mkdir /mnt/tmp
mount -t ext3 /dev/myvg/mylv /mnt/tmp

quindi procediamo a copiare i file dell'intero filesystem root (/)

find / -xdev | cpio -pvmd /mnt/tmp

Come si sarà potuto notare, fino a questo punto la procedura è del tutto simile a quella descritta nella sezione precedente. Le principali differenze iniziano a sorgere finita la migrazione dei dati, in quanto è necessario rendere la partizione avviabile.

[modifica] Rendere avviabile la nuova partizione

Nella prima sezione abbiamo spiegato come sia necessaria una partizione di boot in un formato leggibile dai bootloader per poter rendere la partizione avviabile. Se abbiamo seguito le istruzioni pedissequamente, a questo punto dovremmo avere una partizione da 100 MByte (nel nostro esempio /dev/hda3) di tipo Linux. Nel caso in cui una partizione di boot fosse già presente nel nostro sistema (alcuni sono soliti usarla) è possibile evitare tutte le operazioni relative alla sua inizializzazione, mentre sarà indispensabile effettuare le operazioni necessarie per la sua impostazione.

E' bene effettuare l'impostazione dei file di boot all'interno della nostra vecchia partizione, per poi copiarli all'interno della nuova. In questo modo preserveremo il funzionamento della vecchia partizione.

[modifica] initrd

A tal scopo, innanzitutto, dobbiamo creare un immagine initrd per consentire l'avvio della partizione LVM.

Per chi non lo sapesse, l'"initrd" ("Initial Ramdisk", a volte chiamato anche initramfs) consiste nell'immagine, normalmente compressa, di un piccolo sistema linux. Quest'immagine viene caricata dai bootloader (se specificata) per ricreare un microambiente dal quale effettuare l'avvio del sistema vero e proprio. In questo modo è possibile caricare moduli del kernel od avere accesso a comandi di sistema che sono necessari all'avvio ma non disponibili normalmente all'interno del bootloader. Considerato che come detto i bootloader non supportano direttamente LVM, è necessario creare l'initrd, o duplicare l'initrd esistente e modificarlo nel caso esista già.

Innanzitutto quindi, è bene capire se si sta già usando un initrd. Il metodo più sicuro consiste nel guardare all'interno di /etc/lilo.conf. Se nella sezione relativa all'immagine che stiamo usando è presente il parametro initrd, allora significa che lo stiamo usando, come nel seguente esempio:

image = /boot/vmlinuz-2.6.22.5
  initrd = /boot/initrd.gz
  root = /dev/myvg/mylv
  label = Slack-2.6.22.5
  read-only # Partitions should be mounted read-only for checking

[modifica] Creazione di un initrd nel caso non esista

L'operazione di creazione o modifica di un initrd è un operazione abbastanza complessa. Fortunatamente tutte le distribuzioni moderne forniscono uno o più script per semplificarci il compito. Slackware non fa eccezione, mettendoci a disposizione lo script mkinitrd.

Per creare un nuovo initrd per il boot della partizione LVM, seguendo il nostro esempio, usare la seguente sintassi:

mkinitrd -c -L -r /dev/myvg/mylv -f ext3

I parametri utilizzati hanno il seguente significato

  • -c - pulisce l'albero dei file di initrd nel caso esista, in modo da partire con un nuovo albero
  • -L - attiva il supporto ad LVM
  • -r - specifica quale partizione andrà usata come root (/)
  • -f - specifica il tipo di filesystem da usare per la partizione di root

Lo script creerà un albero di file e directory all'interno di boot con il microsistema di cui abbiamo parlato sopra, di default nella directory /boot/initrd-tree, ed al tempo stesso creerà l'immagine compressa, di default /boot/initrd.gz

[modifica] Duplicazione di un initrd nel caso ne esista già uno

Se nel sistema è già in uso un initrd, è necessario preservarla per conservare il funzionamento del sistema, duplicandola per poter creare una nuova immagine compressa che supporti tutto ciò che supportava la precedente con in aggiunta il supporto ad LVM.

A tal scopo, verifichiamo il nome del tree dentro /boot. Su slackware il nome di default del tree initrd è, molto significativamente, initrd-tree. Una volta individuato, procediamo alla sua copia:

cp -Rp /boot/initrd-tree /boot/initrd-lvmtree

A questo punto, sarà possibile modificare il tree e creare una nuova immagine per attivare il supporto ad LVM

mkinitrd -L -r /dev/myvg/mylv -f ext3 -s /boot/initrd-lvmtree -o /boot/initrd-lvm.gz

Il trucco consiste nell'omissione del parametro -c. Omettendolo, mkinitrd modifica il tree conservando tutto ciò che già esisteva. Così facendo ora avremo due immagini differenti dentro /boot, initrd.gz ed initrd-lvm.gz

[modifica] Completamento delle operazioni

Una volta prodotta l'initrd, il primo passo è modificare il file lilo.conf, aggiungendo una nuova voce di menù copiando la vecchia voce utilizzata, variandone i parametri.

Se, ad esempio, la voce che usavamo era

image = /boot/vmlinuz-2.6.22.5
  root = /dev/hda2
  label = Slack-2.6.22.5
  read-only # Partitions should be mounted read-only for checking

aggiungeremo una nuova voce del tipo

image = /boot/vmlinuz-2.6.22.5
  initrd = /boot/initrd.gz
  root = /dev/myvg/mylv
  label = Slack-LVM
  read-only # Partitions should be mounted read-only for checking

Le modifiche apportate sono state l'aggiunta della riga "initrd" (poiché la precedente voce non l'usava), la modifica della root partition e la modifica della label, in modo da distinguerla dalla precedente. Se ci fosse stata già un initrd in uso, e quindi abbiamo creato come spiegato nella sezione precedente un immagine aggiuntiva sulla base della vecchia con un nome "initrd-lvm.gz", avremmo dovuto ovviamente lasciare invariato il nome dell'immagine initrd della voce precedente e variare quello della voce nuova, quindi ad esempio:

image = /boot/vmlinuz-2.6.22.5
  initrd = /boot/initrd.gz
  root = /dev/hda2
  label = Slack-2.6.22.5
  read-only # Partitions should be mounted read-only for checking

image = /boot/vmlinuz-2.6.22.5
  initrd = /boot/initrd-lvm.gz
  root = /dev/myvg/mylv
  label = Slack-LVM
  read-only # Partitions should be mounted read-only for checking

Nel caso in cui non siano presenti le voci

prompt
timeout = 50

nella zona superiore del file, aggiungetele. In questo modo lilo visualizzerà un menù che ci permetterà di scegliere quale immagine/partizione avviare.

A questo punto, possiamo digitare il comando lilo privo di parametri per aggiornare il bootsector e verificare di aver configurato tutto per il meglio.

root@nuitari-laptop:/boot# lilo
Warning: '/proc/partitions' does not match '/dev' directory structure.
    Name change: '/dev/dm-0' -> '/dev/vgtest/newhome'
Warning: Name change: '/dev/dm-1' -> '/dev/myvg/mylv'
Added Slack-2.6.22.5 *
Added Slack-huge
2 warnings were issued.

Come detto precedentemente, gli WARNING possono tranquillamente essere ignorati, si tratta di problemi potenziali che sono stati comunque gestiti. Gli WARNING in questione comunque dipendono dal fatto che Linux, internamente, usa il "Device Mapper" (dm) per gestire le partizioni LVM e lilo fa riferimento a quella nomenclatura, piuttosto che allo shortcut /dev/NOMEVG/NOMELV.

A questo punto, se tutto è andato a buon fine, possiamo procedere a copiare il file lilo.conf all'interno della partizione LVM, in modo da sincronizzare le modifiche ai file (dato che la copia del file è stata effettuata come da guida prima delle modifiche al file stesso).

cp -p /etc/lilo.conf /mnt/tmp/etc/

A questo punto, è bene riportare le modifiche effettuate ai file di /boot dentro la partizione creata ad HOC per questo scopo, che nel nuovo schema andrà a sostituire la directory stessa. Proseguendo con il nostro esempio, procediamo a formattarla con ext2, il filesystem più diffuso e supportato del mondo Linux

mkfs.ext2 /dev/hda3

quindi cancelliamo il contenuto della directory boot nella nuova partizione LVM, per poi ricrearla, in modo da usarla come mountpoint per la partizione di boot

rm -Rf /mnt/tmp/boot
mkdir /mnt/tmp/boot
mount /dev/hda3 /mnt/tmp/boot

A questo punto, ri-eseguiamo la copia dei soli file di boot

cd /boot
find -xdev | cpio -pvmd /mnt/tmp/boot

quindi modifichiamo il file fstab del nuovo LV (quindi /mnt/tmp/etc/fstab) in modo che rifletta la nuova struttura, aggiungendo la partizione di /boot e modificando la partizione di root (/):

/dev/myvg/mylv   /                ext3        defaults         1   1
/dev/hda3        /boot            ext2        defaults         1   2

A questo punto è possibile smontare tutti i filesystem, in ordine, riavviare la macchina e provare il nuovo schema selezionando la partizione LVM dal menù di boot.

umount /dev/hda3
umount /dev/myvg/mylv
reboot

Una volta riavviato il sistema, se avremo eseguito tutto correttamente verremo gratificati dal prompt di login. Loggarsi come root e digitare il comando "mount" privo di parametri. Se l'output che otterremo conterrà la riga

/dev/mapper/myvg-mylv on / type ext3 (rw)

possiamo gioire, siamo all'interno del nuovo schema LVM!

a questo punto, possiamo inizializzare la vecchia partizione con LVM ed aggiungerla al LV principale, in modo da recuperarne lo spazio

[modifica] Recupero della vecchia partizione

Innanzitutto, dobbiamo inizializzare la vecchia partizione con LVM, per cui procediamo come al solito con pvcreate

pvcreate /dev/hda2

Quindi aggiungiamo il nuovo PV al VG

root@nuitari-laptop:~# vgextend myvg /dev/hda2
  Volume group "myvg" successfully extended

Se ora visualizziamo le caratteristiche del VG con vgdisplay, alla voce "Free PE/Size" possiamo vedere che altro spazio libero è a nostra disposizione. Procediamo quindi a ridimensionare il LV in modo che occupi l'intero VG

root@nuitari-laptop:~# lvresize /dev/myvg/mylv -l +8787
  Extending logical volume mylv to 73.38 GB
  Logical volume mylv successfully resized

è possibile utilizzare il comando lvresize usando sia i PE (-l) che la dimensione in formato "Human Readable" (-L), come per tutti gli altri comandi. Se specifichiamo il valore con davanti il simbolo "+", aumentiamo la dimensione del LV, se usiamo il simbolo "-" la diminuiamo. Specificando il valore senza simboli, cerchiamo d'impostare la dimensione del LV esattamente a quella dimensione. Quindi, facendo degli esempi:

  • lvresize /dev/myvg/mylv -l +8787 - aggiunge 8787 PE al LV
  • lvresize /dev/myvg/mylv -l -10G - riduce di 10G il LV
  • lvresize /dev/myvg/mylv -l 90G - imposta la dimensione del LV a 90G, riducendolo od espandendolo a seconda della sua dimensione originale

se usiamo il comando "df -h" per visualizzare lo spazio libero, noteremo che pur avendo aumentato la dimensione del LV non è cambiato minimamente. Questo accade perché la dimensione del LV (una partizione) e quella del filesystem in esso contenuto sono due cose MOLTO diverse. Per ridimensionare il filesystem in modo che occupi tutto lo spazio che ora ha a disposizione, è necessario effettuare un comando aggiuntivo. Il comando in questione cambia a seconda del tipo di filesystem. Per quanto riguarda il filesystem ext3 (quello del nostro esempio) il comando è

resize2fs DEVICE DIMENSIONE

dove DEVICE è ovviamente il percorso alla partizione contenente il filesystem da ridimensionare, mentre il parametro DIMENSIONE è la nuova dimensione che dovrà avere il filesystem dopo l'operazione. Se il parametro DIMENSIONE è omesso, resize2fs tenterà automaticamente di espandere il filesystem fino ad occupare tutto lo spazio presente sulla partizione. Se specificato, andrà fatto seguire dall'unità di misura come nel caso di lvresize. Quindi, ad esempio

resize2fs /dev/myvg/mylv 90G

tenterà di espandere il filesystem fino a raggiungere la dimensione di 90 Gbyte. Ovviamente il parametro DIMENSIONE non può mai essere superiore alla dimensione della partizione stessa.

E' bene sapere che non è possibile eseguire operazioni di ridimensionamento su filesystem in uso, con qualche eccezione. Questo significa che per ridimensionare il filesystem root (/), che ovviamente è in uso se ci troviamo all'interno del sistema, saremo costretti a riavviare il computer con, ad esempio, il CD-ROM/DVD d'installazione di Slackware ed effettuare il resize dalla shell d'installazione (vedi oltre).

Come dicevo, però, esistono delle eccezioni. Con i kernel della serie 2.6 è possibile, solo su filesystem di tipo ext3 (per il momento), effettuare operazioni di ingrandimento anche se il filesystem è in uso! Guarda caso, è proprio il caso del nostro esempio. Per cui, procediamo ad espandere il root filesystem

root@nuitari-laptop:~# resize2fs /dev/myvg/mylv
resize2fs 1.39 (29-May-2006)
Filesystem at /dev/myvg/mylv is mounted on /; on-line resizing required
Performing an on-line resize of /dev/myvg/mylv to 19236864 (4k) blocks.
The filesystem on /dev/myvg/mylv is now 19236864 blocks long.

A questo punto con il comando "df -h" sarà possibile verificare l'avvenuto ingrandimento del filesystem. Abbiamo a disposizione tutto il nostro hard disk in un unico schema LVM, e tutto questo con un solo riavvio necessario!

[modifica] Installazione di Slackware GNU/Linux in uno schema LVM

E' possibile, nonostante non supportato direttamente dall'utility di setup, installare da zero Slackware GNU/Linux all'interno di uno schema LVM.

I passaggi necessari non sono, ancora una volta, molto differenti da quanto spiegato fin'ora. La procedura spiegata in questa sezione potrà altresì essere utile a recuperare il sistema nel caso una qualsiasi delle procedure descritte nei paragrafi precedenti dovesse andar male.

Il motivo per cui il setup di Slackware non supporta direttamente LVM è che, in generale, il setup di Slackware non si preoccupa del partizionamento, lasciando che l'utente lo faccia da solo usando fdisk o cfdisk (descritti precedentemente in questo stesso articolo). Comunque, così come è possibile effettuare il normale partizionamento manualmente, è possibile effettuare manualmente anche la realizzazione di uno schema LVM. Vediamo come.

[modifica] Operazioni pre-Installazione

Una volta avviata l'installazione da CD-ROM/DVD, ci troveremo all'interno di una shell bash. Questo è il momento in cui, normalmente, viene eseguito il partizionamento, prima dell'esecuzione dello script di setup.

Procediamo dunque con la realizzazione d'uno schema di partizionamento valido per l'utilizzo con LVM.

Riprendendo l'esempio della sezione precedente (un unico hard disk da 100 GByte), procediamo a creare quindi le seguenti partizioni, con fdsik o cfdisk:

  • una partizione primaria di 2 GByte di tipo Linux Swap (/dev/hda1)
  • una partizione primaria di 100 MByte di tipo Linux per contenere i file di boot (/dev/hda2)
  • una partizione primaria di 67,9 Gbyte (lo spazio restante) di tipo LVM, per il root filesystem (/dev/hda3)

La necessità di avere una partizione di boot è stata ampiamente spiegata nella sezione precedente. A questo punto, procediamo ad inizializzare la partizione per l'utilizzo con LVM

pvcreate /dev/hda3

creiamo il VG

vgcreate myvg /dev/hda3

creiamo il LV dentro il VG

lvcreate -L 67.9G -n mylv myvg

ovviamente possiamo usare anche il numero di PE al posto della dimensione, usando il parametro -l. Come già spiegato, per visualizzare lo spazio a disposizione del VG, usare vgdisplay.

A questo punto, creiamo il filesystem dentro il LV, ad esempio

mkfs.ext3 /dev/myvg/mylv

se per caso mkfs dovesse dirci che non vede il device /dev/myvg/mylv, vuol dire che O il VG non è attivo O che per un qualche motivo non sono stati creati i nodi dentro /dev. Per ovviare al problema, usare la coppia di comandi:

vgchange -a y myvg
vgscan --mknodes

il primo serve a rendere attivo il VG, il secondo effettua una scansione dei VG presenti nel sistema e ricrea i nodi. Questi due comandi sono fondamentali nel caso in cui riavviando il sistema con il CD-ROM/DVD d'installazione a causa d'un errore dobbiamo accedere a VG/LV esistenti. Senza eseguire questi comandi non saranno visibili.

E' possibile creare il filesystem anche dal setup di Slackware. Crearlo dall'esterno ci permette di verificare d'aver creato correttamente il LV.

[modifica] Installazione

Creato il filesystem, possiamo far partire il setup. Il processo d'installazione è in tutto e per tutto simile al normale. L'unica differenza è rappresentata dal fatto che negli elenchi visualizzati nelle varie fasi del setup, vedremo non solo il device fisico /dev/hda3, ma anche il LV /dev/myvg/mylv, che useremo per il filesystem root (/). E' bene ricordarsi di IGNORARE COMPLETAMENTE il device fisico /dev/hda3. Dobbiamo SEMPRE E SOLO usare il device mappato /dev/myvg/mylv.

E' possibile invece usare per l'installazione di LILO il device /dev/hda, in quanto fa riferimento all'intero disco per l'installazione dell'MBR e non alla specifica partizione /dev/hda3.

Parlando di LILO, pur configurandolo correttamente lo script d'installazione darà un errore d'installazione, in quanto per rendere LILO effettivamente funzionante è necessario fare le operazione descritte nella sezione precedente sulla generazione dell'initrd, e quindi dopo l'installazione stessa. Si può ignorare tranquillamente qualsiasi messaggio d'errore, in quanto l'installazione di LILO verrà rifinita in fase di post-installazione. E' comunque necessario ignorare il fatto e configurare correttamente lilo fin da questa fase.

[modifica] Operazioni post-Installazione

Una volta completata la procedura d'installazione, lo script ci riporterà alla command line dicendoci di riavviare il computer senza il CD-ROM/DVD per loggarci nel nuovo sistema, espellendolo. A causa di quest'espulsione, per evitare qualsivoglia problema è consigliabile assecondare lo script e riavviare il computer, ma re-inserendo il CD/DVD d'installazione in modo da tornare al prompt dei comandi precedente l'installazione.

Questo è necessario perché, come detto precedentemente, l'installazione di LILO in fase di setup non va a buon fine. Pertanto è necessario avere a disposizione una shell per potervi porre riparo. A questo scopo, la shell del CD/DVD d'installazione è perfetta.

Per cui, una volta ottenuta la shell dal CD/DVD, digitare innanzitutto la coppia di comandi

vgchange -a y myvg
vgscan --mknodes

per rendere nuovamente disponibile la partizione LVM. A questo punto, per poterla modificare, procediamo a montarla all'interno della directory /mnt

mount -t ext3 /dev/myvg/mylv /mnt

allo stesso modo, montiamo al suo interno la partizione di boot

mount -t ext3 /dev/hda2 /mnt/boot

e gli pseudo filesystem necessari a poter svolgere le operazioni richieste

mount -t proc proc /mnt/proc
mount -t sysfs sysfs /mnt/sys

a questo punto, tramite il comando "chroot" è possibile "imbrogliare" la shell e fargli credere che la nostra root non comincia dalla sua posizione reale attuale, ma dal mountpoint di /dev/myvg/mylv

chroot /mnt

se tutto ha funzionato correttamente, dovremmo trovarci in un ambiente molto simile a quello che avremo completata l'installazione, con il LV come root partition (/).

Ri-eseguiamo il comando vgscan per ricreare i nodi nel nuovo /dev

vgscan --mknodes

quindi creiamo l'initrd, come visto nella sezione precedente

mkinitrd -c -L -f ext3 -r /dev/myvg/mylv

infine editiamo il file /etc/lilo.conf ed aggiungiamo la riga

 initrd = /boot/initrd.gz

alla sezione dell'immagine di default, quindi eseguiamo "lilo" privo di parametri per aggiornare il bootsector.

A questo punto, dobbiamo semplicemente uscire da chroot e smontare tutti i filesystem montati precedentemente in ordine inverso

exit
cd /
umount /mnt/sys
umount /mnt/proc
umount /mnt/boot
umount /mnt

disattivare il volume group (giusto per pignoleria)

vgchange -a n myvg

e riavviare il sistema. Se abbiamo fatto tutto correttamente, potremo goderci la nostra Slackware 12 fresca d'installazione, in uno schema LVM nuovo fiammante!

[modifica] Conclusioni

Con questo articolo abbiamo appena scalfito la complessità di LVM2 e le sue potenzialità. Ancora molto potrebbe essere detto e probabilmente ancora molto verrà aggiunto a questa guida, che vuole tutto fuorché pretendere di essere completa o definitiva.

Se non altro, spero che possa rappresentare un valido aiuto di natura pratica per l'utilizzo di LVM all'interno del proprio sistema ed un buon punto di partenza per approfondire l'argomento con una ricerca personale.

[modifica] Collegamenti esterni

[modifica] Ringraziamenti

Autore: Samuele "Nuitari" Diella - samuele.diella@gmail.com

Strumenti personali
Namespace

Varianti