Verschieben eines logischen Volumes von einer Volume-Gruppe in eine andere

18

Ist es möglich, ein logisches Volume von einer Volume-Gruppe in eine andere zu verschieben?

Es ist möglich, eine (mehr oder weniger) passende Version zu erstellen und die Daten zu kopieren. Gibt es eine Möglichkeit, dies nur mit LVM-Tools zu tun?

Wenn nicht, gibt es einen theoretischen Grund oder eine technische Einschränkung (Umfanggrößen)?

XTL
quelle

Antworten:

13

Eine Volume-Gruppe besteht aus ganzen physischen Volumes. Ein physisches Volume besteht aus vielen Bereichen (ein Bereich ist normalerweise 4 MB groß). Jedes Extent kann zu einem anderen logischen Volume gehören. Um ein logisches Volume an eine andere Gruppe zu übertragen, können Sie nicht einfach Extents übertragen, da dies zu einer Aufteilung des physischen Volumes zwischen der Quell-VG und der Ziel-VG führen kann.

Sie können eine oder mehrere PVs mit dem vgsplitBefehl von der Quell-VG zur Ziel-VG übertragen . Sie können angeben, welche PVs Sie übertragen möchten oder welche LV (jeweils nur eine). Wenn Sie eine LV angeben, müssen sich diese und die anderen LVs in der Quell-VG auf separaten PVs befinden. Die Ziel-VG wird erstellt, wenn keine VG mit dem angegebenen Namen vorhanden ist.

vgsplit -n source_group/volume_to_copy source_group target_group
vgsplit source_group target_group /dev/sdy99 /dev/sdz99

Möglicherweise müssen Sie pvmovezunächst festlegen, dass sich die zu verschiebenden logischen Volumes auf separaten PVs befinden.

Wenn Sie die physischen Grenzen der VG beibehalten und die Daten verschieben möchten, gibt es kein integriertes Tool. Sie können jedoch einen Spiegel erstellen und dann das Original entfernen .

Gilles 'SO - hör auf böse zu sein'
quelle
Sieht so aus, als ob die Zielgruppe bereits vorhanden sein kann?
XTL
8

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 Sie die Volume-Gruppen vg1 und vg2 in / dev / loop1 bzw. / dev / loop2.

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

Erstellen Sie logische Volumes lv1 und lv2 auf vg1 bzw. vg2.

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

Erstellen Sie ext4-Dateisysteme auf lv1 und lv2.

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

Schreiben Sie optional etwas in lv1, damit Sie später überprüfen können, ob die Kopie korrekt erstellt wurde. Schalten Sie vg1 inaktiv.

vgchange -a n vg1

Führen Sie den Befehl merge im Testmodus aus. Dies führt vg1 zu vg2 zusammen.

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. Das dest-pvArgument besagt lvconvert, dass die Spiegelkopie erstellt werden soll /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 vg2/lv1inaktiv.

lvchange -a n /dev/vg2/lv1

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, vgmergewird der Vorgang abgelehnt.

3) Beim Zusammenführen müssen die logischen Volumes vg1inaktiv sein. Bei der Aufteilung müssen die logischen Datenträger vg2, zu vg1denen gehört, inaktiv sein. In unserem Fall ist dies lv1.

Faheem Mitha
quelle
2

Ich werde mein eigenes anbieten:

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/

Wenn alles in Ordnung ist, entfernen Sie die Quelle

lvremove vgsource/lv0
conan
quelle
Dies ist so ziemlich das Gegenteil der Frage. Es geht darum, das Volume zu verschieben, anstatt die Daten auf ein neues zu kopieren.
XTL