Frage Hat btrfs eine effiziente Möglichkeit, Schnappschüsse zu vergleichen?


Während das Mounten von gemounteten Snapshots funktioniert, klingt es in vielen Fällen schrecklich langsam.

Gibt es eine btrfs-spezifische Funktionalität zum Auslagern von Snapshots? (Ich konnte keine in den Dokumenten finden)


20
2018-06-18 19:24


Ursprung


Während es möglich ist, herauszufinden, welche Blöcke geändert wurden und wie, müssen Sie den Fall berücksichtigen, wenn eine Änderung später umgekehrt wurde, wenn Sie wirklich Dateisysteme (Verzeichnisse) vergleichen wollen. Zum Beispiel, wenn Sie eine Datei haben A enthalten a, schreiben b in seinem Schnappschuss und später wieder zu ändern a, die Datei hat sich nicht wirklich verändert. - Cristian Ciupitu
Es sieht so aus, als ob es der Versionskontrolle des Quellcodes völlig analog wäre, wo diese Art von Dingen die ganze Zeit erledigt wird, es sei denn, ich verpasse etwas. - Catskul
Ein zusätzliches Problem bei der Ausführung von rsync in einem btrfs-Dateisystem besteht darin, dass das Lesen aller Dateien, um zu überprüfen, ob sie geändert wurden, die Datei effektiv ändert und der nächste Snapshot groß wäre, auch wenn keine Datei tatsächlich geändert wurde . Sehen lwn.net/Articles/499293 für eine Diskussion. - Luca Citi


Antworten:


Es klingt wie du suchst btrfs senden / empfangen, die in Linux 3.6 erscheinen wird. Das send Der Befehl erstellt eine Protokolldatei mit den Unterschieden zwischen zwei Snapshots receive Befehl wendet die Änderungen aus einer Datei an. Beachten Sie, dass Senden / Empfangen ein benutzerdefiniertes Dateiformat verwendet, sodass die Datei nicht genau wie zB diff oder tar aussieht.


10
2017-08-20 22:08



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


Ich betreibe Debian-Stable, die es nicht gibt btrfs sendAlso habe ich nach einer Lösung gesucht btrfs subvolume find-new.

Wenn Sie snapshot1 und snapshot2 haben und wissen möchten, was sich in der zweiten Version geändert hat, Snapshot 2, da snapshot1 erstellt wurde, können Sie das folgende Skript verwenden

btrfs-diff oldsnapshot/ newsnapshot/

Hier werden alle in newsnapshot / seit oldsnapshot / geänderten Dateien aufgelistet.

#!/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ären: btrfs subvolume find-new findet Dateien geändert nach dem eine bestimmte "Generation" von Snapshot. Es zeigt auch die aktuelle Generierungsnummer an.

Vorbehalte

z.B. Nimm den täglichen Schnappschuss eines Subvolumenkoffers:

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

So können wir die neue Datei sehen, die geänderte Datei sehen, aber die Löschung wird nicht gemeldet. Dies liegt daran, dass der Befehl über vorhandene Dateien berichtet und nicht über solche, die dies nicht tun.

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

$ btrfs-diff snap2/ live/
foo3

Die umbenannte Datei wird nicht gemeldet. Seine 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 machen wir eine neue Datei

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

eh! Wo ist Lala?. Wenn Sie eine andere Datei hinzufügen, lala erscheint. Also ist dieses Verhalten ein bisschen seltsam. Welches ist wahrscheinlich, warum das Wiki sagt:

Der find-new-Ansatz hat einige ernsthafte Einschränkungen und ist daher für etwas wie Senden / Empfangen nicht wirklich verwendbar.

Die Ungerade kommt jedoch, wenn Sie einen Live-Subvolume mit einem vorherigen Zustand vergleichen, nicht wenn Sie Snapshots (schreibgeschützt) vergleichen. Dies kann immer noch nützlich sein, es sei denn, Sie möchten auch gelöschte Dateien identifizieren.


9
2018-03-06 15:19



Hey, ich habe dein Werkzeug ein wenig erweitert. Dieses Tool zeigt Ihnen einen Stream aller Änderungen in Snapshots (es können auch einzelne Links ausgewählt werden) github.com/talwrii/btrlog - Att Righ


Dies wird durch das Snapshot-Convenience-Tool unterstützt snapper.

sudo snapper -c config diff 445..446

Natürlich erfordert dies, dass Sie verwenden snapper für deine Schnappschüsse.

Diese Snapshot-IDs können mit verwendet werden snapper list -a. Leider hat snapper zum Zeitpunkt des Schreibens keine Listen-Snapshots für eine einzelne Konfiguration unterstützt, obwohl diese Nummern aus Subvolumennamen gefunden werden können.


1
2018-04-05 13:41