Se puoi fare in modo 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ò aiutare), puoi usare vgsplit
per dividere lv in un nuovo vg e vgmerge
per unire il nuovo vg nel target vg.
Sebbene LVM abbia una funzione di mirroring, non puoi (sensatamente) usarla per fare una copia tra gruppi di volumi, perché entrambe le gambe del mirror devono vivere sullo stesso vg e l'associazione non può essere interrotta.
Puoi copiare un volume LVM su un altro nello stesso modo in cui copi qualsiasi volume su un altro:crea un lv di destinazione della dimensione appropriata, quindi copia i contenuti con dd if=/dev/sourcevg/sourcelv of=/dev/targetvg/targetlv bs=4M
. Se il volume di origine è attivo, puoi sfruttare LVM per creare una copia coerente:prima scatta un'istantanea del lv di origine con lvcreate -s
, quindi copia lo snapshot.
pvmove -n lvol1 /dev/sdb1 /dev/sdc1
pvmove può spostare i dati tra i volumi fisici:Guida dell'amministratore di LVM
A partire da LVM in Debian stretch (9.0), vale a dire 2.02.168-2, è possibile eseguire una copia di un volume logico attraverso i gruppi di volumi utilizzando una combinazione di vgmerge
, lvconvert
e vgsplit
. Poiché uno spostamento è una combinazione di una copia e di un'eliminazione, funzionerà anche per uno spostamento.
In alternativa, puoi usare pvmove
per spostare solo il volume.
Una sessione di esempio completa e autonoma che utilizza dispositivi loop e lvconvert
segue.
Riepilogo:creiamo il gruppo di volumi vg1
con volume logico lv1
e vg2
con lv2
e fai una copia di lv1
in vg2
.
Crea file.
truncate pv1 --size 100MB
truncate pv2 --size 100MB
Imposta i dispositivi di loop sui file.
losetup /dev/loop1 pv1
losetup /dev/loop2 pv2
Crea volumi fisici sui dispositivi loop (inizializza i dispositivi loop per l'utilizzo da parte di LVM).
pvcreate /dev/loop1 /dev/loop2
Crea gruppi di volumi vg1
e vg2
su /dev/loop1
e /dev/loop2
rispettivamente.
vgcreate vg1 /dev/loop1
vgcreate vg2 /dev/loop2
Crea volumi logici lv1
e lv2
su vg1
e vg2
rispettivamente.
lvcreate -L 10M -n lv1 vg1
lvcreate -L 10M -n lv2 vg2
Crea filesystem ext4 su lv1
e lv2
.
mkfs.ext4 -j /dev/vg1/lv1
mkfs.ext4 -j /dev/vg2/lv2
Facoltativamente, scrivi qualcosa su lv1
in modo da poter successivamente verificare che la copia sia stata creata correttamente. Crea vg1
inattivo.
vgchange -a n vg1
Eseguire il comando di unione in modalità test. Questo unisce lv1
in 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 crea una coppia di mirror RAID 1 da lv1
utilizzando lvconvert
. L'argomento <> indica lvconvert
per fare in modo che la copia specularelv1_copy
su /dev/loop2
.
lvconvert --type raid1 --mirrors 1 <<source-lv>> <<dest-pv>>
lvconvert --type raid1 --mirrors 1 /dev/vg2/lv1 /dev/loop2
Quindi dividi 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
Crea vg2
inattivo.
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
Output risultante:
lvs
[...]
lv1 vg1 -wi-a----- 12.00m
lv1_copy vg2 -wi-a----- 12.00m
lv2 vg2 -wi-a----- 12.00m
NOTE:
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, vgmerge
si rifiuterà di procedere.
3) All'unione:
Logical volumes in `vg1` must be inactive
E su split:
Logical volume `vg2/lv1` must be inactive.