Come spostare / copiare il volume logico (lv) in un altro gruppo di volumi (vg)?


17

Fondamentalmente, voglio spostare / copiare diversi volumi logici (lv) in un nuovo gruppo di volumi (vg). Il nuovo gruppo di volumi risiede in un nuovo set di volumi fisici. Qualcuno sa come farlo in modo sicuro senza danneggiare i dati all'interno di quei volumi logici ??


Potete fornire maggiori dettagli? Sai come creare nuovi VG e LV? Stai spostando una partizione dati o la tua partizione root?
Pantera,

@ bodhi.zazen: In realtà stavo cercando di spostare una specie di partizioni di dati. Quello che intendevo per "tipo di" era che quei volumi logici sono macchine virtuali. (ovvero quei volumi logici vengono visualizzati nelle macchine virtuali come dispositivi a blocchi). Ad ogni modo, sono stato in grado di gestire la situazione a modo mio. I passaggi sono indicati nella mia risposta. Tuttavia, voi e tutti voi siete invitati a commentare il mio metodo. Se esiste / è un (i) modo (i) migliore (i) per fare questo genere di cose, sii gentile abbastanza da condividerlo. :)
nessuno il

Avrei prima creato il nuovo PV / LV, arrestato la VM, quindi copiato i dati con dd, avviato la nuova VM e confermato che funzionava.
Pantera,

Risposte:


12

vgmerge ti consente di unire due VG. Puoi anche usare pvmove per spostare i dati all'interno di un VG e vgsplit se vuoi tornare a più VG.


Una nota. Per farlo, è necessario disporre di un dispositivo temporaneo utilizzato per trasferire LV online a un altro VG. Naturalmente dopo il trasferimento dovresti aggiornare / etc / fstab e altre configurazioni interessate, pianificare un po 'di tempo offline per il riavvio ed eventualmente effettuare un aggiornamento di configurazione. Se fai qualche azione con rootfs o bootfs, dovresti avere qualche distribuzione live di Linux per il sistema principale di recupero.
Znik

10

Non c'è motivo di copiarlo prima in un file .img, basta fare prima lvcreate, quindi copiarlo direttamente su:

lvcreate --snapshot --name <the-name-of-the-snapshot> --size <the size> /dev/volume-group/logical-volume
lvcreate --name <logical-volume-name> --size <size> the-new-volume-group-name
dd if=/dev/volume-group/snapshot-name of=/dev/new-volume-group/new-logical-volume

2
Questo è un po 'troppo breve. Non dice quali sono esattamente le dimensioni menzionate, ad esempio <la dimensione> può essere molto piccola, poiché è solo per le differenze dell'istantanea.
Il

1
@gorn un punto valido, ma stava rispondendo alla risposta di nessuno di seguito, che era la prima al momento. Leggi per un contesto aggiuntivo.
Tobias J,

7

Ok, sono stato in grado di gestire la situazione a modo mio. Ecco i passaggi che ho preso:

1) Scatta un'istantanea del volume logico di destinazione.

lvcreate --snapshot --name <the-name-of-the-snapshot> --size <the size> /dev/volume-group/logical-volume

Nota: la dimensione dell'istantanea può essere grande o piccola quanto desideri. Ciò che conta è avere abbastanza spazio per acquisire le modifiche durante il periodo dell'istantanea.

2) Creare una copia dell'immagine del contenuto dell'istantanea utilizzando dd

dd if=/dev/volume-group/snapshot-name of=/tmp/backup.img

3) Creare un nuovo volume logico di dimensioni sufficienti nel gruppo di volumi di targeting (nuovo).

lvcreate --name <logical-volume-name> --size <size> the-new-volume-group-name

4) Scrivere i dati nel nuovo volume logico dal backup dell'immagine usando dd

dd if=/tmp/backup.img of=/dev/new-volume-group/new-logical-volume

5) eliminare l'istantanea e il backup dell'immagine usando lvremovee rmrispettivamente.

Questo è tutto gente ... Spero che questo aiuti a qualcuno :)


Se qualcuno ha un'opzione / metodo migliore, fammelo sapere anche :-)
nessuno il

ising backup.img per il backup temporaneo dell'archivio è completo senza bisogno. è possibile eseguire direttamente da snapshot di origine a LV di destinazione con stato non montato.
Znik

3

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 una cancellazione, questo funzionerà anche per una mossa.

In alternativa, puoi usare pvmovesolo per spostare il volume.

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

Riepilogo: creiamo il gruppo di volumi vg1 con volume logico lv1 e vg2 con lv2 e realizziamo una copia di lv1 in 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

Crea gruppi di volumi vg1 e vg2 rispettivamente su / dev / loop1 e / dev / loop2.

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

Creare 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 sia stata creata correttamente. Rendi vg1 inattivo.

vgchange -a n vg1

Esegui il comando di unione in modalità test. Questo unisce LV1 a 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 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

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.

1
è inutile. Devi smontare i filesystem, disattivare i volumi ecc. Puoi semplicemente smontare dir e copiare anche i dati.
user189142

in primo luogo, come diceva user189142, è inutile. in secondo luogo, viene applicato solo alla situazione in cui possiamo interrompere i servizi utilizzando il volume spostato. questo è un problema con i servizi in esecuzione 24/7, e il volume è molto grande con i dati conteggiati con terabyte. Questa causa, questa procedura richiede tempi di manutenzione molto lunghi. Questa causa, molto più semplice è semplicemente la creazione di un nuovo volume, rsync online, quindi con poco tempo rsync offline per l'aggiornamento, il rimontaggio e il ripristino del sistema allo stato online. Naturalmente, l'idea molto buona è cancellare i dati non necessari dal volume di origine. forse spostarlo temporaneamente in un posto temporaneo.
Znik

3

Le 4 risposte finora mancano tutte del fatto che spesso non si conoscono le dimensioni esatte del volume. lvdisplaymostra solo valori arrotondati al secondo decimale e man lvdisplaypunta solo ad altri comandi per le opzioni disponibili. Quanto segue seleziona MiB, che è sufficientemente preciso con la dimensione del blocco LVM predefinita di 4 MiB:

lvdisplay --units m

MiB è anche l'unità predefinita per --sizeof lvcreate. In caso di dubbi, ricontrollare la dimensione corretta con lvdisplaydopo aver creato il volume di destinazione. Quindi vai avanti come nelle altre risposte per fare una copia. Inoltre, consiglierei di verificare la copia , ad esempio con cmp.

Ecco perché viene utilizzata un'istantanea e cosa protegge e non protegge:

  • L'istantanea viene creata in modo tale che tutti i dati vengano copiati com'era al momento della creazione dell'istantanea. Le attività sul volume di origine durante il processo di copia non verranno riflesse nella copia.

  • L'istantanea protegge anche il volume di origine da errori umani nella ddriga di comando. Se si scrive accidentalmente sull'istantanea, solo i dati dell'istantanea verranno danneggiati e sarà possibile semplicemente rimuovere l'istantanea e ricominciare.

  • Il volume di destinazione non è protetto durante i processi di copia. Se un altro amministratore (o un processo automatico come os-prober di dracut) monta il volume incompleto, il mount potrebbe rovinare le cose. (Anche un montaggio di sola lettura può comunque scrivere voci di giornale nel volume.)


2

Offrirò il mio:

umount /somedir/

lvdisplay /dev/vgsource/lv0 --units b

lvcreate -L 12345b -n lv0 vgtarget

dd if=/dev/vgsource/lv0 of=/dev/vgtarget/lv0 bs=1024K conv=noerror,sync status=progress

mount /dev/vgtarget/lv0 /somedir/

se tutto è a posto, rimuovi la fonte

lvremove vgsource/lv0

cosa succede se il volume di origine è molto grande e il servizio o il sistema non devono essere arrestati?
Znik

0

Se devi copiare un volume logico da VG A a un altro VG B, ho trovato una variante interessante usando partclone. Lo snapshot quindi copia con dd è un buon metodo ma potrebbe essere lento se i file system non sono pieni. Questa soluzione è molto veloce perché copia solo i blocchi utilizzati.

  1. Innanzitutto creare un'istantanea della fonte LV
lvcreate --snapshot --size 1G /dev/sourcevg/lv --name lv-backup

il --sizequi è quanto di scrittura può verificarsi prima che l'istantanea sarà disattivata

  1. Creare il LV di destinazione nel VG di destinazione
lvcreate --size <new_lv_size> /dev/destvg --name newlv

new_lv_size deve avere almeno la dimensione della fonte LV

  1. Copia il file system dal backup lv di origine al LV di destinazione
partclone.<fs_type> --dev-to-dev --source /dev/sourcevg/lv-backup --output /dev/destvg/newlv

fs_typepuò essere ext4, fat32, btrfs, xfs, ... qualsiasi FS supportato da partclone

  1. Elimina l'istantanea
lvremove /dev/sourcevg/lv-backup
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.