È possibile spostare un volume logico da un gruppo di volumi all'altro per intero?
È possibile creare un lv (più o meno) corrispondente e copiare i dati, ma c'è un modo per farlo solo con gli strumenti LVM?
In caso negativo, c'è un motivo teorico o un limite tecnico (dimensioni delle dimensioni)?
Risposta accettata:
A partire da LVM in Debian stretch (9.0), ovvero 2.02.168-2, è
possibile eseguire una copia di un volume logico attraverso gruppi di volumi usando una
combinazione di vgmerge
, lvconvert
e vgsplit
. Poiché una mossa è
una combinazione di una copia e di un'eliminazione, funzionerà anche per una mossa.
In alternativa, puoi usare pvmove
per spostare semplicemente 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
Configura i dispositivi in loop sui file.
losetup /dev/loop1 pv1
losetup /dev/loop2 pv2
Crea volumi fisici su dispositivi di loop (inizializza i dispositivi di loop per
l'utilizzo da parte di LVM).
pvcreate /dev/loop1 /dev/loop2
Crea gruppi di volumi vg1 e vg2 rispettivamente su /dev/loop1 e /dev/loop2
.
vgcreate vg1 /dev/loop1
vgcreate vg2 /dev/loop2
Crea volumi logici lv1 e lv2 rispettivamente su vg1 e vg2.
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 verificare in seguito che la copia è stata
creata correttamente. Rendi vg1 inattivo.
vgchange -a n vg1
Esegui il comando di unione in modalità test. Questo unisce vg1 in vg2.
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
usando lvconvert
. Il dest-pv
argomento dice a lvconvert
per eseguire la copia speculare
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/lv1
inattivo.
lvchange -a n /dev/vg2/lv1
Quindi (modalità test)
vgsplit -t -v <<source-vg>> <<destination-vg>> <<moved-to-pv>>
vgsplit -t -v /dev/vg2 /dev/vg1 /dev/loop1
Per davvero
vgsplit -v /dev/vg2 /dev/vg1 /dev/loop1
Risultato:
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
nei due gruppi di volumi, vgmerge
rifiuterà di procedere.
3) All'unione, volumi logici in vg1
deve essere inattivo. E su volumi logici divisi in vg2
appartenente a vg1
deve essere inattivo. Nel nostro caso, questo è lv1
.