Snapper

Snapshots in BTRFS anlegen: Eine Alternative zu Timeshift?!

Installation auf ArcoLinux:

pacman -S snapper snap-sync snap-pac

Natürlich gibt es snapper auch in anderen Distributionen. Bitte in der entsprechenden Paketverwaltung danach suchen.

Grundlegendes (manuell)

Snapper kann zu beliebigen BTRFS (sub-)volumes snapshots anlegen. Dazu muss zunächst eine Konfiguration für dieses volume angelegt werden. Als beispiel lege ich ein subvolume namens demo unterhalb des root-Verzeichnisses an.

btrfs subvolume create /demo
snapper -c demo create-config /demo

snapper -c demo list

Es wird angezeigt, dass es eine Instanz von demo gibt – die aktuelle – und noch keine snapshots. Mit einem leeren subvolume macht es auch wenig Sinn.

echo "einfach nur ein Text" > /demo/meinDemoFile.txt
snapper -c demo create
snapper -c demo list

Damit wäre die originale Version von meinDemoFile.txt festgehalten und wiederherstellbar.

echo "etwas mehr Text" >> /demo/meinDemoFile.txt
echo "ein anderer Text" >> /demo/zweitesDemoFile.txt
snapper -c demo create
snapper -c demo list

#Ausgabe (gekürzt):
# | Typ | Datum | Benutzer | |
0 | single | | root | current |
1 | single | Mo 07 Jun 2021 10:35:17 CEST | root | |
2 | single | Mo 07 Jun 2021 10:36:05 CEST | root | |

snapper -c demo status 1..2
#Ausgabe:
c….. /demo/meinDemoFile.txt
+….. /demo/zweitesDemoFile.txt

Ich ändere die Datei meinDemoFile.txt und lege eine weitere Datei zweitesDemoFile.txt an. Danach ziehe ich wieder einen snapshot, liste diese auf und werfe einen Blick auf den Status.

0 (null) ist immer der aktuelle Zustand. Daher ist zwischen den Snapshots 0 und 2 kein Unterschied festzustellen. Zwischen den Zuständen 0 und 1 liefert das gleiche Ergebnis wie (oben) 1 und 2.

Wo befinden sich Snapshots

snapper legt alle Schnappschüsse im relativen Wurzelverzeichnis des betreffenden Subvolumes an. Jeder Schnappschuss ist selbst ebenfalls ein Subvolume.

cd /demo
ls -la

insgesamt 8
drwxr-xr-x 1 root root 90 7. Jun 10:35 .
drwxr-xr-x 1 root root 168 4. Jun 13:57 ..
-rw-r--r-- 1 root root 33 7. Jun 10:35 meinDemoFile.txt
drwxr-x--- 1 root root 4 7. Jun 10:36 .snapshots
-rw-r--r-- 1 root root 17 7. Jun 10:35 zweitesDemofile.txt

Anmerkung zu Subvolumes:

BTRFS kann Subvolumen an beliebiger Stelle im Verzeichnisbaum erstellen bzw. ablegen. so ist das auch bei dem oben gezeigten Subvolumen .snapshots. Der ls Befehl zeigt es einfach als Unterverzeichnis an /demo an. Um weitere Details dazu zu erhalten, liste ich mit dem folgenden Befehl alle Subvolumen auf (die Ausgabe des Befehls ist hier gekürzt).:

btrfs subvolume list /demo
ID 393 gen 3062 top level 392 path .snapshots
ID 394 gen 3056 top level 393 path .snapshots/1/snapshot
ID 395 gen 3059 top level 393 path .snapshots/2/snapshot

Das Subvolume .snapshots ist nur ein Strukturelement das die einzelnen Schnappschüsse 1 und 2 enthält. Alle diese Subvolumen liegen in der angezeigten Hierarchie im Dateisystem (entsprechende Zugriffsrechte vorausgesetzt).

Wiederherstellen von Snapshots

Es gibt die beiden Snapshots 1 und 2. Snapshot 2 ist zur Zeit auch der aktuelle – also äuquivalent mit 0. Zunächst einmal muss ich mir Gedanken machen, welchen Zustand ich wieder herstellen möchte. Das kann ich mit einem Vergleichs-Tool wie z.B. KDiff3 und die Verzeichnissebäume der Snapshots 1 und 2 miteinander vergleichen.

Bei relativ übersichtlichen Änderungen bietet snapper auch eine textuelle Vergleichsmöglichkeit an

snapper -c demo diff 1..2

#Ausgabe:
--- /demo/.snapshots/1/snapshot/meinDemoFile.txt 2021-06-07 10:35:09.293340505 +0200
+++ /demo/.snapshots/2/snapshot/meinDemoFile.txt 2021-06-07 10:35:43.263225337 +0200
@@ -1 +1,2 @@
einfach nur Text
+etwas mehr Text
--- /demo/.snapshots/1/snapshot/zweitesDemofile.txt 1970-01-01 01:00:00.000000000 +0100
+++ /demo/.snapshots/2/snapshot/zweitesDemofile.txt 2021-06-07 10:35:56.453180620 +0200
@@ -0,0 +1 @@
+ein anderer Text

meinDemoFile.txt wurde um eine Zeile ‚etwas mehr Text‘ ergänzt und zweitesDemoFile wurde mit dem Inhalt ‚ein anderer Text‘ hinzugefügt.

Um den Zustand 1 herzustellen gebe ich folgenden Befehl ein:

snapper -c demo undochange 1..0
ls /demo

Im Verzeichnissystem ist die zweite Datei verschwunden und auch die zusätzliche Zeile aus der ersten Fil.e

snapper -c demo undochange 2..0
ls /demo

Stellt den Zustand 2 wieder her.

Snapper Konfiguration ändern

Die Standard-Konfiguration von snapper befindet sich unter /etc/snapper/config-templates/default.

Üblicherweise verändere ich hier die Parameter bzgl „TIMELINE_LIMIT_…“, da ich keine 50 Snapshots von jeder Kategorie benötige. Ich hebe mir üblicher Weise 4 Monatliche Snapshots von meinem root-Subvolume auf und trage das im entsprechenden Parameter ein. Die anderen time-limit Parameter ist dann entsprechend auf 0 (null) gesetzt.

Diese vier Snappshots habe ich nur, weil ich normalerweise viel an meinem System ausprobiere. Jemand der sein System eigentlich nur zum Surfen und Texte schreiben nutzt, kann hier eine deutlich niedrigere Snapshot-Frequenz wählen. Im Gegensatz dazu würde sich eventuell eine Stündliche Snapshot-Frequenz auf einem Projekt-bezogenen Subvolume anbieten, das die erstellten Dokumente enthält.

Vorsicht mit Snapshots

Snapshots sind standardmäßig beschreibbar. Normalerweise hat auf Snapshots nur root Zugriff. Es sollte selbstverständlich sein, in Snapshots nicht zu editieren. Es können auch schreibgeschützte Snapshots angelegt werden. Snapper bietet dazu die Option --read-only auf der Kommandozeile an.

Praxisbeispiel meiner Snapper-Konfiguration

Mit dem Befehl snapper list-configs lassen sich alle existierenden Schnappschuss-Konfigurationen ausgeben:

snapper list-configs
Konfiguration | Subvolumen
--------------+-----------
daten | /mnt/daten
demo | /demo
home | /home
root | /

Einmal abgesehen von dem oben im Beispiel verwendeten Subvolume /demo habe ich also mein System in Form von root, die Home-Verzeichnisse und meine Daten-Partition jeweils als Subvolumen repräsentiert. Die Subvolumen /home und / wurden in meinem Fall schon bei der Installation angelegt. Das Erzeugen dieser Konfigurationen klappt selbstverständlich nach dem gleichen Prinzip, wie ich oben /demo angelegt habe.

Automatisieren von Snapshots

Damit Snapper automatisch snapshots erstellt und veraltete Snapshots wieder löscht habe ich folgende Timer-Dienste aktiviert: snapper-timeline und snapper-cleanup.

systemctl enable snapper-timeline.timer
systemctl enable snapper-cleanup.timer

Beim nächsten Systemstart werden diese beiden Dienste automatisch mit gestartet. Wer das ohne zusätzlichen Reboot gleich jetzt starten möchte, kann das mit den folgenden beiden Zeilen tun.

systemctl start snapper-timeline.timer
systemctl start snapper-cleanup.timer