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:
- Computer neu starten
- Im GRUB-Menü: "Snapshots for GNU/Linux" wählen
- Snapshot auswählen: Den gewünschten Snapshot aus der Liste wählen
- System startet vom gewählten Snapshot (read-only)
- Wenn alles funktioniert:
sudo snapper rollbackum 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
- Vor großen Änderungen: Immer manuelles Pre/Post-Snapshot-Paar
- Regelmäßige Kontrolle:
sudo snapper listalle paar Tage prüfen - Speicherplatz überwachen: Bei >80% Festplattenbelegung Snapshots reduzieren
- Test-Rollbacks: Erst in VM oder Testsystem ausprobieren
- Backup-Strategie: Snapper ersetzt keine externe Datensicherung!
- Wichtige Daten: Separat in
/homemit 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!