Verfügt btrfs über eine effiziente Methode zum Vergleichen von Snapshots?

21

Während verschiedene gemountete Schnappschüsse funktionieren, scheint es in vielen Fällen furchtbar langsam zu sein.

Gibt es btrfs-spezifische Funktionen zum Unterscheiden von Snapshots? (In den Dokumenten konnte ich keine finden.)

Catskul
quelle
Es ist zwar möglich herauszufinden, welche Blöcke wie geändert wurden, Sie müssen jedoch den Fall berücksichtigen, dass eine Änderung später rückgängig gemacht wurde, wenn Sie wirklich Dateisysteme (Verzeichnisse) vergleichen möchten. Wenn Sie zum Beispiel eine Datei haben, die Aenthält a, schreiben Sie bin den Snapshot und ändern Sie ihn später wieder in a, die Datei hat sich überhaupt nicht wirklich geändert.
Cristian Ciupitu
Es scheint, als wäre es völlig analog zur Versionskontrolle von Quellcode, wo so etwas die ganze Zeit gemacht wird, es sei denn, ich vermisse etwas.
Catskul
Ein zusätzliches Problem bei der Ausführung von rsync auf einem btrfs-Dateisystem ist, dass, sofern nicht die Option noatime mount verwendet wurde, das Lesen aller Dateien, um zu überprüfen, ob sie geändert wurden, diese effektiv modifiziert und der nächste Snapshot groß wäre, selbst wenn keine Datei tatsächlich modifiziert wurde . Eine Diskussion finden Sie unter lwn.net/Articles/499293 .
Luca Citi

Antworten:

11

Es hört sich so an, als ob Sie nach btrfs send / receive suchen , das in Linux 3.6 angezeigt wird. Der sendBefehl erstellt eine Protokolldatei mit den Unterschieden zwischen zwei Snapshots, und der receiveBefehl wendet die Änderungen aus einer Datei an. Beachten Sie, dass beim Senden / Empfangen ein benutzerdefiniertes Dateiformat verwendet wird, sodass die Datei beispielsweise nicht genau wie Diff oder Tar aussieht.

amcnabb
quelle
Nett! Genau das habe ich gesucht.
Catskul
2
Eine Beispiel-App, die diese Ausgabe analysiert, finden Sie unter: github.com/sysnux/btrfs-snapshots-diff (nicht von mir)
Att Righ
10

Ich verwende Debian Stable, das es nicht gibt btrfs send, also habe ich nach einer Lösung gesucht, die verwendet btrfs subvolume find-new.

Wenn Sie über Snapshot1 und Snapshot2 verfügen und wissen möchten, was sich in Snapshot 2 geändert hat, können Sie das folgende Skript verwenden, da Snapshot1 erstellt wurde

btrfs-diff oldsnapshot/ newsnapshot/

Hier werden alle Dateien aufgelistet, die in newsnapshot / since oldsnapshot / geändert wurden.

#!/bin/bash
usage() { echo $@ >2; echo "Usage: $0 <older-snapshot> <newer-snapshot>" >2; exit 1; }

[ $# -eq 2 ] || usage "Incorrect invocation";
SNAPSHOT_OLD=$1;
SNAPSHOT_NEW=$2;

[ -d $SNAPSHOT_OLD ] || usage "$SNAPSHOT_OLD does not exist";
[ -d $SNAPSHOT_NEW ] || usage "$SNAPSHOT_NEW does not exist";

OLD_TRANSID=`btrfs subvolume find-new "$SNAPSHOT_OLD" 9999999`
OLD_TRANSID=${OLD_TRANSID#transid marker was }
[ -n "$OLD_TRANSID" -a "$OLD_TRANSID" -gt 0 ] || usage "Failed to find generation for $SNAPSHOT_NEW"

btrfs subvolume find-new "$SNAPSHOT_NEW" $OLD_TRANSID | sed '$d' | cut -f17- -d' ' | sort | uniq

Erklärung: btrfs subvolume find-newFindet Dateien, die nach einer bestimmten 'Generierung' eines Schnappschusses geändert wurden . Es gibt auch die aktuelle Generationsnummer an.

Vorbehalte

zB machen Sie den täglichen Schnappschuss eines Subvolume-Falls:

mkdir test && cd test
btrfs subvolume create live
date >live/foo1
date >live/bar1
btrfs subvolume snapshot live/ snap1
date >live/foo2  # new file
date >>live/bar1 # modify file
rm live/foo1     # delete file
btrfs subvolume snapshot live/ snap2
date >live/foo3  # new file
mv live/bar{1,2} # rename file
rm live/foo2     # delete file

Was hat sich zwischen snap1 und snap2 geändert?

$ btrfs-diff snap1/ snap2/
bar1
foo2

Wir können also die neue Datei und die geänderte Datei sehen, aber das Löschen wird nicht gemeldet . Dies liegt daran, dass der Befehl auf vorhandene Dateien hinweist, nicht auf Dateien, die jetzt nicht vorhanden sind.

Was hat sich zwischen snap2 und dem Live-Subvolume geändert?

$ btrfs-diff snap2/ live/
foo3

Die umbenannte Datei wird nicht gemeldet . Ihre Daten haben sich nicht geändert.

Was nun, wenn wir der umbenannten Datei Daten hinzufügen?

date >>live/bar2
btrfs-diff snap2/ live/
bar2
foo3

OK, macht Sinn. Aber lasst uns eine neue Datei erstellen

date >live/lala
btrfs-diff snap2/ live/
bar2
foo3

eh! Wo ist Lala? . Wenn Sie eine weitere Datei hinzufügen, wird lalaangezeigt. Dieses Verhalten ist also etwas seltsam. Welches ist wahrscheinlich, warum das Wiki sagt:

Der Find-New-Ansatz weist einige schwerwiegende Einschränkungen auf und ist daher für etwas wie Senden / Empfangen nicht wirklich verwendbar.

Die Seltsamkeit tritt jedoch auf, wenn Sie ein Live-Subvolume mit einem vorherigen Status vergleichen, nicht, wenn Sie (schreibgeschützte) Snapshots vergleichen. Dies kann also weiterhin nützlich sein, es sei denn, Sie möchten auch gelöschte Dateien identifizieren.

Kunstvollroboter
quelle
Hallo zusammen, ich habe dein Tool ein wenig erweitert. Dieses Tool zeigt Ihnen einen Strom von allen Änderungen , die in Schnappschüsse geschehen (es können auch einzelne Links wählen) github.com/talwrii/btrlog
Att Righ
1

Dies wird vom Snapshot-Tool unterstützt snapper.

sudo snapper -c config diff 445..446

Natürlich müssen Sie dies snapperfür Ihre Schnappschüsse verwenden.

Diese Snapshot-IDs finden Sie mit snapper list -a. Leider unterstützte snapper zum Zeitpunkt des Schreibens keine Listen-Snapshots für eine einzelne Konfiguration, obwohl diese Nummern aus den Namen der Subvolumes hervorgehen.

Att Righ
quelle