Esiste un modo semplice per spostare / copiare un volume logico da un gruppo di volumi a un altro? (LVM2)


15

Sto riordinando un sacco di dischi sul mio server a casa e mi trovo nella posizione di voler spostare un mucchio di volumi logici LVM in un altro gruppo di volumi. C'è un modo semplice per fare questo? Ho visto la menzione di un cplvcomando ma questo sembra essere vecchio o non qualcosa che fosse mai stato disponibile per Linux.

Risposte:


20

Se è possibile disporre che il volume logico si trovi su un sottoinsieme separato di volumi fisici dal resto del gruppo di volumi di origine ( lvconvert sourcevg/sourcelv /dev/pv1 ...può essere utile), è possibile utilizzare vgsplitper dividere lv in un nuovo vg e vgmergeunire il nuovo vg nel target vg.

Sebbene LVM abbia una funzione di mirroring, non è possibile (in modo corretto) usarlo per fare una copia tra gruppi di volumi, poiché entrambe le gambe del mirror devono vivere sulla stessa vg e l'associazione non può essere interrotta .

Puoi copiare un volume LVM su un altro nel modo in cui copieresti qualsiasi volume su un altro: crea un lv di destinazione della dimensione appropriata, quindi copia il contenuto con dd if=/dev/sourcevg/sourcelv of=/dev/targetvg/targetlv bs=4M. Se il volume di origine è attivo, è possibile sfruttare LVM per creare una copia coerente: innanzitutto acquisire un'istantanea del sorgente LV con lvcreate -s, quindi copiare l'istantanea.


1
Brilliant Gilles .... vgsplit / vgmerge probabilmente andrà bene: dopo posso usare pvmove per spostare le estensioni fisiche sul nuovo disco e quindi rimuovere il vecchio volume dal VG.
jkp,

Peccato, alla fine non ha funzionato per me a causa di dimensioni diverse. Se questo non è un problema per te, suggerisco che questo metodo sarebbe più semplice.
jkp,

Dopo dd(se non hai fretta di buttare via i vecchi volumi), non dimenticare di cambiare l'UUID dei nuovi filesystem: tune2fs -U random / dev / targetvg / targetlv
midenok

2
pvmove -n lvol1 /dev/sdb1 /dev/sdc1

pvmove può spostare i dati tra volumi fisici: Guida dell'amministratore di LVM


10
Ma non tra gruppi di volumi.
MattBianco,

Ripeto: questo non funziona per due gruppi di volumi separati
kissgyorgy,

Prima vgextendvg1 con un nuovo pv, poi il pvmovetuo lv nel nuovo pv, vgsplitun vg temporaneo che tu vgmergevg2. Quindi di pvmovenuovo il lv in vg2 pv originale, vgreducevg2 per leggere il pv intermedio. Oppure, per evitare la copia intermedia, puoi semplicemente unire vg1 in vg2, pvmovelv1 e di vgsplitnuovo vg1 da vg2. Questo dovrebbe rispondere alle obiezioni di @ MattBianco e @kissgyorgy ed è equivalente alla soluzione di @Gilles ma sostituendo l'istantanea e il livello basso ddcon unpvmove
marcz

1

A partire dalla LVM in Debian tratto (9.0), cioè 2.02.168-2, è possibile fare una copia di un volume logico attraverso gruppi di volumi utilizzando una combinazione di vgmerge, lvconverte vgsplit. Poiché una mossa è una combinazione di una copia e di un'eliminazione, questo funzionerà anche per una mossa.

In alternativa, puoi usare pvmovesolo per spostare il volume.

Segue una sessione di esempio completa e autonoma che utilizza dispositivi loop lvconvert.

Riepilogo: creiamo un gruppo di volumi vg1con volume logico lv1e vg2con lv2e realizziamo una copia di lv1in vg2.

Crea file.

truncate pv1 --size 100MB
truncate pv2 --size 100MB

Configurare dispositivi loop su file.

losetup /dev/loop1 pv1
losetup /dev/loop2 pv2

Creare volumi fisici su dispositivi loop (inizializzare i dispositivi loop per l'uso da LVM).

pvcreate /dev/loop1 /dev/loop2

Creare gruppi di volumi vg1e vg2su /dev/loop1e /dev/loop2 rispettivamente.

vgcreate vg1 /dev/loop1
vgcreate vg2 /dev/loop2

Creare volumi logici lv1e lv2on vg1e vg2rispettivamente.

lvcreate -L 10M -n lv1 vg1
lvcreate -L 10M -n lv2 vg2

Crea filesystem ext4 su lv1e lv2.

mkfs.ext4 -j /dev/vg1/lv1
mkfs.ext4 -j /dev/vg2/lv2

Facoltativamente, scrivi qualcosa in lv1modo da poter in seguito verificare che la copia sia stata creata correttamente. Rendi vg1inattivo.

vgchange -a n vg1

Esegui il comando di unione in modalità test. Questo si fonde lv1in lv2.

vgmerge -A y -l -t -v <<destination-vg>> <<source-vg>>
vgmerge -A y -l -t -v vg2 vg1

E poi per davvero.

vgmerge -A y -l -v vg2 vg1

Quindi creare una coppia mirror RAID 1 lv1dall'uso lvconvert. Il <> argomento dice lvconvertdi fare il copia speculare lv1_copysu /dev/loop2.

lvconvert --type raid1 --mirrors 1 <<source-lv>> <<dest-pv>>
lvconvert --type raid1 --mirrors 1 /dev/vg2/lv1 /dev/loop2

Quindi dividere lo specchio. Il nuovo LV è ora lv1_copy.

lvconvert --splitmirrors 1 --name <<source-lv-copy>> <<source-lv>>
lvconvert --splitmirrors 1 --name lv1_copy /dev/vg2/lv1

Rendi vg2inattivo.

vgchange -a n vg2

Quindi (modalità test)

vgsplit -t -v <<source-vg>> <<destination-vg>> <<moved-to-pv>>
vgsplit -t -v /dev/vg2 /dev/vg1 /dev/loop1

Davvero

vgsplit -v /dev/vg2 /dev/vg1 /dev/loop1

Risultato risultante:

lvs
[...]
lv1        vg1       -wi-a-----  12.00m
lv1_copy   vg2       -wi-a-----  12.00m
lv2        vg2       -wi-a-----  12.00m

APPUNTI:

1) La maggior parte di questi comandi dovrà essere eseguita come root.

2) In caso di duplicazione dei nomi dei volumi logici nei due gruppi di volumi, vgmergesi rifiuterà di procedere.

3) In unione:

Logical volumes in `vg1` must be inactive

E su split:

Logical volume `vg2/lv1` must be inactive.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.