Di seguito le convenzioni utilizzato in questa piccola guida. Si considerano i seguenti device fisici:
/dev/sda
: device che contiene la partizione del sistema operativo;/dev/sdb
: device che contiene una partizione NTFS, con dati che devono essere importati nell'LVM;/dev/sdc
: device senza partizioni, che verrà aggiunto all'LVM.
Ogni device /dev/sdX
viene definito physical volume (volume fisico). L'insieme delle partizioni di volumi fisici che fanno parte di LVM sono detti volume group (gruppo di volumi). L'astrazione come singola entità per il sistema del gruppo di volumi viene detto logical volume (volume logico).
PHYSICAL VOLUME ABSTRACTION LAYER
=============== =================
/dev/sdX /dev/storage
+-------------+ +-------------+
|+-----------+| |+-----------+|
|| /dev/sdX1 |--------------------------->| /dev/sdX1 ||
|+-----------+| |+-----------+|
|+-----------+| |+-----------+|
|| /dev/sdX2 ||<-- Volume Fisico +-->| /dev/sdY1 ||
|+-----------+| | |+-----------+|<---+
+-------------+ | +-------------+ |
| | |
/dev/sdY | | Volume group
+-------------+ | |
|+-----------+| | +-----V----------------+
|| /dev/sdY1 |------------------------+ | /dev/storage/storage |
|+-----------+| +----------------------+
|+-----------+| ^
|| /dev/sdY2 |<-- Partizione di un |
|+-----------+| Volume fisico Logical volume
+-------------+
======================
USER ABSTRACTION LAYER
Per creare un nuovo array LVM è necessario effettuare queste operazioni:
- Selezionare le partizioni che entreranno a far parte del volume group;
- Creare un volume logico dal gruppo di volumi.
Alle operazioni qui descritte c'è da aggiungere il fatto che una delle partizioni che enetreranno a far parte dell'LVM contengono già dati che devono essere spostati all'interno dell'LVM.
Il volume LVM creato verrà chiamato storage
.
Sia ben chiaro: eseguire una operazione di questo tipo è molto rischioso, potrebbe comportare la perdita di tutti i dati, soprattutto nel caso di spegnimento/blocco improvviso del sistema. Consiglio caldamente di eseguire tutto in una console nel quale non sia attivo il server grafico.
Il primo passo è partizionare e formattare /dev/sdc
. Per farlo utilizziamo il comando fdisk
.
$ sudo fdisk /dev/sdc
Essendo un disco di tipo commerciale, quasi sicuramente presenta una formattazione NTFS che è necessario eliminare. fdisk
ha una interfaccia molto semplice. Per avere una descrizione dei comandi disponibili utilizzare la lettera m
. Per visualizzare le partizioni disponibili all'interno del disco utilizzare la lettera p
.
- Eliminiamo tutte le partizioni presenti all'interno del disco utilizzando la lettera
d
. Se le partizioni presenti sul disco sono più di una allora si dovrà scegliere quale partizioni eliminare. - Una volta eliminate, creiamo una nuova partizione con la lettera
n
, utilizzando le impostazioni di default sulla partizione. La partizione deve essere di tipo primario. - Una volta creata la nuova partizione, rendiamola di tipo LVM, utilizzando il comando
t
e digitando il codice8e
. - Per scrivere le operazioni su disco è necessario utilizzare il comando
w
.fdisk
uscirà dopo aver effettuato la scrittura su disco.
Di seguito un estratto di una sessione di fdisk
di esempio:
$ sudo fdisk /dev/sdc
[sudo] password for user:
Command (m for help): m
Command action
a toggle a bootable flag
b edit bsd disklabel
c toggle the dos compatibility flag
d delete a partition
l list known partition types
m print this menu
n add a new partition
o create a new empty DOS partition table
p print the partition table
q quit without saving changes
s create a new empty Sun disklabel
t change a partition's system id
u change display/entry units
v verify the partition table
w write table to disk and exit
x extra functionality (experts only)
Command (m for help): d
Selected partition 1
Command (m for help): n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p
Partition number (1-4, default 1):
Using default value 1
First sector (2048-312581807, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-312581807, default 312581807):
Using default value 312581807
Command (m for help): t
Selected partition 1
Hex code (type L to list codes): 8e
Changed system type of partition 1 to 8e (Linux LVM)
Command (m for help): w
The partition table has been altered!
Esistono una serie di comandi per la creazione e gestione degli LVM. Questi sono normalmente contenuti nel pacchetto lvm2
, che deve essere installato:
$ sudo apt-get update && sudo apt-get install lvm2
per poi creare l'insieme di volumi che genereranno l'array LVM.
$ sudo pvcreate /dev/sdc1
Physical volume "/dev/sdc1" successfully created
È possibile utilizzare altre utility per visualizzare lo stato attuale, come i comandi pvscan
e pvdisplay
, che devono essere utilizzati come super-utente.
Andiamo a creare adesso il gruppo di volumi:
$ sudo vgcreate storage /dev/sdc1
Volume group "storage" successfully created
In questo modo la dimensione di ogni simbolo pacchetto è di 4MB. È possibile cambiare la dimensione dello spazio di allocazione usando la flag -s
sul comando precedente (ma si consiglia caldamente di lasciare come dimensione i canonici 4MB). Per poter visualizzare il risultato del comando precedente è possibile utilizzare il comando vgdisplay
Ultimo step per la creazione di LVM, è la creazione del volume logico:
$ sudo lvcreate -l 100%VG -n storage storage
Logical volume "storage" created
Mediante la flag -l si specifica che il logical volume deve utilizzare tutto il volume group disponibile. È possibile vedere il risultato della operazione mediante il comando lvdisplay
. Per poter iniziare ad utilizzare il volume è necessario fare in modo che questo sia formattato e montato:
$ sudo mkfs.ext4 -c /dev/storage/storage
In seguito è possibile fare in modo che sia montato automaticamente utilizzando /etc/fstab
. Utilizzando il device mapper, si può scegliere di montare la partizione nella directory (nell'esempi /mount/storage
) ovvero inserendo la seguente riga nel file:
$ sudo mkdir /mount/storage
$ sudo nano /etc/fstab
[...]
/dev/mapper/storage-storage /mount/storage ext4 defaults 0 2
dopo aver salvato è possibile rimontare tutte le partizioni definite nel fstab mediante il comando:
$ sudo mount -a
Il prossimo step è la sincronizzazione di tutti i dati contenuti nella vecchia partizione NTFS sul nuovo sistema. Un buon modo per fare questo è utilizzare l'applicazione rsync
che si prende carico anche di tutti i check necessari per la copia. Considerando:
/media/storage -> /dev/mapper/storage-storage
/media/Volume -> /dev/sdb1
possiamo fare una copia di tutti i dati come segue (ci metterà un bel po'...)
$ rsync --progress -avzh /media/Volume /media/storage
Una volta completata la sincronizzazione dei dati siamo pronti per la rischiosissima estensione del LVM utilizzando il vecchio disco.
A questo punto è necessario preparare il disco all'inserimento nell'array di volumi fisici. La preparazione prevede ancra una volta l'utilizzo di fdisk
, come abbimao fatto in precedenza.
sudo fdisk /dev/sdb
;- utilizzare l'opzione
d
per eliminare le partizioni presenti; - definire una nuova partizione primaria con le opzioni
n
ep
(usare dimensioni predefinite); - definire la partizione di tipo LVM, usando l'opzione
t
e il valore8e
; - scrivere le modifiche su disco con l'opzione
w
.
In questo modo il volume è pronto per essere aggiunto all'array.
Aggiungiamo la partizione ai physical volume:
$ sudo pvcreate /dev/sdb1
Physical volume "/dev/sdb1" successfully created
poi aggiungiamo il physical volume al volume group:
$ sudo vgextend storage /dev/sdb1
Volume group "Mega" successfully extended
infine è necessario espandere il logical volume alla massima dimensione possibile:
$ sudo lvextend /dev/storage/storage /dev/sdb1
Extending logical volume root to ??.?? GiB
Logical volume root successfully resized
Possiamo vedere tutte le modifiche effettuate sfruttando i comandi pvscan
, vgdisplay
e lvdisplay
, come super-utente.
Ultimo step necessario a completare l'operazione è il ridimensionamento a caldo della partizione (on-line resizing) /dev/mapper/storage-storage
. Per fare questo è necessario astenersi dall'accesso alla partizione, sia in lettura che scrittura, e in generale lasciare operare il sistema senza interagire. L'operazione di resize è particolarmente onerosa dal punto di vista computazionale e può richiedere parecchio tempo.
Un blocco/spegnimento del sistema in questa fase potrebbe portare alla corruzione del filesystem e alla perdita di dati.
il comando per il resize del filesystem è il seguente:
$ sudo resize2fs /dev/storage/storage
resize2fs 1.41.12 (17-May-2010)
Filesystem at /dev/storage/storage is mounted on /mount/storage; on-line resizing required
old desc_blocks = 2, new_desc_blocks = 3
Performing an on-line resize of /dev/storage/storage to ????????? (4k) blocks.
The filesystem on /dev/storage/storage is now ????????? blocks long.
E con questo abbiamo finito!
Ricapitolando, i comandi fondamentali, secondo le convenzioni adottate.
$ sudo apt-get update && sudo apt-get install lvm2
: installare lvm2$ sudo fdisk /dev/sdc
: Eliminare tutte le partizioni, crearne una nuova primaria di tipo 8e$ sudo pvcreate /dev/sdc1
: creare il pv$ sudo vgcreate storage /dev/sdc1
: aggiungere pv al vg$ sudo lvcreate -l 100%VG -n storage storage
: creare il lv$ sudo mkfs.ext4 -c /dev/storage/storage
: formattare lv$ sudo mkdir /mount/storage
: creare la dir per il montaggio dei lv$ sudo nano /etc/fstab
: inserimento del montaggio nelle fstab$sudo mount -a
: montaggio di tutti i dev in fstab$ rsync --progress -avzh /media/Volume /media/storage
: copia dei file$ sudo fdisk /dev/sdb
: Eliminare tutte le partizioni, crearne una nuova primaria di tipo 8e$ sudo pvcreate /dev/sdb1
: creare il pv$ sudo vgextend storage /dev/sdb1
: estendere il vg$ sudo lvextend /dev/storage/storage /dev/sdb1
: estendere il lv$ resize2fs /dev/storage/storage
: estendere il fs