Files

14 KiB

Snapper Anleitung für CachyOS - Detaillierte Version

Was ist Snapper?

Snapper ist ein Tool für BTRFS-Dateisysteme, das automatisch Snapshots (Momentaufnahmen) erstellt. Diese Snapshots sind wie "Wiederherstellungspunkte" - sie speichern den Zustand deines Systems zu einem bestimmten Zeitpunkt, ohne zusätzlichen Speicherplatz für unveränderte Dateien zu verbrauchen.

Installation mit pacman

# Hauptpakete installieren
sudo pacman -S snapper          # Das eigentliche Snapper-Tool
sudo pacman -S snap-pac         # Automatische Snapshots bei pacman-Operationen
sudo pacman -S snapper-gui-git  # Grafische Benutzeroberfläche (optional)

# Optional: Für GRUB-Integration (Boot-Menü mit Snapshots)
sudo pacman -S grub-btrfs       # Zeigt Snapshots im GRUB-Boot-Menü an

Grundkonfiguration verstehen

1. Snapper-Konfiguration für Root erstellen

# Falls bereits eine Konfiguration existiert, diese entfernen
sudo umount /.snapshots 2>/dev/null || true
sudo rm -rf /.snapshots

# Neue Snapper-Konfiguration für das Root-Dateisystem erstellen
# Dies erstellt automatisch eine Konfigurationsdatei unter /etc/snapper/configs/root
sudo snapper -c root create-config /

# Das automatisch erstellte .snapshots Verzeichnis ist ein normaler Ordner
# Wir brauchen aber ein BTRFS-Subvolume für bessere Performance
sudo btrfs subvolume delete /.snapshots
sudo mkdir /.snapshots

# Subvolume in /etc/fstab eintragen (wird automatisch gemacht)
sudo mount -a

Was passiert hier?

  • -c root = Konfigurationsname "root"
  • create-config / = Erstelle Konfiguration für das Verzeichnis /
  • Ein BTRFS-Subvolume ist effizienter als ein normaler Ordner für Snapshots

2. Konfigurationsdatei im Detail

sudo nano /etc/snapper/configs/root

Wichtige Parameter erklärt:

# SUBVOLUME: Das zu überwachende Verzeichnis
SUBVOLUME="/"

# FSTYPE: Dateisystemtyp (muss btrfs sein)
FSTYPE="btrfs"

# ALLOW_USERS/ALLOW_GROUPS: Welche Benutzer dürfen Snapshots verwalten?
ALLOW_USERS="dein-benutzername"
ALLOW_GROUPS="wheel"

# SYNC_ACL: Access Control Lists synchronisieren
SYNC_ACL="no"

# === TIMELINE SNAPSHOTS (zeitbasierte automatische Snapshots) ===

# TIMELINE_CREATE: Sollen automatische zeitbasierte Snapshots erstellt werden?
TIMELINE_CREATE="yes"

# TIMELINE_CLEANUP: Sollen alte Timeline-Snapshots automatisch gelöscht werden?
TIMELINE_CLEANUP="yes"

# Wie viele Timeline-Snapshots sollen behalten werden?
TIMELINE_MIN_AGE="1800"      # Mindestens 30 Minuten alt bevor Löschung möglich
TIMELINE_LIMIT_HOURLY="10"   # Maximal 10 stündliche Snapshots
TIMELINE_LIMIT_DAILY="10"    # Maximal 10 tägliche Snapshots  
TIMELINE_LIMIT_WEEKLY="0"    # Keine wöchentlichen Snapshots
TIMELINE_LIMIT_MONTHLY="10"  # Maximal 10 monatliche Snapshots
TIMELINE_LIMIT_YEARLY="10"   # Maximal 10 jährliche Snapshots

# === NUMBER CLEANUP (Bereinigung nach Anzahl) ===

# NUMBER_CLEANUP: Snapshots nach Anzahl begrenzen?
NUMBER_CLEANUP="yes"

# NUMBER_MIN_AGE: Snapshots müssen mindestens so alt sein (Sekunden)
NUMBER_MIN_AGE="1800"        # 30 Minuten

# NUMBER_LIMIT: Maximale Gesamtanzahl an Snapshots
NUMBER_LIMIT="50"

# NUMBER_LIMIT_IMPORTANT: Wichtige Snapshots (pre/post) getrennt begrenzen
NUMBER_LIMIT_IMPORTANT="10"

# === EMPTY CLEANUP (leere Snapshots löschen) ===
EMPTY_PRE_POST_CLEANUP="yes" # Leere Pre/Post-Snapshot-Paare löschen
EMPTY_PRE_POST_MIN_AGE="1800"

Was bedeuten die verschiedenen Snapshot-Typen?

  • Timeline: Automatisch nach Zeit erstellt (stündlich, täglich, etc.)
  • Pre/Post: Vor und nach Systemänderungen (z.B. Package-Updates)
  • Single: Einzelne manuelle Snapshots

Ein- und Ausgeschlossene Verzeichnisse verstehen

Automatisch eingeschlossene Verzeichnisse

Standardmäßig wird alles unter / gesnappt, außer:

# Diese Verzeichnisse werden NIEMALS gesnappt (hardcoded in Snapper):
/dev/*      # Device-Dateien (virtuelle Dateien)
/proc/*     # Process-Informationen (virtuelle Dateien)  
/sys/*      # System-Informationen (virtuelle Dateien)
/tmp/*      # Temporäre Dateien
/run/*      # Runtime-Daten
/mnt/*      # Mount-Punkte
/media/*    # Wechseldatenträger

Zusätzliche Ausschlüsse konfigurieren

Option 1: Exclude-Patterns in der Hauptkonfiguration

sudo nano /etc/snapper/configs/root

Füge hinzu:

# EXCLUDE_PATTERNS: Glob-Patterns für auszuschließende Dateien/Ordner
EXCLUDE_PATTERNS="/var/cache/* /var/tmp/* /var/log/* /home/*/.cache/* /root/.cache/*"

Option 2: Separate Filter-Datei (empfohlen)

# Filter-Datei erstellen
sudo mkdir -p /etc/snapper/filters
sudo nano /etc/snapper/filters/root.txt

Inhalt mit Erklärungen:

# Cache-Verzeichnisse (können jederzeit neu erstellt werden)
/var/cache/*
/home/*/.cache/*
/root/.cache/*

# Temporäre Dateien
/var/tmp/*
/tmp/*

# Log-Dateien (werden laufend überschrieben, Snapshots wenig sinnvoll)
/var/log/*

# Browser-Profile (sehr große, häufig ändernde Dateien)
/home/*/.mozilla/firefox/*/Cache/*
/home/*/.config/google-chrome/Default/Cache/*

# Papierkorb
/home/*/.local/share/Trash/*

# Downloads (optional - je nach Bedarf)
# /home/*/Downloads/*

# Virtuelle Maschinen (sehr groß)
/home/*/.local/share/libvirt/*
/var/lib/libvirt/*

# Docker-Daten (sehr groß und dynamisch)
/var/lib/docker/*

Dann in der Hauptkonfiguration referenzieren:

# In /etc/snapper/configs/root hinzufügen:
EXCLUDE_FILE="/etc/snapper/filters/root.txt"

Warum diese Ausschlüsse?

  • Cache-Verzeichnisse: Werden automatisch neu erstellt, verschwenden nur Platz
  • Log-Dateien: Ändern sich ständig, Snapshots helfen nicht bei der Fehlersuche
  • Temporäre Dateien: Per Definition temporär
  • Browser-Caches: Riesig und unwichtig für System-Recovery
  • VM/Docker-Daten: Sehr groß, haben eigene Backup-Strategien

Manuelle Snapshots erstellen

Einfache Snapshots

# Einfacher Snapshot mit Beschreibung
sudo snapper -c root create -d "Vor Firefox-Installation"

# Snapshot mit benutzerdefinierten Attributen
sudo snapper -c root create -d "Backup vor Kernel-Update" -u "important=yes"

Pre/Post-Snapshot-Paare (empfohlen für größere Änderungen)

# 1. PRE-Snapshot erstellen (vor der Änderung)
sudo snapper -c root create -t pre -p -d "Vor großem System-Update"
# Merke dir die Nummer! Z.B. "42"

# 2. Deine Systemänderungen durchführen
sudo pacman -Syu

# 3. POST-Snapshot erstellen (nach der Änderung)
sudo snapper -c root create -t post --pre-number 42 -d "Nach großem System-Update"

Warum Pre/Post-Paare?

  • Snapper kann exakt die Unterschiede zwischen vorher/nachher zeigen
  • Einfacheres Rollback nur der Änderungen
  • Bessere Übersicht was sich geändert hat

Snapshots verwalten

# Alle Snapshots auflisten
sudo snapper -c root list

# Detaillierte Ansicht mit Größe
sudo snapper -c root list -t all

# Informationen zu einem bestimmten Snapshot
sudo snapper -c root info 42

# Unterschiede zwischen zwei Snapshots anzeigen
sudo snapper -c root status 40..45

# Geänderte Dateien zwischen Snapshots zeigen
sudo snapper -c root diff 40..45

Automatisierung der Snapshot-Erstellung

1. Timeline-Snapshots (zeitbasiert)

# Systemd-Timer für stündliche Timeline-Snapshots aktivieren
sudo systemctl enable --now snapper-timeline.timer

# Timer für automatische Bereinigung alter Snapshots aktivieren  
sudo systemctl enable --now snapper-cleanup.timer

# Status der Timer prüfen
systemctl status snapper-timeline.timer
systemctl status snapper-cleanup.timer

# Nächste geplante Ausführung anzeigen
systemctl list-timers | grep snapper

Was macht snapper-timeline.timer?

  • Läuft stündlich
  • Erstellt automatisch Timeline-Snapshots basierend auf der Konfiguration
  • Berücksichtigt die TIMELINE_LIMIT-Einstellungen

Was macht snapper-cleanup.timer?

  • Läuft täglich
  • Löscht alte Snapshots basierend auf den Cleanup-Regeln
  • Verhindert, dass das System mit Snapshots volläuft

2. Automatische Snapshots bei Package-Updates

Das Paket snap-pac erstellt automatisch Pre/Post-Snapshots bei jeder pacman-Operation.

# Konfiguration von snap-pac anpassen
sudo nano /etc/snap-pac.ini
[DEFAULT]
# Maximale Länge der Snapshot-Beschreibung
desc_limit = 72

# Standard-Beschreibungen für automatische Snapshots
pre_description = pacman pre snapshot
post_description = pacman post snapshot

# Soll snap-pac auch bei AUR-Helper-Updates Snapshots erstellen?
aur_helper = yay,paru,pikaur

[root]
# Snapshots für das root-Subvolume aktivieren
snapshot = yes

# Welche Cleanup-Strategie verwenden?
cleanup = number

# Soll snap-pac auch bei normalen pacman-Operationen (nicht nur -S) Snapshots erstellen?
important = yes

Was passiert jetzt?

  • Bei jedem sudo pacman -S paket → automatisches Pre/Post-Snapshot-Paar
  • Bei yay -S aur-paket → ebenfalls Snapshots (wenn konfiguriert)
  • Bei sudo pacman -R paket → ebenfalls Snapshots

3. GRUB-Integration für Boot-Menü

# GRUB-Btrfs-Daemon aktivieren (überwacht Snapshot-Änderungen)
sudo systemctl enable --now grub-btrfsd

# Initramfs-Hook für Snapshot-Booting hinzufügen
sudo nano /etc/mkinitcpio.conf

In der HOOKS-Zeile hinzufügen:

HOOKS=(base udev autodetect modconf kms keyboard keymap consolefont block filesystems grub-btrfs-overlayfs fsck)
# Initramfs neu generieren
sudo mkinitcpio -P

# GRUB-Konfiguration aktualisieren
sudo grub-mkconfig -o /boot/grub/grub.cfg

Was bringt das?

  • Im GRUB-Boot-Menü erscheint ein neuer Eintrag "Snapshots for GNU/Linux"
  • Du kannst direkt von einem Snapshot booten ohne das System zu ändern
  • Perfekt um zu testen, ob ein älterer Zustand das Problem löst

Snapshots wiederherstellen

1. Einzelne Dateien wiederherstellen

# Snapshot mounten (macht ihn als Verzeichnis verfügbar)
sudo snapper -c root mount 42

# Jetzt ist der Snapshot verfügbar unter:
# /.snapshots/42/snapshot/

# Beispiel: Konfigurationsdatei wiederherstellen
sudo cp /.snapshots/42/snapshot/etc/fstab /etc/fstab

# Beispiel: Ganzes Verzeichnis wiederherstellen
sudo cp -r /.snapshots/42/snapshot/etc/NetworkManager/ /etc/

# Snapshot wieder unmounten (Speicher freigeben)
sudo snapper -c root umount 42

2. Änderungen zwischen Snapshots rückgängig machen

# Zeige was sich zwischen zwei Snapshots geändert hat
sudo snapper -c root status 40..45

# Mache alle Änderungen zwischen den Snapshots rückgängig
sudo snapper -c root undochange 40..45

# Alternativ: Rollback zu einem bestimmten Snapshot
sudo snapper -c root rollback 42

Vorsicht bei undochange:

  • Überschreibt aktuelle Dateien!
  • Erstelle vorher einen aktuellen Snapshot als Backup
  • Teste erst in einer nicht-kritischen Umgebung

3. Komplettes System-Rollback (für Experten)

# ACHTUNG: Dies überschreibt dein aktuelles System!
# Erstelle erst einen Snapshot des aktuellen Zustands
sudo snapper -c root create -d "Vor Rollback - Notfall-Backup"

# Zeige verfügbare Snapshots
sudo snapper -c root list

# Rollback zu Snapshot (z.B. Nummer 42)
sudo btrfs subvolume snapshot /.snapshots/42/snapshot / 

4. Boot von Snapshot über GRUB

Wenn grub-btrfs installiert ist:

  1. Computer neu starten
  2. Im GRUB-Menü: "Snapshots for GNU/Linux" wählen
  3. Snapshot auswählen: Den gewünschten Snapshot aus der Liste wählen
  4. System startet vom gewählten Snapshot (read-only)
  5. Wenn alles funktioniert: sudo snapper rollback um permanent zu wechseln

Überwachung und Wartung

Speicherplatz überwachen

# BTRFS-Dateisystem-Nutzung anzeigen
sudo btrfs filesystem usage /

# Größe aller Snapshots anzeigen
sudo btrfs subvolume list / | grep snapshots

# Detaillierte Snapshot-Größen
for snap in $(sudo snapper -c root list | tail -n +3 | awk '{print $1}'); do
    if [ "$snap" != "0" ]; then
        size=$(sudo btrfs subvolume show "/.snapshots/$snap/snapshot" 2>/dev/null | grep -E "^\s*Gen:" | wc -l)
        echo "Snapshot $snap: Exists"
    fi
done

Automatische Bereinigung konfigurieren

# Manuelle Bereinigung ausführen
sudo snapper -c root cleanup number    # Nach Anzahl-Regeln
sudo snapper -c root cleanup timeline  # Nach Zeit-Regeln

# Bereinigung-Logs anzeigen
journalctl -u snapper-cleanup.service

Fehlerbehandlung und Tipps

Häufige Probleme

Problem: /.snapshots ist ein normaler Ordner, kein Subvolume

# Lösung:
sudo umount /.snapshots
sudo rm -rf /.snapshots  
sudo btrfs subvolume create /.snapshots
sudo systemctl restart snapper-timeline.timer

Problem: Snapshots verbrauchen zu viel Speicher

# Lösung: Bereinigungsregeln anpassen
sudo nano /etc/snapper/configs/root
# NUMBER_LIMIT reduzieren (z.B. auf 20)
# Mehr Ausschlüsse hinzufügen

Problem: Automatische Snapshots funktionieren nicht

# Debugging:
systemctl status snapper-timeline.timer
journalctl -u snapper-timeline.service
sudo snapper -c root create -d "Test"  # Manuell testen

Best Practices

  1. Vor großen Änderungen: Immer manuelles Pre/Post-Snapshot-Paar
  2. Regelmäßige Kontrolle: sudo snapper list alle paar Tage prüfen
  3. Speicherplatz überwachen: Bei >80% Festplattenbelegung Snapshots reduzieren
  4. Test-Rollbacks: Erst in VM oder Testsystem ausprobieren
  5. Backup-Strategie: Snapper ersetzt keine externe Datensicherung!
  6. Wichtige Daten: Separat in /home mit eigenem Snapshot-Schema verwalten

Erweiterte Konfiguration für /home

# Separate Snapshot-Konfiguration für Home-Verzeichnis
sudo snapper -c home create-config /home

# Andere Bereinigungsregeln für /home (mehr Snapshots, da wichtiger)
sudo nano /etc/snapper/configs/home

Diese detaillierte Anleitung sollte dir ein vollständiges Verständnis von Snapper und dessen Konfiguration geben!