Verwalten von LVM-Snapshots in LVM2

LVM-Snapshots

Wir werden uns nun einige fortgeschrittenere LVM2-Themen ansehen. Im nächsten Blog werden wir uns mit Thin Provisioning in LVM befassen. LVM-Snapshots sind Zeitpunktkopien von logischen LVM-Volumes. Sie sind platzsparend, da sie keine Daten speichern, aber wenn Daten auf der Quell-LV gespeichert werden, werden die ursprünglichen Daten in das LVM-Snapshot-Volume geschrieben. Die Anwendungsfälle dafür umfassen:

  • Backups: Die LVM-Snapshots selbst sind kein effizientes Backup, da sie in derselben Volume-Gruppe gespeichert werden müssen. Snapshots können jedoch verwendet werden, um Backups zu erweitern. Erstellen Sie einfach einen Snapshot des Zielvolumes und sichern Sie dann das Snapshot-Volume, um Probleme mit der Dateikonkurrenz während des Backups zu beheben. Der Snapshot kann am Ende des Sicherungsvorgangs gelöscht werden
  • Testen und Zerstören: LVM-Snapshots sind eine Lese- / Schreibkopie des ursprünglichen LV. Sie können LVM-Snapshots eines LV erstellen, das komplexe Skripte enthält, diese beliebig oft ändern und testen und die Daten dann zerstören, wenn Sie fertig sind. Alles ohne Auswirkungen auf die ursprünglichen Skripte.
  • Testen neuer Softwarebereitstellungen: Die Installation einer neuen Softwareversion kann viele hundert Dateien enthalten, die sich in vielen Softwareverzeichnissen befinden. Wenn sich der Zielspeicherort für die gesamte Software auf einem einzelnen logischen LVM-Volume befindet, können wir vor dem Aktualisieren der Software einen Snapshot erstellen. Wenn die Software nach dem Testen nicht in der gewünschten Weise funktioniert. Es ist eine einfache Aufgabe, das ursprüngliche LV auf den Snapshot zurückzusetzen. Der Snapshot enthält natürlich die Kopie des ursprünglichen Quellvolumes zum Zeitpunkt der Erstellung des Snapshots.

Folgen Sie dem Link unten, um den ‘Complete Guide to LVM2 in Linux’ herunterzuladen, der nur £ 1.99 kostet! Sobald es heruntergeladen ist, kann das eBook bei Bedarf ausgedruckt werden.

eBook herunterladen

Vorbereiten der Erstellung eines LVM-Snapshots

Ein LVM-Snapshot muss in derselben Volume-Gruppe wie die Quell-LV erstellt werden. Bei Verwendung der CoW-Technologie (Copy on Write) muss der zugrunde liegende Speicher derselbe sein. Ermöglicht das Lesen unveränderter Daten im Snapshot aus der ursprünglichen LV-Quelle. Unsere Volume-Gruppe ist voll, daher löschen wir das vorhandene logische Volume und erstellen es in einer kleineren Größe neu. Wir werden auch zwei Einhängepunkte verwenden, /mnt/original und /mnt/snap .

Nach all dieser Arbeit befinden wir uns nun wieder in der Situation, in der wir ein neu formatiertes logisches Volume haben, das wir lv1 genannt haben. Dies wird nun zum Zweck der Demonstration in /mnt /original gemountet. Wir haben lv1 bei 600 MiB erstellt und 392 MiB freien Speicherplatz in der Volumengruppe vg1 belassen. Denken Sie daran, dass es sich nur um freien Speicherplatz in derselben Volume-Gruppe wie unsere logischen Volumes handelt. Snapshot muss in derselben Volume-Gruppe wie die Quelle LV erstellt werden. Wenn wir die Ausgabe des Befehls vgs überprüfen, können wir den verfügbaren freien Speicherplatz sehen:

# vgs VG #PV #LV #SN Attr VSize VFree vg1 2 1 0 wz--n- 992.00m 392.00m vg2 2 0 0 wz--n- 192.00m 192.00m

Dieser Befehl ist, wie wir bereits gesehen haben, eine großartige Möglichkeit, Volumengruppen zusammenzufassen. Um einen Zeitpunkt-Snapshot des logischen Volumes lv1 erstellen zu können, müssen wir einige Daten hinzufügen. Wir kopieren einfach die Datei /etc/services nach /mnt/original.

 # cp /etc/services /mnt/original/ # wc -l /mnt/original/services 612 /mnt/original/services

Wir können auch sehen, dass diese Datei auf meinem Ubuntu-Server 612 Zeilen enthält. Wir haben jetzt Daten, also lasst uns weitermachen.

Erstellen von LVM-Snapshots in LVM2

LVM-Snapshots sind im Wesentlichen einfache logische Volumes mit einigen zusätzlichen Extras. Sie werden also mit dem Befehl lvcreate und der Option –s erstellt. Wir müssen auch das Quellvolume angeben, wenn wir den Snapshot erstellen.

 # lvcreate -L 12m -s /dev/vg1/lv1 -n lv1_snap Logical volume "lv1_snap" created.

In den Befehlsoptionen können wir sehen, dass wir zuerst die Größe von 12 MiB angeben. Wir benötigen nur genügend Speicherplatz, um die Änderungen zu speichern, die wir an der Quelle vornehmen. Wir hätten die Quell-LV mit 600 MiB Daten füllen können, aber wenn sich wahrscheinlich nur 12 MiB ändern, benötigen wir nur ein Snapshot-Volume von 12 MiB. Wir passen die Größe des Snapshots an die Größe der Änderungen an, die auftreten werden. Die Option -s oder -snapshot gibt das Quellvolume für den Snapshot an. Wie zuvor legt die Option -n den Namen der LV fest, die wir erstellen.Der Snapshot ist Lese- / schreibfähig und kann daher gemountet werden. Lassen Sie uns fortfahren und es in das Verzeichnis / mnt / snap einbinden:

# mount /dev/vg1/lv1_snap /mnt/snap/

Wir können den gleichen Inhalt in beiden Verzeichnissen sehen, obwohl keine Änderungen stattgefunden haben. LVM-Snapshots werden mit den Originaldaten verknüpft, bis sie geändert werden.

Wenn wir uns die Details sowohl des Quell- als auch des Snapshot-Volumes ansehen, sieht es etwas anders aus. Erstens das lv1_snap-Volume. Der Snapshot LV.

# lvdisplay /dev/vg1/lv1_snap --- Logical volume --- LV Path /dev/vg1/lv1_snap LV Name lv1_snap VG Name vg1 LV UUID s8gBiX-IV1z-jiZK-q4dN-paG5-8mvq-TCQkuk LV Write Access read/write LV Creation host, time yogi, 2017-08-22 09:26:14 +0000 LV snapshot status active destination for lv1 LV Status available # open 1 LV Size 600.00 MiB Current LE 150 COW-table size 12.00 MiB COW-table LE 3 Allocated to snapshot 0.36% Snapshot chunk size 4.00 KiB Segments 1 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 252:3

Wir erinnern uns vielleicht, ich hoffe, Sie tun es, dass wir dies mit einer Größe von 12 MiB erstellt haben. Die LV-Größe wird jedoch als 600 MiB angezeigt. Die Größe, die wir sehen, ist die Original- oder Quell-LV. Die Snapshot-Größe wird in der COW-Table-Größe angezeigt. Copy-on-Write tritt auf, wenn Daten in der Quelle geändert werden und die Originaldaten dann auf das Snapshot-Volume kopiert werden. Das Snapshot-Volume listet immer die ursprünglichen Snapshot-Dateien auf, unabhängig davon, ob sie geändert wurden oder nicht. Bei der Erstellung des Snapshots müssen keine weiteren Änderungen gespeichert werden, sodass der zugewiesene Wert zu Beginn sehr niedrig ist und sich erhöht, wenn Änderungen an den Quelldaten vorgenommen werden. Wenn wir uns jetzt die Anzeigedetails für den lv1 LV ansehen, wird es auch ein wenig anders sein:

# lvdisplay /dev/vg1/lv1 --- Logical volume --- LV Path /dev/vg1/lv1 LV Name lv1 VG Name vg1 LV UUID dmVaWm-kA9V-xouM-OZBR-b7Id-aMUh-EWymB0 LV Write Access read/write LV Creation host, time yogi, 2017-08-21 18:51:57 +0000 LV snapshot status source of lv1_snap LV Status available # open 1 LV Size 600.00 MiB Current LE 150 Segments 2 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 252:0

Wir können sehen, dass es als Quelle des Snapshots für lv1_snap angezeigt wird.

LVM-Snapshot-Daten ändern

Wenn wir jetzt eine Änderung an den Daten im Quellvolume vornehmen, werden wir einen Unterschied in den Daten im Snapshot-Volume feststellen. Das Snapshot-Volume enthält die Originaldaten, während das Quell-LV die Änderungen enthält. Zuerst fügen wir dem Quellvolume eine neue Datei hinzu:

# cp /etc/hosts /mnt/original/

Wir können jetzt sehen, dass sich der Inhalt für die Quelle von den Snaphot-Volumes

unterscheidet. Wenn wir zum lvdisplay für lv1_snap zurückkehren, wird der Prozentsatz für den Snapshot erhöht.

# lvdisplay /dev/vg1/lv1_snap --- Logical volume --- LV Path /dev/vg1/lv1_snap LV Name lv1_snap VG Name vg1 LV UUID s8gBiX-IV1z-jiZK-q4dN-paG5-8mvq-TCQkuk LV Write Access read/write LV Creation host, time yogi, 2017-08-22 09:26:14 +0000 LV snapshot status active destination for lv1 LV Status available # open 1 LV Size 600.00 MiB Current LE 150 COW-table size 12.00 MiB COW-table LE 3 Allocated to snapshot 0.98% Snapshot chunk size 4.00 KiB Segments 1 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 252:3

Obwohl wir die vorhandenen Daten nicht geändert haben, wirkt sich das Hinzufügen neuer Daten auch auf den Snapshot aus, da das Snapshot-Volume die Daten so anzeigen muss, wie sie waren, als der Snapshot erstellt wurde. Bei Bedarf sollten wir in der Lage sein, das Original auf die Snapshotted-Daten zurückzusetzen.

Als nächstes überschreiben wir die ursprüngliche Datei /etc/services:

# > /mnt/original/services

Die Datei /mnt/original/services ist nun leer. Wenn wir die Snapshot-Datei jedoch überprüfen, enthält sie weiterhin die Daten. Mit dem Befehl wc können wir die Anzahl der Zeilen in jeder Datei zählen:

 # wc -l /mnt/original/services /mnt/snap/services 0 /mnt/original/services 612 /mnt/snap/services 612 total

Wenn Sie die Ausgabe von lvdisplay für lv1_snap erneut überprüfen, wird natürlich angezeigt, dass der Prozentsatz, der dem Snapshot zugewiesen wurde, mit der Änderung gestiegen ist:

Allocated to snapshot 1.17%

Volumeänderungen für LVM-Snapshots

Die Attribute für Quell- und Snapshot-LVs ändern sich, wenn der Snapshot erstellt wird. Wir können dies im Detail mit dem Befehl lvdisplay sehen, ist aber besser mit dem Befehl lvs zusammengefasst:

Es gibt 10 Attribute, die wir von links nach rechts lesen:

Für lv1 die Attribute read:

  • Volumen Typ: Herkunft. Die Quelle eines Snapshots
  • Berechtigungen: Beschreibbar
  • Zuordnungsrichtlinie: Von der Volume-Gruppe geerbt
  • Feste Minor-Nummer ist nicht gesetzt
  • Status: Ist als aktiv markiert
  • Gerät: Ist geöffnet oder gemountet
  • Zieltyp: Snapshot, d. h. Er nimmt an einem Snapshot teil

Für lv1_snap werden die Attribute gelesen:

  • Volume-Typ: Snapshot-Volume
  • Berechtigungen: Beschreibbar
  • Zuweisungsrichtlinie: Geerbt von der Volume-Gruppe
  • Feste Minor-Nummer ist nicht gesetzt
  • Status: Ist als aktiv markiert
  • Gerät: Ist geöffnet oder gemountet
  • Zieltyp: Snapshot, d. H. Es nimmt an einem Snapshot teil

Das ursprüngliche und das Ziel-LVs müssen sich in derselben Volume-Gruppe befinden, wie wir bereits erwähnt haben, aber sie werden nicht sie teilen sich nicht unbedingt dieselben Geräte innerhalb dieser Volumegruppen. Dies wird normalerweise von uns abstrahiert, aber wir können die Option zum Befehl lvs hinzufügen:

Wenn Sie das –o für Optionen und +Geräte hinzufügen, werden die zugrunde liegenden Geräte angezeigt, aus denen das LV besteht. Wir können sehen, dass lv1 größer als /dev/sdc1 oder / dev/sdc2 ist und sich über beide erstreckt. Während vg1_snap den verbleibenden Speicherplatz in /dev/sdc2 nutzen kann. Die Zahl in Klammern hinter dem Gerätenamen gibt die physikalische Extent-Nummer an, mit der das LV vom Gerät aus gestartet wird. Wir können sehen, dass lv1 ab der Ausdehnung 0 für / dev / sdc1 und / dev / sdc2 beginnt und lv1_snap ab der Ausdehnung 26 von / dev / sdc2 beginnt. Um alle Optionen anzuzeigen, die Ihnen mit der Option –o zur Verfügung stehen, verwenden Sie den Befehl:

# lvs -o help

Da die Liste umfangreich ist, haben wir die Ausgabe nicht berücksichtigt.

Neben der direkten Betrachtung der logischen Volumes können wir auch den Befehl lsblk verwenden. Hier werden wir mehr Änderungen sehen, als Sie vielleicht denken:

 # lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT loop1 7:1 0 100M 0 loop sdb 8:16 0 256M 0 disk loop0 7:0 0 100M 0 loop sdc 8:32 0 1000M 0 disk ├─sdc2 8:34 0 500M 0 part │ ├─vg1-lv1-real 252:1 0 600M 0 lvm │ │ ├─vg1-lv1 252:0 0 600M 0 lvm /mnt/original │ │ └─vg1-lv1_snap 252:3 0 600M 0 lvm /mnt/snap │ └─vg1-lv1_snap-cow 252:2 0 12M 0 lvm │ └─vg1-lv1_snap 252:3 0 600M 0 lvm /mnt/snap └─sdc1 8:33 0 499M 0 part └─vg1-lv1-real 252:1 0 600M 0 lvm ├─vg1-lv1 252:0 0 600M 0 lvm /mnt/original └─vg1-lv1_snap 252:3 0 600M 0 lvm /mnt/snap sda 8:0 0 9.8G 0 disk /

Die Geräte vg1-lv1 und vg1-lv1_snap sind uns bereits bekannt. Dies waren die zugrunde liegenden LVs, mit denen wir gearbeitet haben. Die Kernel-Major-Nummer oder der Treiber, der mit LVM2 verwendet wird, ist 252. Wir sehen dies also für alle LVs, die wir haben. Das erste LV war vg1-lv1, also hat dies die Nebenzahl 0. Wenn wir uns vg1-lv1_snap ansehen, hat dies jedoch eine untergeordnete Zahl von 3, die es als 4. LV und nicht als 2. angibt, wie wir es erwarten können. Stattdessen werden zwei Wrapper-LVs für den Snapshot erstellt, vg1-lv1-real und vg1-lv1_snap-cow. Diese werden intern verwaltet und wir beteiligen uns nicht an diesen Objekten, die LVM2 zur Verwaltung des Snapshot-Prozesses verwendet. Jedes LV, das wir hier sehen, hat auch ein entsprechendes Devmapper-Gerät. Wenn wir das Verzeichnis / dev und den Filer auf dm- * auflisten, können wir diese anzeigen.

# ls /dev/dm-* /dev/dm-0 /dev/dm-1 /dev/dm-2 /dev/dm-3

Wieder. wir sehen die 4 Geräte nicht nur die 2, die wir vielleicht erwartet haben. Im Hintergrund verwaltet LVM2 also viel für uns und ermöglicht uns nur den Zugriff auf die Elemente, die wir benötigen.

Wiederherstellen eines Volumes zum Snapshot

In einem Wiederherstellungsszenario mit LVM-Snapshots können wir zum Snapshot zurückkehren.Wenn wir feststellen, dass wir das ursprüngliche LV auf den Zeitpunkt des Schnappschusses zurücksetzen müssen, können wir dies tun. Denken Sie daran, dass der Snapshot eine Darstellung des ursprünglichen Volumes zum Zeitpunkt des Snapshots ist. Wir können dies tun, nachdem ein Software-Upgrade getestet wurde und die Entscheidung getroffen wurde, zu dem Snapshot zurückzukehren, der vor dem Software-Upgrade hätte erstellt werden sollen. Um sicherzustellen, dass wir dies in Echtzeit sehen können, werden wir zuerst beide LVs aushängen:

# umount /mnt/{original,snap}

Wenn wir die Geräte nicht schließen, müssen wir warten, bis das ursprüngliche LV, vg1 als nächstes aktiviert wird. Oft ist dies bei einem Neustart. Da beide logischen Volumes jetzt nicht gemountet und geschlossen sind, verwenden wir den Befehl lvconvert, um den Snapshot mit dem übergeordneten oder dem Ursprung zusammenzuführen. Dadurch wird das logische Quell-Volume auf den Snapshot-Inhalt zurückgesetzt. Der Snapshot wird am Ende des Vorgangs automatisch entfernt.

# lvconvert --merge /dev/vg1/lv1_snap Merging of volume lv1_snap started. lv1: Merged: 99.2% lv1: Merged: 100.0%

Abhängig von der Größe der zu fusionierenden Daten und der Geschwindigkeit der Festplatten kann dies einige Zeit dauern. Sie können die Option –b verwenden, um den Prozess im Hintergrund auszuführen.

Wenn wir nun lv1 wieder mounten und den Inhalt überprüfen. Wir werden die Hosts-Datei vermissen, die hinzugefügt wurde, nachdem der Snapshot erstellt wurde. Die Dienste-Datei haben wir jetzt den Inhalt, den wir überschrieben.

 # mount /dev/vg1/lv1 /mnt/original/ # ls /mnt/original/ lost+found services # wc -l /mnt/original/services 612 /mnt/original/services

Test und Entwicklung

Eine weitere Verwendung für LVM-Snapshots ist in einer Testumgebung. Wenn Sie lieber direkt mit den Snapshotted-Daten arbeiten möchten, können Sie dies tun. Wenn Sie fertig sind, müssen Sie nur den Snapshot LV aushängen und löschen. Das zugrunde liegende ursprüngliche LV bleibt unverändert. Dies ist großartig, wenn Sie vielleicht an Skripten arbeiten möchten, ohne die ursprünglichen Produktionsskripte zu beeinflussen.

Der Prozess ist ziemlich gleich, aber wir arbeiten jetzt nur mit dem Verzeichnis /mnt/snap. Eine Zusammenfassung der Befehle folgt:

Erweitern der Snapshot-Größe

Wenn wir ein Snapshot-Volume erstellen, sollten wir eine Größe festlegen, die unserer Meinung nach ausreicht, um alle Änderungen am ursprünglichen LV zu speichern, während der Snapshot vorhanden ist. Es ist jedoch möglich, ein Snapshot-Volume bei Bedarf automatisch zu erweitern.

Es ist wichtig zu beachten, dass der Snapshot automatisch gelöscht wird, wenn ein Snapshot vollständig gefüllt ist.

In den Standardeinstellungen können Snapshots nicht automatisch vergrößert werden. Das müssen wir ermöglichen. Die Konfiguration von LVM2 befindet sich in /etc/lvm/lvm.conf. Wenn wir mit grep nach den effektiven Einstellungen suchen:

 # grep -E '^\s*snapshot_auto' /etc/lvm/lvm.conf snapshot_autoextend_threshold = 100 snapshot_autoextend_percent = 20

Wenn snapshot_autoextend_threshold auf 100% festgelegt ist, wird der Snapshot niemals vergrößert. Sobald wir die 100% -Schwelle erreicht haben, wird der Snapshot gelöscht. Wenn autoextend aktiviert sein muss, sollten Sie dies auf 70 setzen. In diesem Fall wird die Größe erhöht, wenn der Snapshot 70% voll wird. Die Größe der Zunahme wird von snapshot_autoexend_percent gesteuert. Der Standardwert ist 20%, was bedeutet, dass die Größe jedes Mal um 20% der aktuellen Größe zunimmt, wenn ein Wachstum erforderlich ist.

Write a Comment

Deine E-Mail-Adresse wird nicht veröffentlicht.