Verschieben / Kopieren des logischen Volumes (lv) in eine andere Volume-Gruppe (vg)

17

Grundsätzlich möchte ich mehrere logische Volumes (lv) in eine neue Volume-Gruppe (vg) verschieben / kopieren . Die neue Datenträgergruppe befindet sich auf einem neuen Satz physischer Datenträger. Weiß jemand, wie man das sicher macht, ohne die Daten in diesen logischen Volumes zu beschädigen?

niemand
quelle
Können Sie weitere Details angeben? Weißt du, wie man neue VG und LV macht? Verschieben Sie eine Datenpartition oder Ihre Root-Partition?
Panther
@ bodhi.zazen: Eigentlich habe ich versucht, eine Art Datenpartition zu verschieben. Mit "Art" meine ich, dass diese logischen Volumes virtuelle Maschinen sind. (dh diese logischen Volumes werden virtuellen Maschinen als Blockgeräte angezeigt). Jedenfalls konnte ich die Situation auf meine eigene Weise bewältigen. Die Schritte sind in meiner Antwort angegeben. Sie und alle von Ihnen sind jedoch herzlich eingeladen, sich zu meiner Methode zu äußern. Wenn es einen besseren Weg gibt, so etwas zu tun, seien Sie bitte so freundlich, ihn zu teilen. :)
niemand
Ich hätte zuerst die neue PV / LV erstellt, die VM heruntergefahren, dann die Daten mit dd kopiert, die neue VM gebootet und bestätigt, dass sie funktioniert.
Panther

Antworten:

11

Mit vgmerge können Sie zwei VGs zusammenführen. Sie können auch pvmove verwenden , um Daten innerhalb einer VG zu verschieben, und vgsplit, wenn Sie zu mehreren VGs zurückkehren möchten.

Gabriel
quelle
9

Es gibt keinen Grund, es zuerst in eine .img-Datei zu kopieren. Führen Sie zuerst lvcreate aus und kopieren Sie es dann direkt über:

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
anon
quelle
2
Das ist etwas zu kurz. Es wird nicht genau angegeben, um welche Größen es sich handelt - zum Beispiel kann <die Größe> sehr klein sein, da es sich nur um Schnappschussdifferenzen handelt.
Gorn
@gorn ein gültiger Punkt, aber er antwortete auf die Antwort von niemandem unten, was zu der Zeit der erste war. Lesen Sie das für zusätzlichen Kontext.
Tobias J
7

Okay, ich konnte die Situation auf meine eigene Weise bewältigen. Hier sind die Schritte, die ich unternommen habe:

1) Machen Sie einen Schnappschuss des logischen Zieldatenträgers.

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

Hinweis: Die Größe des Schnappschusses kann beliebig groß oder klein sein. Wichtig ist, dass genügend Speicherplatz vorhanden ist, um Änderungen während der Momentaufnahme zu erfassen.

2) Erstellen Sie mit eine Image-Kopie des Schnappschuss-Inhalts dd

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

3) Erstellen Sie ein neues logisches Volume mit ausreichender Größe in der (neuen) Targeting-Volume-Gruppe.

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

4) Schreiben Sie die Daten aus der Imagesicherung mit auf das neue logische Volume dd

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

5) Löschen Sie den Schnappschuss und die Imagesicherung mit lvremoveund rm.

Das ist alles Leute ... Hoffe, das hilft jemandem :)

niemand
quelle
Wenn jemand eine bessere Option / Methode hat, lass es mich auch wissen :-)
nobody
2

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 die Datenträgergruppe vg1 mit dem logischen Datenträger lv1 und vg2 mit lv2 und erstellen eine Kopie von lv1 in 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 verschmilzt lv1 mit 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. Die neue LV ist jetzt lv1_copy.

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

Schalten Sie vg2 inaktiv.

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, vgmergewird 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
es ist einfach sinnlos. Sie müssen die Bereitstellung von Dateisystemen aufheben, Volumes deaktivieren usw. Sie können die Bereitstellung von dir aufheben und auch Daten kopieren.
user189142
2

Die 4 Antworten fehlen bisher alle, so dass die genaue Größe des Volumens oft nicht bekannt ist. lvdisplayZeigt nur Werte an, die auf 2 Dezimalstellen gerundet sind, und zeigt man lvdisplaynur auf andere Befehle für verfügbare Optionen. Im Folgenden wird MiB ausgewählt, was mit der Standard-LVM-Blockgröße von 4 MiB ausreichend genau ist:

lvdisplay --units m

MiB ist auch die Standardeinheit für --sizevon lvcreate. Überprüfen Sie im Zweifelsfall die korrekte Größe mit, lvdisplaynachdem Sie das Zieldatenträger erstellt haben. Fahren Sie dann wie in den anderen Antworten fort, um eine Kopie zu erstellen. Weiterhin würde ich empfehlen, die Kopie beispielsweise mit zu überprüfencmp .

Hier, warum ein Schnappschuss verwendet wird und was er schützt und was nicht:

  • Der Snapshot wird so erstellt, dass alle Daten so kopiert werden, wie sie zum Zeitpunkt der Snapshot-Erstellung waren. Aktivitäten auf dem Quellvolume während des Kopiervorgangs werden in der Kopie nicht berücksichtigt.

  • Der Snapshot schützt das Quellvolume auch vor menschlichen Fehlern in der ddBefehlszeile. Wenn Sie versehentlich in den Schnappschuss schreiben, werden nur die Daten des Schnappschusses beschädigt. Sie können den Schnappschuss einfach entfernen und von vorne beginnen.

  • Das Zieldatenträger ist während des Kopiervorgangs nicht geschützt. Wenn ein anderer Administrator (oder ein automatischer Prozess wie der os-prober von dracut) das unvollständige Volume mounten, kann dies zu Problemen führen. (Sogar ein schreibgeschützter Mount schreibt möglicherweise noch Journaleinträge auf das Volume.)

Joachim Wagner
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
0

Wenn Sie ein logisches Volume von VG A auf ein anderes VG B kopieren müssen, habe ich eine interessante Variante mit gefunden partclone. Der Schnappschuss, der dann mit dd kopiert wird, ist eine gute Methode, kann aber langsam sein, wenn Ihre Dateisysteme nicht voll sind. Diese Lösung ist sehr schnell, da nur die verwendeten Blöcke kopiert werden.

  1. Erstellen Sie zunächst einen Schnappschuss der Quell-LV
lvcreate --snapshot --size 1G /dev/sourcevg/lv --name lv-backup

das --sizehier ist , wie viel Schreib auftreten kann , bevor die Snapshot deaktiviert wird

  1. Erstellen Sie die Ziel-LV in der Ziel-VG
lvcreate --size <new_lv_size> /dev/destvg --name newlv

new_lv_size muss mindestens der Größe des Quell-LV entsprechen

  1. Kopieren Sie das Dateisystem von der Quell-LV-Sicherung in die Ziel-LV
partclone.<fs_type> --dev-to-dev --source /dev/sourcevg/lv-backup --output /dev/destvg/newlv

fs_typesein kann ext4, fat32, btrfs, xfs, ... irgendwelche FS unterstützt von partclone

  1. Löschen Sie den Schnappschuss
lvremove /dev/sourcevg/lv-backup
HugoPoi
quelle