Introduzione a LVM – Logical Volume Manager (parte 2)

Questo articolo fa seguito alla prima parte pubblicata in precedenza

Vediamo il grande vantaggio di LVM con un caso pratico di utilizzo. Il problema è quello di cui si è parlato nell’introduzione della prima parte, ovvero una partizione a corto di spazio. Nella macchina di esempio si ha un’installazione standard di Debian su una macchina con un unico disco da 500Gb partizionato in questo modo:

# fdisk -l
Disk /dev/sda: 500.1 GB, 500107862016 bytes
255 heads, 63 sectors/track, 60801 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x00062b0c
Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          31      248976   83  Linux
/dev/sda2              32       60801   488135025    5  Extended
/dev/sda5              32       60801   488134993+  8e  Linux LVM

Questo schema di partizioni è necessario in quanto il kernel Linux non può fare boot da un volume LVM per cui si è creata una partizione di boot in sda1 da 250Mb circa montata su /boot e tutto il resto dello spazio si è dedicato ad una partizione per LVM. Nella macchina è presente un unico VG che viene suddiviso tra tutte le partizioni di sistema, utilizzando però solamente lo spazio necessario e lasciando una buona percentuale dello spazio sul VG libera per poterla assegnare in futuro dove fa più comodo. La configurazione del volume group è la seguente

# vgdisplay
  --- Volume group ---
  VG Name               host.example.com
  System ID
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  12
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                6
  Open LV               6
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               465.52 GB
  PE Size               4.00 MB
  Total PE              119173
  Alloc PE / Size       44509 / 173.86 GB
  Free  PE / Size       74664 / 291.66 GB
  VG UUID               02JBN6-1zmU-wLS9-OwWu-GgaI-hQBE-NsPInM

Una parentesi sui nomi da assegnare ai volume groups, in generale è buona norma come nome di volume un identificativo univoco, come ad esempio il nome dns della macchina su cui è montato. Questa pratica può tornare utile nel caso un volume group venga trasferito da una macchina ad un’altra, infatti in caso di due VG distinti con lo stesso nome su un unico sistema possono portare a problemi.

Chiusa la parentesi vediamo come è stato assegnato lo spazio disponibile nel VG per le varie partizioni di sistema

# lvdisplay
  --- Logical volume ---
  LV Name                /dev/host.example.com/root
  VG Name                host.example.com
  LV UUID                JPb2OM-9DFV-TRjF-0zVH-Bb0l-op0A-0GW6Vu
  LV Write Access        read/write
  LV Status              available
  # open                 1
  LV Size                1.27 GB
  Current LE             325
  Segments               2
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           254:0

  --- Logical volume ---
  LV Name                /dev/host.example.com/usr
  VG Name                host.example.com
  LV UUID                s5CnI7-daQD-MWCz-1T0a-KUnG-EHAC-xttn3i
  LV Write Access        read/write
  LV Status              available
  # open                 1
  LV Size                15.00 GB
  Current LE             3840
  Segments               2
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           254:1

  --- Logical volume ---
  LV Name                /dev/host.example.com/var
  VG Name                host.example.com
  LV UUID                ml8Zr0-CmRO-HQCs-ZyyO-0iZ4-5jMh-00UrVV
  LV Write Access        read/write
  LV Status              available
  # open                 1
  LV Size                100.00 GB
  Current LE             25600
  Segments               2
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           254:2

  --- Logical volume ---
  LV Name                /dev/host.example.com/swap_1
  VG Name                host.example.com
  LV UUID                LGZdu4-V8lT-K9om-dPot-ppeE-PUBp-w2IyDK
  LV Write Access        read/write
  LV Status              available
  # open                 2
  LV Size                2.59 GB
  Current LE             664
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           254:3

  --- Logical volume ---
  LV Name                /dev/host.example.com/tmp
  VG Name                host.example.com
  LV UUID                GhDlT3-jwj1-2dOr-i4ly-XY8D-XTdB-01b5Jm
  LV Write Access        read/write
  LV Status              available
  # open                 1
  LV Size                5.00 GB
  Current LE             1280
  Segments               2
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           254:4

  --- Logical volume ---
  LV Name                /dev/host.example.com/home
  VG Name                host.example.com
  LV UUID                222F4B-NQPL-TUDz-wOSs-D4h4-XfmH-4LLuWM
  LV Write Access        read/write
  LV Status              available
  # open                 1
  LV Size                50.00 GB
  Current LE             12800
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           254:5

# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/host.example.com-root
                      1.3G  108M  1.1G   9% /
tmpfs                 2.0G     0  2.0G   0% /lib/init/rw
udev                   10M  616K  9.4M   7% /dev
tmpfs                 2.0G     0  2.0G   0% /dev/shm
/dev/sda1             236M   22M  202M  10% /boot
/dev/mapper/host.example.com-home
                       50G   17G   31G  36% /home
/dev/mapper/host.example.com-tmp
                      4.9G   12M  4.6G   1% /tmp
/dev/mapper/host.example.com-usr
                       15G  874M   14G   7% /usr
/dev/mapper/host.example.com-var
                       99G  617M   93G   1% /var

Tutte le partizioni di sistema sono state ricavate dallo stesso VG ad eccezione della partizione di boot, lo spazio libero in ogni partizione si può vedere con il comando df. Nella configurazione di esempio si ha che il VG ha ancora a disposizione quasi 300GB non assegnati e che la partizione montata su / non ha moltissimo spazio riservato per essa, per cui si presta ad essere ridimensionata prendendo un po di spazio dal volume group. Vediamo come con due semplici comandi eseguiti come utente root si può eseguire questa operazione al volo, senza neanche bisogno di smontare la partizione. Il primo passo da fare è quello di aumentare la dimensione del logical volume, questa operazione viene eseguita tramite il comando lvextend. Questo comando prende come argomento il nome del logical volume da ridimensionare e tramite una delle due opzioni -l o -L si può specificare come intervenire sulla dimensione dell’LV. Nel nostro caso andiamo ad aumentare di 1GB la dimensione del volume con

# lvextend -L +1GB /dev/host.example.com/root
  Extending logical volume root to 2.27 GB
  Logical volume root successfully resized

Il comando è stato eseguito e ci viene mostrata la nuova dimensione del volume in output. Il flag L serve per specificare le dimensioni in unità binarie, come argomento di questa opzione si deve passare un numero, opzionalmente seguito da un suffisso per l’unità di misura. Tale numero viene interpretato come dimensione voluta per il volume. Se invece, come nell’esempio, si mette un + davanti alla dimensione indicata la dimensione del volume verrà incrementata di tale grandezza. Usando invece il flag -l l’unità di misura presa in considerazione sarà il logical extent, ovvero il frammento minimo in cui è suddiviso un volume group.

Siamo a metà dell’opera, per adesso abbiamo solamente ingrandito il volume, ma la partizione su tale volume ha ancora la vecchia dimensione, pertanto lo spazio libero è rimasto immutato. Quello che dobbiamo fare adesso è espandere il filesystem che si trova sul volume che abbiamo ingrandito in maniera tale da fargli usare tutto lo spazio a disposizione. Il filesystem ext3 supporta l’online resizing, ovvero è possibile ridimensionarlo in tempo reale senza neppure smontarlo. Tuttavia nell’eseguire queste operazioni è bene accertarsi che il filesystem non contenga errori per cui prima di eseguire il resize controlliamo il filesystem con

# e2fsck -n /dev/host.example.com/root
e2fsck 1.41.3 (12-Oct-2008)
Warning!  /dev/host.example.com/root is mounted.
Warning: skipping journal recovery because doing a read-only filesystem check.
/dev/host.example.com/root: clean, 10789/329912 files, 151503/1331200 blocks

Importantissimo il flag -n che dice ad fsck di lavorare in modailtà read-only, infatti a noi interessa solamente conoscere lo stato del filesystem che in questo caso risulta essere clean (In alternativa per conoscere lo stato del filesystem è possibile eseguire il comando dumpe2fs -h /dev/host.example.com/root | grep state. Per cui ci accingiamo ad eseguire il resize vero e proprio con il comando resize2fs. Questo comando invocato con il solo nome della partizione da ridimensionare la va ad espandere in modo tale da occupare tutto lo spazio a disposizione

# resize2fs /dev/host.example.com/root
resize2fs 1.41.3 (12-Oct-2008)
Filesystem at /dev/host.example.com/root is mounted on /; on-line resizing required
old desc_blocks = 6, new_desc_blocks = 10
Performing an on-line resize of /dev/host.example.com/root to 2379776 (1k) blocks.
The filesystem on /dev/host.example.com/root is now 2379776 blocks long.

A questo punto abbiamo finito, possiamo controllare che il risultato ottenuto sia quello che ci eravamo prefissati nuovamente con il comando df

# df -h /
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/host.example.com-root
                      2.2G  108M  2.0G   6% /

Ridurre la dimensione del filesystem

Il comando complementare per ridurre la dimensione di un LV è lvreduce che ha sintassi identica ma nel specificare la grandezza dell’LV si può usare un – per sottrarre la grandezza alla dimensione corrente del volume.

Mentre non ci sono controindicazioni ad espandere un volume, bisogna fare molta attenzione quando lo si riduce, in quanto è nostro compito compattare il filesystem che si trova su quel volume prima della riduzione del volume, altrimenti si andrà quasi sicuramente incontro ad una perdita di dati.

Inoltre il resize online dei filesystem ext3 non è supportato, per cui è necessario smontare il filesystem prima di ridimensionarlo.

In ogni caso i passi da eseguire per ridurre un filesystem su ext3 sono i seguenti:

  • smontaggio del volume (umount)
  • controllo d’integrità forzato del filesystem (e2fsck -f <device>)
  • ridimensionamento del filesystem (resize2fs <device> <size>
  • ridimensionamento partizione (lvreduce)

C’è da prestare massima attenzione nel passare la stessa dimensione finale ai comandi resize2fs e lvreduce, altrimenti perderete sicuramente dei dati. Un trucco per evitare problemi potrebbe essere il seguente: invocate resize2fs con un parametro size che sia minore della dimensione finale che volete ottenere per il filesystem. Poi eseguite lvmreduce con il valore finale desiderato, ed infine resize2fs senza specificare il parametro size.

Ad esempio se volete ridimensionare una partizione da 50GB a 20GB (supponendo che lo spazio occupato sia intorno ai 18GB o meno) eseguite questa serie di comandi dopo aver smontato e verificato il filesystem

# resize2fs /dev/vgname/lvname 19G
# lvreduce -L 20G /dev/vgname/lvname
# resize2fs /dev/vgname/lvname

C’è da notare che anche se avrete preso tutte queste precauzioni, lvmreduce vi chiederà di confermare il comando in quanto potenzialmente pericoloso, è perfettamente normale che sia così, non state facendo nulla di sbagliato.

Conclusioni

Abbiamo visto come ridimensionare al volo un filesystem su LVM e quali comandi utilizzare per espandere il filesystem e per manipolare le varie entità create con LVM.

Per quanto riguarda l’integrità dei dati c’è da sapere che LVM non è un sistema con ridondanza, per cui in una configurazione semplice unire due o più dischi porterà quasi certamente alla perdita di dati in caso di rottura di un disco.

Per risolvere questo problema l’uso di LVM quando è richiesta alta affidabilità dei dati va abbinato ad una soluzione di tipo RAID 1 oppure RAID 5 (da evitare il livello 0 che fa più o meno lo stesso lavoro di LVM ma con meno flessibilità).

Per approfondire questo argomento e vedere esempi di utilizzo di tutti i comandi del pacchetto lvm2 vi rimando al tutorial lvm di howtoforge. Questo tutorial, oltre ad essere molto approfondito mette a disposizione un’immagine VMWare con una macchina Debian configurata per supportare LVM e RAID utilissima per fare esperimenti.

You can leave a response, or trackback from your own site.

Leave a Reply

Subscribe to RSS Feed