Einen Linux-LVM-Snapshot festschreiben oder wiederherstellen?

15

Ich bin dabei, ein experimentelles Upgrade auf meinem CentOS 5-Server durchzuführen. Wenn das Upgrade fehlschlägt, möchte ich die Änderungen am Dateisystem zurücksetzen können. Dieses Szenario ähnelt dem Beispiel in Abschnitt 3.8 des LVM-HOWTO für LVM2-Lese- / Schreib-Snapshots - das Beispiel fehlt jedoch in der tatsächlichen Vorgehensweise.

  1. Wie würde ich die Änderungen festschreiben und sie wieder in der ursprünglichen Partition zusammenführen?

  2. Wie würde ich die Änderungen rückgängig machen und das Dateisystem in den ursprünglichen Zustand zurückversetzen? Sollte ich davon ausgehen, dass ich mehrere Dienste neu starten muss, wenn nicht direkt neu starten?

  3. Ist es möglich, nur bestimmte Verzeichnisse auf einer Partition zu sichern, oder handelt es sich um eine partitionsweite Operation?

Shewfig
quelle

Antworten:

10

Die Funktion zum Zusammenführen von LVM2 / Device Mapper-Snapshots ist verfügbar, wenn Sie Linux 2.6.33 oder höher ausführen und LVM 2.0.58 oder höher verwenden:

lvconvert --merge

Siehe diesen Beitrag: http://www.jonnor.com/2010/02/lvm-snapshot-merging-avaliable/

Es verweist auf http://kernelnewbies.org/Linux_2_6_33 (siehe Abschnitt 5, MD / DM) und LVM-Änderungsprotokoll unter 2.0.58: ftp://sources.redhat.com/pub/lvm2/WHATS_NEW

Aber ich kann dir noch nicht sagen, wie man es richtig benutzt ;-)

Bertrand Mathieu
quelle
dmsetup targetssollte snapshot-merge anzeigen, wenn dies der Fall ist, wird der Befehl merge, der auf snapshot-lv angewendet wird, auf den Zustand zurückgesetzt, in dem der Snapshot aufgenommen wurde.
Nils
Das OP scheint verwirrt zu sein, wenn es darum geht, Änderungen über eine Art Zusammenführungsschritt vorzunehmen. Die Änderungen werden festgeschrieben, wenn der Snapshot größer wird. Der Schnappschuss (der Änderungen) ist die benötigte Information, um sie über lvconvert --merge abzusichern. Wenn der OP mit seinen Änderungen zufrieden ist, kann er den Schnappschuss über lvremove löschen.
Vince
20

Ich habe gerade ein Snapshot-basiertes Upgrade mit Ubuntu ausprobiert. Und ja, ich musste mehrmals neu starten. Benennen Sie zuerst die ursprüngliche Root-Version in eine andere um, damit Sie dem Snapshot den ursprünglichen Namen geben können (da ein Upgrade viele Änderungen verursacht und Änderungen am Snapshot schneller sind als am Original):

 # lvrename lvm root root-old
 # lvcreate -n root -s lvm/root-old -L 10G

Die Größe sollte passend gewählt werden. Starten Sie dann neu, damit das 'neue' lvm / ubuntu als root gemountet wird und Sie das Upgrade durchführen können. Jetzt können Sie die neue Version testen und sogar zum alten System wechseln

 # lvrename lvm root root-new
 # lvrename lvm root-old root
 # reboot

Wenn Sie das Upgrade verwerfen möchten, führen Sie es einfach aus (vom alten System aus).

# lvremove lvm/root-new

Wenn Sie die Änderungen festschreiben möchten, führen Sie einfach (vom alten System aus)

# lvconvert --merge lvm/root-new

oder aus dem neuen System

# lvrename lvm root root-new
# lvconvert --merge lvm/root-new
# lvrename lvm root-old root

gefolgt von einem Neustart. Das System verweigert die sofortige Zusammenführung, da die Volumes geöffnet sind. Die Zusammenführung wird also während des Startvorgangs gestartet und fortgesetzt, solange Sie bereits mit dem System arbeiten können.

Übrigens: Wenn Sie zwischen den Systemen wechseln, denken Sie daran, den entsprechenden Kernel zu verwenden. Da / boot nicht Teil von lvm ist, werden der alte und der neue Kernel dort nebeneinander platziert.

Viktor Dick
quelle
Danke für deine Antwort. Ich habe gerade Ihre Prozedur in einer virtuellen CentOS 7-Maschine wiederholt und es hat wie ein Zauber funktioniert. Nachdem meine virtuelle Maschine mitten im Zusammenführungsprozess zurückgesetzt wurde, hat das LVM-Subsystem sie fortgesetzt, während das System noch auf die aktualisierten Dateien zugegriffen hat.
Anderson Medeiros Gomes
Ein Teil dieser Antwort scheint darauf hinzudeuten, dass Änderungen über lvconvert --merge vorgenommen werden. Mit zunehmender Größe des Snapshots werden auch die Änderungen übernommen. Mit lvconvert --merge werden die Änderungen mithilfe der Snapshot-Informationen wiederhergestellt (zurückgesetzt).
Vince
10

Ok, ich glaube, ich habe es durch erneutes Lesen des HOWTO 3.8 herausgefunden.

  • Schreibgeschützte Snapshots (wie LVM1) enthalten die Unterschiede auf Blockebene nach der Snapshot-Erstellung. Das Original wird weiterhin geändert, aber der Snapshot behält eine Darstellung des Originals bei. Lese aus der Snapshot stellt die Daten , wie sie zu dieser Zeit erschienen.
  • Read-Write - Snapshots (Standard in LVM2) geschrieben werden können: sie sind eine Gabel von der ursprünglichen Partition. Durch das Schreiben in den Schnappschuss wird das Original nicht geändert.

Bei der Funktionsweise eines Schnappschusses handelt es sich um eine Reihe von Änderungen auf Blockebene gegenüber dem Original. Wenn also auf das Original geschrieben wird, passieren folgende Dinge:

  1. Etwas versucht, das Original zu schreiben.
  2. Das Original wird gelesen und die Blöcke aus dem Original werden in den Schnappschuss kopiert.
  3. Original wird gewechselt.
  4. Der Schnappschuss enthält die "umgekehrten Unterschiede" - die Änderungen, durch die das Original so aussieht, wie es beim Erstellen des Schnappschusses war.

Das Wegwerfen des Schnappschusses wirkt sich also überhaupt nicht auf das Original aus, da das Original geändert wurde und der Schnappschuss nur eine Liste dieser Änderungen enthielt.

Beantwortung meiner eigenen Frage:

Erstellen Sie einen neuen Snapshot mit LVM. Wenn das Update so konfiguriert werden kann, dass es auf den Snapshot-Bereitstellungspunkt schreibt, verwenden Sie einen R / W-Snapshot. Andernfalls reicht entweder RO oder R / W aus.

Dann:

  • Wenn zum Schreiben R / W - Snapshot - Mount - Punkt, begeht durch den Snapshot auf die ursprüngliche Schreiben und zurück wechseln , indem Sie die Snapshot Wegwerfen.
  • Wenn Sie auf den ursprünglichen Bereitstellungspunkt schreiben , übergeben Sie ihn , indem Sie den Snapshot wegwerfen, und kehren Sie zurück, indem Sie vom Snapshot zum Original schreiben.

Ich habe immer noch kein spezielles Tool gefunden, um diese Zusammenführung durchzuführen. Da in meinem Szenario nicht genau die beabsichtigte Verwendung von Snapshots vorgesehen ist, gibt es möglicherweise kein Tool. Es klingt wie ein Job für Rdiff.

Shewfig
quelle
Es ist noch kein LVM-Merge-Tool verfügbar. Es war in Arbeit, aber ich glaube nicht, dass es vollständig ist.
Ignacio Vazquez-Abrams
Das Merge-Tool ist jetzt vorhanden (zumindest unter Ubuntu Trusty) - stellt lvconvert --merge <snapshot-name>die ursprüngliche Festplatte auf diesem Snapshot wieder her und löscht diesen Snapshot. Sie können es natürlich sofort schnell wiederherstellen.
DPB
3

LVM arbeitet auf Blockebene. Es weiß sogar nicht, was ein Dateisystem ist. Sie können also nicht nur bestimmte Verzeichnisse sichern, es sei denn, ein Dateisystem von einem anderen LVM-Volume ist dort bereitgestellt.

Wenn Sie einen LVM-Snapshot erstellen, fordern Sie das Duplikat eines Volumes "Copy on Write" an. Jeder Block, der auf dem Snapshot-Volume geändert wird, wird zunächst unverändert im Snapshot gespeichert. Um Änderungen vorzunehmen, müssen Sie also nichts unternehmen. Entfernen Sie einfach das Snapshot-Volume.

Ich weiß nicht genau, wie ich Änderungen rückgängig machen soll, da ich LVM in einem solchen Szenario nie verwendet habe, aber ich denke, es ist in der LVM-Dokumentation irgendwo gut beschrieben. Was auch immer es ist, Sie müssen wahrscheinlich alles neu starten, was geändert wurde. Ein Neustart ist möglicherweise eine gute Idee.

Jacek Konieczny
quelle
2
  1. Es gibt keinen Grund zu verschmelzen einige. Entfernen Sie einfach den Schnappschuss, und ändern Sie die Quell-LV
  2. Zusammenführen erforderlich, um Änderungen rückgängig zu machen lvconvert --merge <snapshot name>
  3. LVM arbeitet mit Blockgeräten. Alle FS-bezogenen Änderungen sollten von speziellen Dienstprogrammen (xfs_growfs, e2fsck, ...) je nach FS-Typ vorgenommen werden

Snapshot 'einfrieren' des ursprünglichen LV-Status. Schnappschuss entfernen bedeutet, diesen Zustand zu vergessen. Snapshot zusammenführen bedeutet, in diesen Zustand zurückzukehren

In LVM werden jedoch neu geschriebene Daten im Snapshot gespeichert: Stellen Sie sicher, dass die Snapshot-Größe dem erwarteten Änderungsumfang für LV und Snapshot entspricht

deman_killer
quelle
Tatsächlich friert der Schnappschuss nichts ein. Es zeichnet die Änderungen an einer zusätzlichen Stelle auf, damit sie bei Bedarf rückgängig gemacht werden können.
Vince
0

Die Dokumentation ist verwirrend. Es scheint mir, dass lvcreate --merge bedeutet, alle Änderungen rückgängig zu machen, und lvremove bedeutet, die Änderungen festzuschreiben. Der Unterschied liegt darin, wie Sie es verwenden.

In den meisten Fällen verwenden Sie den Snapshot lediglich als schreibgeschützte Kopie des Live-Volumes, und das Live-Volume ändert sich ständig. In diesem Fall würde ein Zusammenführen logischerweise bedeuten, dass Sie das Live-Volume mit der eingefrorenen Kopie überschreiben. Mit anderen Worten bedeutet Zusammenführen, dass Änderungen rückgängig gemacht werden, und Entfernen bedeutet, dass Änderungen festgeschrieben werden.

Wenn Sie in den Snapshot schreiben (eine neue Option mit LVM2), was anscheinend nicht das Standardverhalten ist und wahrscheinlich eine andere Konfiguration erfordert, damit Anwendungen in den Snapshot anstelle des ursprünglichen Volumes schreiben, ist dies umgekehrt.

Seien Sie bitte vorsichtig, wenn Sie mit Schnappschüssen umgehen, da einige Leute davon ausgehen, dass Sie sie auf eine Weise verwenden, und Anweisungen geben, die Ihr System zerstören können, wenn Sie unter der entgegengesetzten Annahme arbeiten!

RedScourge
quelle
Sie schreiben in den Snapshot, indem Sie den Snapshot mounten. Was eingehängt wird, wo es wenig mit den LVM-Standardeinstellungen zu tun hat, spielt keine Rolle, was genau Sie mit den einzelnen logischen Volumes tun, ob es sich um einen Snapshot handelt oder nicht, es wird nur nachverfolgt, ob sie geöffnet sind oder nicht.
Josip Rodin