Gibt es eine einfache Möglichkeit, ein logisches Volume von einer Volume-Gruppe in eine andere zu verschieben / kopieren? (LVM2)

15

Ich ordne eine Reihe von Festplatten auf meinem Server zu Hause neu und bin in der Lage, eine Reihe von logischen LVM-Datenträgern in eine andere Datenträgergruppe zu verschieben. Gibt es eine einfache Möglichkeit, dies zu tun? Ich habe die Erwähnung eines cplvBefehls gesehen, aber dies scheint entweder alt oder etwas, das jemals für Linux verfügbar war, zu sein.

jkp
quelle

Antworten:

20

Wenn Sie dafür sorgen können, dass sich das logische Volume in einer vom Rest der Quell-Volume-Gruppe getrennten Teilmenge der physischen Volumes befindet (was lvconvert sourcevg/sourcelv /dev/pv1 ...möglicherweise hilfreich ist), können Sie vgsplitdas lv in eine neue vg aufteilen und vgmergedie neue vg in die zusammenführen Ziel vg.

Obwohl LVM über eine Spiegelungsfunktion verfügt, können Sie mit dieser Funktion keine Kopien zwischen Volume-Gruppen erstellen, da beide Beine des Spiegels in derselben VG gespeichert sein müssen und die Zuordnung nicht unterbrochen werden kann .

Sie können ein LVM-Volume auf die gleiche Weise auf ein anderes kopieren, wie Sie ein beliebiges Volume auf ein anderes kopieren möchten: Erstellen Sie ein Ziel-LV mit der entsprechenden Größe und kopieren Sie dann den Inhalt mit dd if=/dev/sourcevg/sourcelv of=/dev/targetvg/targetlv bs=4M . Wenn das Quellvolume aktiv ist, können Sie mithilfe von LVM eine konsistente Kopie erstellen: Erstellen Sie zuerst einen Snapshot des Quellvolumes mit lvcreate -sund kopieren Sie dann den Snapshot.

Gilles 'SO - hör auf böse zu sein'
quelle
1
Brilliant Gilles .... vgsplit / vgmerge wird wahrscheinlich in Ordnung sein: Ich kann danach pvmove verwenden, um die physischen Extents auf die neue Festplatte zu verschieben und dann das alte Volume aus der VG zu entfernen.
JKP
Schade, das hat bei mir am Ende wegen der unterschiedlich großen Ausmaße nicht geklappt. Wenn dies jedoch kein Problem für Sie ist, empfehle ich, dass diese Methode am einfachsten ist.
JKP
Nach dem dd(wenn Sie sich beeilen , um nicht abwerfen alten Bände) vergessen zu UUID neuer Dateisysteme, ändern sich nicht: tune2fs -U random / dev / targetvg / targetlv
midenok
2
pvmove -n lvol1 /dev/sdb1 /dev/sdc1

pvmove kann Daten zwischen physischen Volumes verschieben: LVM-Administratorhandbuch

Mailand
quelle
10
Aber nicht zwischen Volumengruppen.
MattBianco
Ich wiederhole: Dies funktioniert nicht für zwei separate Volumengruppen
kissgyorgy
Zuerst vgextendvg1 mit einem neuen pv, dann pvmovedein lv zum neuen pv, vgsplitein temporäres vg das du vgmergein vg2 hast. Dann pvmovenochmal das lv auf vg2 original pv, um vgreducevg2 vom intermediären pv abzulesen. Um die Zwischenkopie zu vermeiden, können Sie einfach zuerst vg1 in vg2, pvmovelv1 und vgspliterneut vg1 aus vg2 zusammenführen. Dies sollte auf Einwände von @ MattBianco und @ kissgyorgy antworten und entspricht der Lösung von @Gilles, ersetzt jedoch den Schnappschuss und die niedrige Ebene dddurch apvmove
marcz
1

Wie in den LVM Debian Stretch (9,0), nämlich 2.02.168-2, dann ist es möglich , eine Kopie eines logischen Datenträger über Volumengruppen mit einer Kombination von zu tun vgmerge, lvconvertund vgsplit. Da ein Zug eine Kombination aus Kopieren und Löschen ist, funktioniert dies auch für einen Zug.

Alternativ können Sie auch pvmoveeinfach die Lautstärke verschieben.

Eine vollständige eigenständige Beispielsitzung mit Loop-Geräten und lvconvertfolgenden Schritten.

Zusammenfassung: Wir erstellen eine Datenträgergruppe vg1mit logischem Datenträger lv1und vg2mit lv2und erstellen eine Kopie von lv1in vg2.

Erstellen Sie Dateien.

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

Richten Sie Loop-Geräte für Dateien ein.

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

Erstellen Sie physische Volumes auf Loop-Geräten (initialisieren Sie Loop-Geräte für die Verwendung durch LVM).

pvcreate /dev/loop1 /dev/loop2

Erstellen Volumengruppen vg1und vg2auf /dev/loop1und /dev/loop2 sind.

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

Erstellen Sie logische Volumes lv1und jeweils lv2ein vg1und vg2.

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

Erstellen Sie ext4-Dateisysteme auf lv1und lv2.

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

Schreiben lv1Sie optional etwas auf, damit Sie später überprüfen können, ob die Kopie korrekt erstellt wurde. Machen vg1inaktiv.

vgchange -a n vg1

Führen Sie den Befehl merge im Testmodus aus. Dies geht lv1in ... über lv2.

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

Und dann echt.

vgmerge -A y -l -v vg2 vg1

Dann erstellen Sie ein RAID 1 - Spiegelpaar aus lv1mit lvconvert. Die <> Argument teilt lvconvertdie gespiegelte Kopie machen lv1_copyauf /dev/loop2.

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

Dann teilen Sie den Spiegel. Der neue LV ist jetzt lv1_copy.

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

Machen vg2inaktiv.

vgchange -a n vg2

Dann (Testmodus)

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

Wirklich

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

Resultierende Ausgabe:

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

ANMERKUNGEN:

1) Die meisten dieser Befehle müssen als root ausgeführt werden.

2) Wenn die Namen der logischen Datenträger in den beiden Datenträgergruppen doppelt vorhanden sind, vgmerge wird der Vorgang abgelehnt.

3) Beim Zusammenführen:

Logical volumes in `vg1` must be inactive

Und bei split:

Logical volume `vg2/lv1` must be inactive.
Faheem Mitha
quelle