Questa è una guida completa per principianti a LVM (Logical Volume Management) in Linux.
In questo tutorial imparerai il concetto di LVM, i suoi componenti e perché dovresti usarlo.
Non mi limiterò alla sola spiegazione teorica. Mostrerò anche esempi pratici per la creazione e la gestione di LVM in Linux.
In breve, ti fornirò tutte le informazioni necessarie per iniziare a lavorare con LVM nel mondo reale.
Cos'è LVM in Linux?
LVM sta per Logical Volume Management. Si tratta di un metodo alternativo di gestione dei sistemi di storage rispetto a quello tradizionale basato su partizioni. In LVM, invece di creare partizioni, crei volumi logici e quindi puoi montare facilmente quei volumi nel tuo filesystem come faresti con una partizione del disco.
Un'eccezione all'istruzione precedente è che non è possibile utilizzare i volumi logici per/boot
. Questo perché GRUB (il bootloader più comune per Linux) non può leggere dai volumi logici. La nota alternativa a GRUB, systemd-boot, d'altra parte, legge solo i filesystem vfat, quindi non funzionerà nemmeno. Componenti di LVM
Ci sono tre componenti principali di LVM:
- Volumi fisici
- Gruppi di volumi
- Volumi logici
Sebbene l'elenco sia composto da tre componenti, solo due di essi sono controparti dirette del sistema di partizionamento. La tabella seguente lo registra.
Sistema di partizionamento del disco | LVM |
---|---|
Partizioni | Volumi logici |
Dischi | Gruppi di volumi |
I volumi fisici non hanno una controparte diretta, ma ne parlerò presto.
Perché usare LVM?
Il vantaggio principale di LVM è quanto sia facile ridimensionare un volume o un gruppo di volumi. Astrae tutte le parti brutte (partizioni, dischi grezzi) e ci lascia con un pool di archiviazione centrale con cui lavorare.
Se hai mai provato l'orrore del ridimensionamento delle partizioni, vorresti usare LVM.
Preparazione del laboratorio per l'hands-on
Questo articolo non è solo teoria. Mostrerò esempi di comandi effettivi lungo il percorso e il modo migliore per imparare qualcosa è lavorarci sopra, in modo pratico. Per questo, ti consiglio di utilizzare una macchina virtuale.
Per aiutarti ho già preparato un semplice Vagrantfile che puoi usare per far girare una macchina virtuale molto leggera con VirtualBox. Questa macchina virtuale ha tre dischi aggiuntivi che tu e io possiamo usare per gli esempi di comandi seguenti.
Crea una directory da qualche parte nel tuo filesystem e salva quanto segue in un file, chiamato Vagrantfile
.
Vagrant.configure "2" do |config|
config.vm.box = "ubuntu/focal64"
config.vm.hostname = "lvm"
3.times {|i| config.vm.disk :disk, size: "5GB", name: "drive-#{i}"}
config.vm.provider :virtualbox do |machine|
machine.memory = 1024
machine.cpus = 1
machine.customize ["modifyvm", :id, "--cpuexecutioncap", "50"]
end
end
# vi: set ft=ruby
Oppure, se lo desideri, puoi utilizzare wget
o curl
per scaricare il file dal mio gist.
wget https://gist.githubusercontent.com/debdutdeb/98ed1b6aef36885d07ce8247188dfd5e/raw/524259da5dfa2d8750883d01c8159829729e224d/Vagrantfile
Assicurati di aver installato Vagrant e VirtualBox.
Una volta che il Vagrantfile è a posto, imposta la variabile d'ambiente VAGRANT_EXPERIMENTAL
su disks
.
export VAGRANT_EXPERIMENTAL=disks
Infine, avvia la macchina virtuale usando il seguente comando (assicurati di trovarti nella stessa directory di Vagrantfile):
vagrant up
Una volta che la macchina è in esecuzione, puoi usare vagrant ssh
in SSH ed esegui i comandi di esempio da questo articolo.
Ricordati di eseguire vagrant destroy
dalla stessa directory del file Vagrant dopo che hai finito.
Installazione di LVM
Prima di poter utilizzare uno qualsiasi dei comandi, devi installare lvm2
pacchetto. Questo dovrebbe essere preinstallato nella maggior parte delle moderne distribuzioni, in particolare quelle basate su Ubuntu. Ma ancora, dovevo menzionarlo prima di andare avanti. Per installare lvm2
, consulta la documentazione della tua distribuzione.
Manuale con LVM
Per questa procedura dettagliata, ho costruito una macchina virtuale con 40G di archiviazione principale (non importante) e tre dischi esterni di dimensioni 5G. Le dimensioni di questi dischi sono arbitrarie.
[email protected]:~$ lsblk -o name,size,fstype
NAME SIZE FSTYPE
loop0 55.5M squashfs
loop1 32.3M squashfs
loop2 70.4M squashfs
sda 40G
└─sda1 40G ext4
sdb 10M iso9660
sdc 5G
sdd 5G
sde 5G
Come puoi vedere i dispositivi che userò sono sdc
, sdd
e sde
.
Ricordi che ti ho detto che ci sono tre componenti principali di LVM?
- Volumi fisici
- Gruppi di volumi
- Volumi logici
È ora di vederli uno per uno.
1. Volumi fisici
La prima cosa che devi sapere su LVM sono i volumi fisici. I volumi fisici sono le materie prime o gli elementi costitutivi utilizzati per ottenere l'astrazione che sono i volumi logici. In parole più semplici, i volumi fisici sono l'unità logica di un sistema LVM.
Un volume fisico può essere qualsiasi cosa, un disco grezzo o una partizione del disco. La creazione e l'inizializzazione di un volume fisico sono la stessa cosa. Entrambi significano che stai solo preparando gli elementi costitutivi (ad esempio partizioni, dischi) per ulteriori operazioni. Questo diventerà più chiaro in un attimo.
Utilità: Tutte le utilità che gestiscono i volumi fisici iniziano con le lettere pv
per P hysical V olume. Per esempio. pvcreate
, pvchange
, pvs
, pvdisplay
ecc.
Creazione di volumi fisici
Puoi creare un volume fisico utilizzando un disco grezzo non partizionato o le partizioni stesse.
Come accennato in precedenza, ho tre unità esterne collegate alla mia macchina virtuale, iniziamo con /dev/sdc
.
Usiamo il pvcreate
comando per creare un volume fisico. Basta passare il nome del dispositivo e nient'altro.
sudo pvcreate /dev/sdc
Dovresti vedere qualcosa del genere:-
[email protected]:~$ sudo pvcreate /dev/sdc
Physical volume "/dev/sdc" successfully created.
Successivamente partizionerò /dev/sdd
in parti uguali. Usa qualsiasi strumento, cfdisk
, parted
, fdisk
ecc, ci sono molti strumenti per ottenere questo lavoro.
[email protected]:~$ lsblk -o name,size,fstype | grep sdd
sdd 5G
├─sdd1 2.5G
└─sdd2 2.5G
Ora puoi creare rapidamente altri due volumi fisici da queste due partizioni in un unico passaggio, passare entrambi questi dispositivi a pvcreate
subito.
sudo pvcreate /dev/sdd1 /dev/sdd2
Dai un'occhiata:-
[email protected]:~$ sudo pvcreate /dev/sdd1 /dev/sdd2
Physical volume "/dev/sdd1" successfully created.
Physical volume "/dev/sdd2" successfully created.
Elencare i volumi fisici disponibili
Ci sono tre comandi che puoi usare per ottenere l'elenco dei volumi fisici disponibili, pvscan
, pvs
e pvdisplay
. In genere non è necessario passare nulla a questi comandi.
pvscan
:-
[email protected]:~$ sudo pvscan
PV /dev/sdc lvm2 [5.00 GiB]
PV /dev/sdd1 lvm2 [2.50 GiB]
PV /dev/sdd2 lvm2 [<2.50 GiB]
Total: 3 [<10.00 GiB] / in use: 0 [0 ] / in no VG: 3 [<10.00 GiB]
pvs
:-
[email protected]:~$ sudo pvs
PV VG Fmt Attr PSize PFree
/dev/sdc lvm2 --- 5.00g 5.00g
/dev/sdd1 lvm2 --- 2.50g 2.50g
/dev/sdd2 lvm2 --- <2.50g <2.50g
pvdisplay
:-
[email protected]:~$ sudo pvdisplay
"/dev/sdc" is a new physical volume of "5.00 GiB"
--- NEW Physical volume ---
PV Name /dev/sdc
VG Name
PV Size 5.00 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID SzSkdD-xKYa-4y7P-teyU-481p-uiQ8-qieMJJ
"/dev/sdd1" is a new physical volume of "2.50 GiB"
--- NEW Physical volume ---
PV Name /dev/sdd1
VG Name
PV Size 2.50 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID 553Iy4-JJ21-LfIw-udtO-j9Cd-7gFS-iXXFVS
"/dev/sdd2" is a new physical volume of "<2.50 GiB"
--- NEW Physical volume ---
PV Name /dev/sdd2
VG Name
PV Size <2.50 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID bf7ghn-QkPm-EUdp-GdyW-shMG-5sMn-VhNtYB
Come puoi vedere, oltre a elencare solo i volumi fisici, questi comandi ti danno anche un sacco di altre informazioni su questi volumi.
Rimozione di un volume fisico
Puoi rimuovere un volume fisico con pvremove
comando. Proprio come pvcreate
, passa semplicemente i dispositivi (che sono inizializzati come volumi fisici) a pvremove
comando.
A scopo dimostrativo, rimuoverò /dev/sdd2
dall'elenco.
sudo pvremove /dev/sdd2
L'output dovrebbe essere identico a questo:-
[email protected]:~$ sudo pvremove /dev/sdd2
Labels on physical volume "/dev/sdd2" successfully wiped.
Ora elenca i volumi fisici con sudo pvs
[email protected]:~$ sudo pvs
PV VG Fmt Attr PSize PFree
/dev/sdc lvm2 --- 5.00g 5.00g
/dev/sdd1 lvm2 --- 2.50g 2.50g
/dev/sdd2
non c'è più.
2. Gruppi di volumi
I gruppi di volumi sono raccolte di volumi fisici. È il livello di astrazione successivo in LVM. I gruppi di volumi sono il pool di archiviazione che combina la capacità di archiviazione di più dispositivi di archiviazione non elaborati.
Utilità: Tutti i nomi di utilità dei gruppi di volumi iniziano con vg
, sta per V olume G gruppo, ad es. vgcreate
, vgs
, vgrename
ecc.
Creazione di gruppi di volumi
I gruppi di volumi vengono creati utilizzando vgcreate
comando. Il primo argomento per vgcreate
è il nome che vuoi assegnare a questo gruppo di volumi e il resto è l'elenco dei volumi fisici che eseguiranno il backup del pool di archiviazione.
sudo vgcreate lvm_tutorial /dev/sdc /dev/sdd1
Esempio:-
[email protected]:~$ sudo vgcreate lvm_tutorial /dev/sdc /dev/sdd1
Volume group "lvm_tutorial" successfully created
Elencare i gruppi di volumi
Elencare i gruppi di volumi è simile all'elencare i volumi fisici, puoi usare diversi comandi con diversi livelli di verbosità, vgdisplay
, vgscan
e vgs
.
Personalmente preferisco vgs
comando, sudo vgs
[email protected]:~$ sudo vgs
VG #PV #LV #SN Attr VSize VFree
lvm_tutorial 2 0 0 wz--n- 7.49g 7.49g
vgscan
:-
[email protected]:~$ sudo vgscan
Found volume group "lvm_tutorial" using metadata type lvm2
vgdisplay
:-
[email protected]:~$ sudo vgdisplay
--- Volume group ---
VG Name lvm_tutorial
System ID
Format lvm2
Metadata Areas 2
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 2
Act PV 2
VG Size 7.49 GiB
PE Size 4.00 MiB
Total PE 1918
Alloc PE / Size 0 / 0
Free PE / Size 1918 / 7.49 GiB
VG UUID LYVE9P-vY0G-OAW6-an8q-yfBx-rrB1-YU61m1
Elencare i volumi fisici allegati a un gruppo di volumi
È possibile elencare tutti i volumi fisici connessi a un gruppo di volumi specifico utilizzando il comando seguente:-
sudo pvdisplay -S vgname=<volume_group_name> -C -o pv_name
Esempio:-
[email protected]:~$ sudo pvdisplay -S vgname=lvm_tutorial -C -o pv_name
PV
/dev/sdc
/dev/sdd1
Puoi anche ottenere il conteggio dei volumi fisici.
sudo vgdisplay -S vgname=<volume_group_name> -C -o pv_count
Esempio:-
[email protected]:~$ sudo vgdisplay -S vgname=lvm_tutorial -C -o pv_count
#PV
3
Estensione di un gruppo di volumi
Estendere un gruppo di volumi significa aggiungere ulteriori volumi fisici a un gruppo di volumi. Per farlo il vgextend
viene utilizzato il comando. La sintassi è semplice:-
vgextend <volume_group> <physical_volume1> <physical_volume2> ....
Estendiamo il nostro lvm_tutorial
volume di /dev/sdd2
.
sudo vgextend lvm_tutorial /dev/sdd2
Concentrati sull'output:-
[email protected]:~$ sudo vgextend lvm_tutorial /dev/sdd2
Physical volume "/dev/sdd2" successfully created.
Volume group "lvm_tutorial" successfully extended
Nella sezione del volume fisico abbiamo finito con la rimozione di /dev/sdd2
come volume fisico, ma una partizione o un disco grezzo deve essere inizializzato come volume fisico, altrimenti LVM non sarà in grado di gestirlo come parte di un gruppo di volumi. Quindi vgextend
prepara /dev/sdd2
prima di aggiungerlo al gruppo di volumi.
Ora elenca i volumi fisici allegati a questo gruppo di volumi, per sicurezza.
sudo pvdisplay -S vgname=lvm_tutorial -C -o pv_name
Uscita:-
[email protected]:~$ sudo pvdisplay -S vgname=lvm_tutorial -C -o pv_name
PV
/dev/sdc
/dev/sdd1
/dev/sdd2
/dev/sdd2
è ora nell'elenco come previsto.
Riduzione di un gruppo di volumi
Proprio come estendere un gruppo di volumi significa aggiungere un altro volume fisico, ridurlo significa rimuovere uno o più volumi fisici.
Usiamo il vgreduce
comando per farlo. La sintassi generale è la seguente:-
vgreduce <vgname> <physical_volume1> <physical_volume2> ....
Rimuoviamo i volumi fisici /dev/sdc
e /dev/sdd1
.
sudo vgreduce lvm_tutorial /dev/sdc /dev/sdd1
Esempio:-
[email protected]:~$ sudo vgreduce lvm_tutorial /dev/sdc /dev/sdd1
Removed "/dev/sdc" from volume group "lvm_tutorial"
Removed "/dev/sdd1" from volume group "lvm_tutorial"
Se un gruppo di volumi ha volumi logici attivi, non sarai in grado di ridurlo in questo modo. Elenca di nuovo i volumi fisici.
sudo pvdisplay -S vgname=lvm_tutorial -C -o pv_name
Uscita:-
[email protected]:~$ sudo pvdisplay -S vgname=lvm_tutorial -C -o pv_name
PV
/dev/sdd2
Quei due volumi fisici sono spariti.
Ora, per il resto di questo articolo, aggiungi di nuovo quei due volumi fisici.
sudo vgextend lvm_tutorial /dev/sdc /dev/sdd1
Rimozione di un gruppo di volumi
Puoi rimuovere un volume logico con vgremove
comando.
sudo vgremove lvm_tutorial
Non eseguire questo comando in questo momento, altrimenti dovresti ricreare il gruppo di volumi. Se vuoi provarlo, eseguilo alla fine di questo articolo.
3. Volumi logici
Questo è ciò con cui lavorerai principalmente. Un volume logico è come una partizione, ma invece di stare sopra un disco grezzo, si trova sopra un gruppo di volumi. Puoi,
- Formatta un volume logico con qualsiasi filesystem desideri.
- Montalo ovunque nel filesystem che desideri.
In questa sezione imparerai,
- Come creare volumi logici.
- Operazioni comuni su un volume logico.
- Ridimensionamento di un volume logico.
- Rimozione di un volume logico.
Utilità: Tutti i nomi di utilità dei gruppi di volumi iniziano con lv
, sta per L logico V olume. per esempio. lvcreate
, lvs
, lvreduce
ecc.vgcreate
, vgs
, vgrename
ecc.
Creazione di volumi logici
I volumi logici vengono creati utilizzando lvcreate
comando. La sintassi comunemente usata è la seguente,
sudo lvcreate -L <size> -n <lvname> <vgname>
Lascia che lo spieghi per te:-
- Il
-L
l'opzione è per la dimensione del nuovo volume logico, puoi usare qualsiasi numero intero con "GB", "MB" o "KB" alla fine. Per esempio. "1GB". - Il
-n
l'opzione serve per nominare questo volume logico. - Infine devi passargli il nome del gruppo di volumi di cui farà parte questo volume logico. Quindi, mentre fornisci una dimensione al volume logico, assicurati che il gruppo di volumi abbia lo spazio disponibile.
Esegui il seguente comando sulla macchina virtuale:-
sudo lvcreate -L 5GB -n lv1 lvm_tutorial
Esempio di output:-
[email protected]:~$ sudo lvcreate -L 5GB -n lv1 lvm_tutorial
Logical volume "lv1" created.
Operazioni comuni su un volume logico
Come ho detto in precedenza, puoi inserire un filesystem su un volume logico e montarlo ovunque sul filesystem.
Una volta creato puoi trovare il volume logico in /dev/<vgname>/<lvname>
il percorso. Ad esempio nel nostro caso il volume sarà in /dev/lvm_tutorial/lv1
.
[email protected]:~$ ls -l /dev/lvm_tutorial/lv1
lrwxrwxrwx 1 root root 7 May 17 02:09 /dev/lvm_tutorial/lv1 -> ../dm-0
Ora puoi usarlo come qualsiasi partizione. Formattalo con ext4,
sudo mkfs.ext4 /dev/lvm_tutorial/lv1
Montalo in un punto della tua attuale struttura di directory come /mnt
,
sudo mount -t ext4 /dev/lvm_tutorial/lv1 /mnt
Ridimensionamento di un volume logico
Puoi estendere un volume logico usando lvextend
comando e ridurne le dimensioni usando lvreduce
comando. Oppure puoi usare il comando singolo lvresize
per svolgere entrambi i compiti.
Per prima cosa vediamo se nel gruppo di volumi è rimasto dello spazio o meno.
sudo vgs -S vgname=lvm_tutorial -o vg_free
Uscita:-
[email protected]:~$ sudo vgs -S vgname=lvm_tutorial -o vg_free
VFree
<4.99g
In base all'output, mi è rimasto un po' di spazio, quindi aumentiamo la dimensione del volume di 2 GB.
Ricorda che il volume logico è ancora montato su /mnt
.
[email protected]:~$ mount | grep '/mnt'
/dev/mapper/lvm_tutorial-lv1 on /mnt type ext4 (rw,relatime)
Utilizzare il seguente comando per ridimensionare il volume:-
sudo lvresize -L +2GB lvm_tutorial/lv1
La sintassi generale è qualcosa del genere:-
lvresize -L [+|-][Size] <vgname>/<lvname>
Il simbolo + o - dopo -L
dipende se stai cercando di aumentare o diminuire la dimensione del volume rispettivamente.
Dopo che la dimensione del volume è aumentata, anche il filesystem deve essere ridimensionato. Per ext4, il comando da usare è resize2fs
.
sudo resize2fs /dev/lvm_tutorial/lv1
Uscita:-
[email protected]:~$ sudo resize2fs /dev/lvm_tutorial/lv1
resize2fs 1.45.5 (07-Jan-2020)
Filesystem at /dev/lvm_tutorial/lv1 is mounted on /mnt; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 1
The filesystem on /dev/lvm_tutorial/lv1 is now 1835008 (4k) blocks long.
Non tutti i filesystem supportano il ridimensionamento a caldo, Ext4 e XFS sono uno di quelli supportati. Ti consiglio di attenerti a questi. La riduzione di un volume logico è un'operazione leggermente più complicata e non ne parlerò qui in questo articolo. Ridurrò le dimensioni di questo volume di 1 GB.
Rimozione di un volume logico
Rimuovi un volume logico con lvremove
comando. La sintassi del comando è la seguente:-
lvremove <vgname>/<lvname>
Esegui questo comando sulla macchina virtuale:-
sudo lvremove lvm_tutorial/lv1
Uscita:-
[email protected]:~$ sudo lvremove lvm_tutorial/lv1
Do you really want to remove and DISCARD active logical volume lvm_tutorial/lv1? [y/n]: y
Logical volume "lv1" successfully removed
Esistono molte altre operazioni eseguibili su volumi logici, volumi fisici e gruppi di volumi, ma non è possibile scrivere tutto questo in un unico articolo.
Ti ho lasciato con un altro disco /dev/sde
nella macchina virtuale. Usalo, esercitati con alcuni dei comandi di questo articolo, crea un nuovo gruppo di volumi, estendine uno esistente, esercitati.
Spero che questo articolo ti sia stato utile, se desideri saperne di più in futuro, fammi sapere nella sezione commenti in basso.