LVM (Italiano)
Questo articolo fornirà un esempio su come installare e configurare Arch Linux utilizzando il Logical Volume Manager (LVM).
Introduzione
Wikipedia:Logical Volume Manager (Linux)
LVM (Logical Volume Management) utilizza la funzione di device-mapper del kernel Linux per fornire un sistema di partizioni che sia indipendente dalla sottostante struttura del disco fisico. Con LVM è possibile crere uno spazio di archiviazione astratto ed avere "partizioni virtuali" il che rende più facile ingrandirene o ridurne la dimensione (sempre che il filesystem che vi risede lo permetta) permette inoltre di aggiungere/rimuovere partizioni senza preoccuparsi di avere spazio contiguo a disposizione su uno specifico disco, senza incorrere nel problema di effettuare un fdisk su un disco in uso (senza preoccuparsi se il kernel stia usando la vecchia o la nuova tavola delle partizioni) e senza aver bisogno di spostare altre partizioni dal loro posto. Questo è una semplificazione nella gestione: non fornisce nessuna sicurezza per i dati. Comunque, si integra bene con le altre due tecnologie che vengono utilizzate.
Nota che LVM non è utilizzato per la partizione /boot
, a causa di problemi con il bootloader.
Le componenti base di LVM sono:
- Volume Fisico(Physical volume (PV)): Partizione del disco(oppure anche l'intero disco o un file di loopback) sul quale è possibile creare un gruppo di volumi. Ha un header speciale ed è diviso in estensioni fisiche. Si pensi al volume fisico come grandi blocchi che possono essere usati per costruire il nostro hard drive.
- Gruppo di Volumi(Volume group (VG)): Un insieme di volumi fisici usati come un unico volume di archiviazione(come un disco). Essi contengono i volumi logici.Si pensi ai gruppi di volumi come agli hard drive.
- Volume Logico(Logical volume (LV)): Una "partizione virtuale/logica" che risiede in un volume logico ed è composta da estensioni fisiche. Si pensi ai volumi logici come una normale partizione.
- Estensione Fisica(Physical extent (PE)): Una piccola porzione di un disco (solitamente 4MB) che può assegnata ad un volume logico. Si pensi alle estensioni fisiche come porzioni di dischi che posso essere allocate ad una qualsiasi partizione.
Con LVM sarà più facile gestire le proprie partizioni (volumi logici) rispetto ad un disco partizionato normalmente. Ad esempio, sarà possibile:
- Usare un qualsiasi numero di dischi come un grande disco(VG)
- Avere partizioni(LV) sparse sopra a diversi dischi (possono essere grandi quanto la capacità di archiviazione di tutti i dischi insieme)
- Ridimensionare/creare/eliminare partizioni(LV) e dischi(VG) come si vuole (non esiste il vincolo della posizione dei volumi logici nel gruppo di volumi come invece per le normali partizioni)
- Ridimensionare/creare/cancellare partizioni(LV) e dischi(VG) online (i filesystem che risiedono su di essi dovranno essere ridimensionati, ma solo alcuni supportano il ridimensionamento online)
- Chiamare i propri dischi(VG) e le proprie partizioni(LV) come si desidera
- Creare piccole partizioni(LV) e ridimensionarle "dinamicamente" appena esse si riempono (l'allargamento del filesystem dovrà essere eseguito a mano, ma può essere effettuato online con alcuni filesystem)
- ...
Esempio:
Dischi fisici Disco1 (/dev/sda): _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |Partizione1 50GB (Volume fisico) |Partizione2 80GB (Volume fisico) | |/dev/sda1 |/dev/sda2 | |_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | Disco2 (/dev/sdb): _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |Partizione1 120GB (Volume fisico) | |/dev/sdb1 | | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ __ _ _|
Volumi logici LVM Gruppo di volumi1 (/dev/MyStorage/ = /dev/sda1 + /dev/sda2 + /dev/sdb1): _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |Volume logico1 15GB |volume logico2 35GB |Volume logico3 200GB | |/dev/MyStorage/rootvol|/dev/MyStorage/homevol |/dev/MyStorage/mediavol | |_ _ _ _ _ _ _ _ _ _ _ |_ _ _ _ _ _ _ _ _ _ _ _ _ |_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |
Per riassumere: con LVM si può utilizzare tutto il proprio spazio di archiviazione come un unico grande disco (gruppo di volumi) ed avere una maggiore flessibilità nella gestione delle partizioni (volumi logici).
Vantaggi
Qui sono elencate alcune cose che è possibile realizzare con LVM che non possono (oppure non sono facilmente realizzabili) con il semplice uso di mdadm, partizioni MBR, partizioni GPT, parted/gparted e strumenti a livello file come rsync.
- Ridimensionamento online/live.
- Non sono più necessarie partizioni estese (non lo sono nemmeno per i partizionamenti GPT)
- Ridimensionare le partizioni senza il problema del loro ordine sul disco (non è necessario preoccuparsi dello spazio contiguo disponibile)
- Migrazione online/live delle partizioni usate da servizi senza dover riavviare i servizi.
Questo può essere molto utile su di un server, senza interfaccia grafica quindi, ma sarà necessario decidere se le sue caratteristiche valgono l'astrazione.
Installazione
Prima poter procedere sarà necessario caricare il modulo appropriato:
# modprobe dm-mod
Se Arch Linux è già installata e si vuole solamente provare/aggiungere una partizione usando LVM, saltare al paragrafo Partizionare i dischi.
Installare Arch Linux su LVM
Prima di eseguire gli script di installazione di Arch Linux (/arch/setup
), sarà necessario partizionare il disco con cfdisk
(oppure un altro strumento a piacimento). Dato che grub legacy (GRUB avente un numero versione minore di 1.0) non può effettuare il boot da volumi logici LVM non sarà possibile avere la partizione /boot
su LVM, creare quindi una partizione dedicata. 100 MB dovrebbero bastare. Una alternativa consiste nell'utilizzare LILO oppure GRUB versione 1.95 o maggiore.
Partizionare i dischi
Successivamente sarà necessario creare una partizione per LVM. Il suo filesystem dovrebbe essere 'Linux LVM', usare quindi l'identificazione di partizione 0x8e (tipo di filesystem: 8e). Sarà necessario creare solo una partizione LVM su ogni disco che si intende utilizzare con LVM. I dischi logici risiederanno all'interno di queste partizioni quindi scegliere le dimensioni in modo adeguato. Se si intende utilizzare solo LVM e nessuna partizione esterna, usare tutto lo spazio libero su ogni disco.
Creare i volumi fisici(Physical volumes)
Adesso sarà necessario inizializzare le partizioni così che possano essere utilizzate da LVM. Usare fdisk -l
per determinare quali partizioni hanno come tipo di filesystem 'Linux LVM' e creare il volume fisico su di esse:
# pvcreate /dev/sda2
Sostituire /dev/sda2
con le partizioni su cui si vuole creare il volume fisico. Questo comando crea un intestazione su tutte le partizioni così che possano essere usate per LVM.
Si possono monitorare i volumi fisici creati con il comando:
# pvdisplay
pvcreate --dataalignment 1m /dev/sda2
(per cancellare block size < 1MiB), consultare ad esempio questa discussione
Creare gruppi di volumi (Volume group)
Il prossimo passo consiste nel creare un gruppo di volumi su questo volume fisico. Prima si dovrà creare un gruppo di volumi su una delle nuove partizioni e successivamente aggiungere gli altri volumi fisici che lo comporranno:
# vgcreate VolGroup00 /dev/sda2 # vgextend VolGroup00 /dev/sdb1
Sarà possibile utilizzare un qualsiasi altro nome invece di VolGroup00 per il gruppo di volumi durante la sua creazione. Sarà possibile controllare come si stanno espandendo i gruppi di volumi con il comando:
# vgdisplay
Creare i volumi logici (Logical Volumes)
Adesso verranno creati i volumi logici su questo gruppo di volumi. Creare il volume logico con il seguente comando specificando il nome del volume logico, la sua dimensione, ed il gruppo di volumi dove risiederà:
# lvcreate -L 10G VolGroup00 -n lvolhome
Questo comando creerà un volume logico al quale sarà possibile accedere con /dev/mapper/VolGroup00-lvolhome
o /dev/VolGroup00/lvolhome
. Come per il gruppo di volumi, sarà possibile utilizzare qualsiasi nome per il volume logico durante la sua creazione.
Per creare una partizione di swap su di un volume logico, sarà necessario un argomento aggiuntivo:
# lvcreate -C y -L 10G VolGroup00 -n lvolswap
L'opzione -C y
è usata per creare una partizione contigua, cioè la partizione di swap non sarà allocata su più di un disco oppure su estensioni fisiche (PE) non contigue.
Se si vuole riempire tutto lo spazio libero rimasto in un gruppo di volumi, utilizzare il seguente comando:
# lvcreate -l +100%FREE VolGroup00 -n lvolmedia
Si può controllare i volumi logici creati con:
# lvdisplay
Creare i filesystem ed effettuare il mount dei volumi logici
Adesso i volumi logici dovrebbero essere situati in /dev/mapper/
e /dev/NomeGruppoDiVolumi
. Se non fosse possibile trovarli, usare il prossimo comando per caricare il modulo per la creazione dei nodi dei device e per rendere accessibili i gruppi di volumi:
# modprobe dm-mod # vgscan # vgchange -ay
Adesso sarà possibile creare i filesystem sui volumi logici ed effettuarne il mount come per le normali partizioni (se si sta installando Arch Linux, fare riferimento al paragrafo montare il file system per maggiori dettagli):
# mkfs.ext3 /dev/mapper/VolGroup00-lvolhome # mount /dev/mapper/VolGroup00-lvolhome /home
Se si sta installando Arch Linux, avviare
/arch/setup
, selezionare Prepare Hard Drive direttamente al passaggio 3 Set Filesystem Mountpoints e leggere le seguenti sezioni prima di procedere con l'installazione!
Impostare i filesystem ed i punti di mount
- Quando si sceglie il punto di mount, selezionare il volume logico appena creato (utilizzare:
/dev/mapper/Volgroup00-lvolhome
).
NON selezionare le partizioni usate per creare il volume logico (non utilizzare:/dev/sda2
).
Configurare il sistema
L'opzione use_lvmetad = 1
deve essere impostata nel file /etc/lvm/lvm.conf
. Come di default nelle nuove configurazioni fornite dal pacchetto lvm2 - nel caso sia presente il file lvm.conf.pacnew
, sarà necessario confrontare i cambiamenti dei file.
In caso si abbia necessità del monitoraggio dei volumi(necessario per l'uso degli snapshots):
# systemctl enable lvm-monitoring.service
Se si utilizza LVM su un device criptato, sarà necessario utilizzare invece:
# systemctl enable lvm-on-crypt.service
Oppure, se si utilizza sysvinit, modificare il valore di USELVM
in modo appropriato:
# vim /etc/rc.conf
USELVM="yes"
A partire dal 02.12.2013 saranno necessarie le segueti modifiche. Sarà necessario assicurarsi che gli hook lvm2
ed udev
in mkinitcpio siano abilitati.
/etc/mkinitcpio.conf
HOOKS="base udev ... lvm2 filesystems"
Assicurarsi anche che sia abilitato il modulo dm_mod
.
/etc/mkinitcpio.conf:
MODULES="dm_mod ..."
In caso siano state effettuate delle modifiche al file, sarà necessario ricreare l'initramfs, in modo da renderle effetive.
Può essere necessario aggiongere alle opzioni del kernel, dolvm
. root=
dovrebbe essere impostato sul volume logico, ad esempio /dev/mapper/{vg-name}-{lv-name}
Configurazione
Ingrandire un volume logico
Per ingrandire un volume logico prima sarà necessario ingrandire il volume logico e poi il filesystem per poter usare il nuovo spazio libero. Ipotizzando di avere un volume logico di 15GB con un filesystem ext3 e si vuole ingrandirlo a 20GB. Saranno necessario seguire i seguenti passaggi:
# lvextend -L 20G VolGroup00/lvolhome (oppure lvresize -L +5G VolGroup00/lvolhome) # resize2fs /dev/VolGroup00/lvolhome
Sarà possibile usare lvresize
invece di lvextend
.
Se si vuole utilizzare tutto lo spazio libero in un gruppo di volumi, usare il seguente comando:
# lvextend -l +100%FREE VolGroup00/lvolhome
Ridurre un volume logico
Dato che probabilmente il filesystem sarà grande quanto il volume logico su cui risiede, sarà necessario prima ridurre il filesystem e dopo il volume logico. A seconda del filesystem utilizzato, potrebbe essere necessario effettuare l'umount prima. Ipotizzando di avere un volume logico di 15GB avente un filesystem ext3 e si desidera ridurlo a 10GB. Sarà necessario seguire i seguenti passaggi:
# resize2fs /dev/VolGroup00/lvolhome 9G # lvreduce -L 10G VolGroup00/lvolhome (oppure lvresize -L -5G VolGroup00/lvolhome) # resize2fs /dev/VolGroup00/lvolhome
In questo caso il filesystem viene ridotto in maniera maggiore di quanto viene ridotto il volume logico così non verrà accidentalmente tagliata fuori la fine del filesystem. Dopo sarà possibile espandere il filesystem fino a riempire lo spazio libero rimasto sul volume logico. Può essere utilizzato lvresize
invece di lvreduce
.
- Non ridurre la dimensione del filesystem fino ad essere minore del volume dei dati in esso contenuti altrimenti si rischia una perdita di dati.
- Non tutti i filesystem supportano la riduzione senza perdita di dati e/o la riduzione online.
Rimuovere volumi logici
Prima, identificare il nome del volume logico che si desidera rimuovere. Si può ottenere una lista di tutti i volumi logici presenti nel sistema con:
# lvs
Poi, controllare il punto di mount per il volume logico scelto...:
$ df -h
... ed effettuare l'umount:
# umount /punto_di_mount
Infine, rimuovere il volume logico:
# lvremove /dev/yourVG/yourLV
Confermare premendo y
e sarà rimosso.
Non dimenticare di aggiornare il file /etc/fstab
!
Sarà possibile verificare la rimozione del volume logico utilizzando nuovamente come utente root il comando "lvs" (vedere il primo passaggio di questa sezione).
Aggiungere un volume fisico ad un gruppo di volumi
Per prima cosa creare un volume fisico sulla periferica a blocchi che verrà utilizzata, successivamente estendere il gruppo di volumi:
# pvcreate /dev/sdb1 # vgextend VolGroup00 /dev/sdb1
Questo aumenterà il numero totale di estensioni fisiche(Piscal Extens) del gruppo di volumi, che potranno essere allocate dai volumi logici.
8e
per il partizionamento MBR, e 8e00
per il partizionamento GPT.Rimuovere una partizione da un gruppo di volumi
Tutti i dati su questa partizione devono essere spostati su di una altra partizione. Fortunatamente, LVM rende questo più facile:
# pvmove /dev/sdb1
Se si desidera che i dati risiedano su di un determinato volume fisico, specificarlo come secondo argomento al comando pvmove
:
# pvmove /dev/sdb1 /dev/sdf1
Poi il volume fisico che deve essere rimosso dal gruppo di volumi:
# vgreduce myVg /dev/sdb1
Oppure rimuovere tutti i volumi fisici vuoti:
# vgreduce --all vg0
Ed infine, se si desidera utilizzare le partizioni in altro modo, per evitare che LVM veda la partizione come un volume fisico:
# pvremove /dev/sdb1
Snapshots
Introduzione
LVM permette di creare uno snapshot del sistema in maniera molto più efficiente dei tradizionali metodi di backup. Questa efficenza è data dall'utilizzo della policy COW (copy-no-write). Lo snapshot iniziale conterrà hard-link agli inode dei dati attuali. Fino a che i dati restano invariati, lo snapshot conterrà solo i link agli inode e non i dati stessi. Quando verrà modificato un file o una cartella ai quali lo snapshot punta, LVM automaticamente clonerà i dati, la vecchia copia referenziata dallo snapshot, e la nuova copia referenziata dall'attuale sistema. In questo modo, è possibile effettuare uno snapshot di un sistema di 35GB di dati usando solamente 2GB di spazio libero fino a che le modifiche effettuate saranno inferiori ai 2 GB (in entrambi l'originale e lo snapshot).
Configurazione
Creare uno volume logico snapshot come i normali volumi logici.
# lvcreate --size 100M --snapshot --name snap01 /dev/mapper/vg0-pv
Con questo volume, si potranno modificare meno di 100 M di dati, prima che il volume si riempa.
E’ importante inserire il modulo dm-snapshot nell’array MODULES nel file /etc/mkinitcpio.conf
, altrimenti il sistema non si avvierà. Se si effettua la modifica ad un sistema già installato ricostruire l’immagine con il comando:
# mkinitcpio -g /boot/initramfs-linux.img
Todo: script per automatizzare lo snapshot della partizione di root prima degli aggiornamenti, per tornare allo stato precedente... aggiornare il file menu.lst
per effettuare il boot dagli snapshot (articolo separato?)
gli snapshot sono principalmente usati per fornire una copia congelata del filesystem per effetuare i backup; un backup impiega due ore e fornisce un immagine più consistente del filesystem piuttosto che effettuare il backup diretto della partizione.
Risoluzione di problemi
I comandi LVM commands non funzionano
- Caricare il modulo appropriato:
# modprobe dm_mod
- Provare ad anteporre lvm ai comandi in questo modo:
# lvm pvdisplay
Nela pagina Set Filesystem Mountpoints i volumi logici non sono mostrati
Se si sta installando un sistema dove è già presente un gruppo di volumi, potrebbe non essere accessibile anche dopo il comando "modprobe dm-mod" ed i volumi logici non vengono rilevati.
In questo caso, potrebbe essere necessario eseguire:
# vgscan
oppure:
# vgchange -ay <volgroup>
in modo da attivare il gruppo di volumi e rendere i volumi logici accessibili.
LVM su periferiche rimovibili
Sintomi:
~$ sudo vgscan Reading all physical volumes. This may take a while... /dev/backupdrive1/backup: read failed after 0 of 4096 at 319836585984: Input/output error /dev/backupdrive1/backup: read failed after 0 of 4096 at 319836643328: Input/output error /dev/backupdrive1/backup: read failed after 0 of 4096 at 0: Input/output error /dev/backupdrive1/backup: read failed after 0 of 4096 at 4096: Input/output error Found volume group "backupdrive1" using metadata type lvm2 Found volume group "networkdrive" using metadata type lvm2
Cause:
- Rimuovendo un disco esterno con LVM senza disattivare il gruppo(i) di volumi prima. Prima di disconnettere, assicurarsi di:
# vgchange -an <volume group name>
Soluzione: (ipotizzando che sia già stato provato ad attivare il gruppo di volumi con il comando vgchange -ay <vg>, e siano stati restituiti degli errori di Input/output
# vgchange -an <volume group name>
- Scollegare il disco esterno ed aspettare alcuni minuti
# vgscan # vgchange -ay <volume group name>
Altre risorse
- LVM2 Resource Page su SourceWare.org
- LVM HOWTO articolo del Linux Documentation Project
- LVM articolo del Wiki di Gentoo
- Mirrors vs. MD Raid 1[link interrotto 2020-08-02] post by Josh Bryan