💾 Backup/Restore
Home-Verzeichnis per rsync auf einen externen Datenträger sichern oder wiederherstellen
- Beispielpfad:
/mnt/ext-nvme/Backup/jo/ - Ziel-Dateisystem sollte ACLs und xattrs unterstützen (z.B. ext4 oder btrfs)
- siehe auch: Linux -> TRIM & ext4-Speicherfreigabe -> Externe NVMe-SSD in fstab einbinden
Hinweis
Dieses Backup lässt sich einfach per Klick starten und ist praktisch für schnelle inkrementelle Sicherungen. Es ersetzt jedoch kein Backup wie BackInTime für langfristige, physisch getrennte Sicherungen, bei dem du Zeitpläne festlegen kannst: z.B. täglich, wöchentlich, monatlich.
Diese Anleitung zeigt, wie das Home-Verzeichnis eines Benutzers (/home/USERNAME) mit rsync auf eine externe SSD gesichert und bei Bedarf daraus wiederhergestellt werden kann.
rsync eignet sich dafür besonders gut, weil es Dateien zuverlässig kopiert und dabei
wichtige Eigenschaften wie Dateirechte, Besitzer, Zeitstempel, symbolische Links, ACLs und erweiterte Attribute erhält. Dadurch bleibt das Home-Verzeichnis
nach dem Kopieren vollständig und funktionsfähig.
Wichtige Hinweise zur hier verwendeten Script‑/Konfiguration
-
Das zur Dokumentation passende Script enthält:
- Eine Sicherheitsabfrage vor Start (j/N).
- Eine optionale Dry‑Run‑Variable (DRYRUN) die aktivierbar ist.
- Eine kleine Liste von
--exclude-Einträgen (z.B..cache/,Downloads/,.local/share/Trash/). - Verwendung von
--info=progress2,stats2für Fortschritt und detaillierte Statistiken. --human-readablefür bessere Lesbarkeit der Größenangaben.--delete-delaystatt eines sofortigen--delete(siehe Erläuterung unten).- Am Ende eine Zusammenfassung und eine Pause (
read -rp "Drücke ENTER zum Beenden...") damit das Terminalfenster offen bleibt. - Falls das Zielverzeichnis fehlt, zeigt das Script eine Fehlermeldung und wartet auf ENTER, bevor es mit Exit beendet (damit die Meldung gelesen werden kann).
-
Konkrete
--exclude-Einträge im Script:.cache/Downloads/.local/share/Trash/
-
WICHTIG:
--delete-delaywird im Script verwendet — Erklärung weiter unten.
Backup: Home-Verzeichnis auf externe SSD sichern (Beispiel)
sudo rsync -aAX --exclude='.cache/' --info=progress2,stats2 --human-readable /home/jo/ /mnt/ext-nvme/Backup/jo/
Dieser Befehl kopiert den Inhalt von /home/jo/ auf das externe Laufwerk in das Verzeichnis /mnt/ext-nvme/Backup/jo/.
Parameter-Erklärung (angepasst an das Script):
sudo→ Führt den Befehl mit Root-Rechten aus (wichtig für Besitzer & Rechte)rsync→ Werkzeug zum Synchronisieren/Kopieren von Dateien-a→ Archivmodus (rekursiv + erhält Rechte, Besitzer, Zeitstempel, Links)-A→ Erhält ACLs (Access Control Lists)-X→ Erhält erweiterte Attribute (xattrs)--info=progress2,stats2→ Zeigt Gesamtfortschritt und ausführliche Statistiken an--human-readable→ Lesbare Größen (z.B. 1.2G statt Bytes)--exclude='.cache/'→ Schließt den Cache-Ordner vom Backup aus (weitere Excludes siehe Script)/home/jo/→ Quelle (Inhalt des Home-Verzeichnisses)/mnt/ext-nvme/Backup/jo/→ Ziel (Backup auf externer SSD)
Hinweis: Im Script ist DRYRUN als Option vorhanden und kann gesetzt werden (z.B. DRYRUN=(--dry-run)), dann wird rsync nur simuliert.
Verhalten bei Löschungen: --delete-delay vs --delete
- Das Script verwendet
--delete-delay. Das bedeutet:- rsync bereitet Löschen vor, führt die tatsächlichen Löschvorgänge jedoch erst am Ende der Übertragung aus.
- Vorteil: reduziert Risiko von teilweise gelöschten/inkonsistenten Zuständen während laufender Kopiervorgänge.
- Es unterscheidet sich von
--delete, das Dateien sofort während der Synchronisation entfernen kann.
- Für einen expliziten, vollständigen Restore wird in der Anleitung weiterhin
--deletegezeigt (s. Abschnitt "Vollständiger Restore"), da dies das Zielverzeichnis exakt an den Stand des Backups anpasst. Nutze--deletebewusst — das Script selbst verwendet aus Sicherheitsgründen--delete-delay.
Restore: Home-Verzeichnis aus Backup synchronisieren
Variante 1: Ohne Löschen (sicher)
sudo rsync -aAX --info=progress2,stats2 --human-readable /mnt/ext-nvme/Backup/jo/ /home/jo/
Dieser Befehl synchronisiert den Inhalt des Backups von der externen SSD nach /home/jo/.
Dabei werden alle Dateien aus dem Backup übernommen und bestehende Dateien im Ziel bei Abweichungen überschrieben. Dateien, die nur im Ziel vorhanden sind und nicht im Backup enthalten sind, bleiben jedoch erhalten.
⚠️ Achtung
Dieser Befehl stellt das Home-Verzeichnis nicht vollständig auf den Stand des Backups zurück.
Dateien, die nur im Zielverzeichnis vorhanden sind, bleiben bestehen.
Variante 2: Exakte Spiegelung (mit Löschen)
sudo rsync -aAX --delete-delay --info=progress2,stats2 --human-readable /mnt/ext-nvme/Backup/jo,/ /home/jo/
Dieser Befehl stellt das Zielverzeichnis als exakte Kopie des Backups wieder her.
Dabei werden:
- alle Dateien aus dem Backup übernommen
- bestehende Dateien aktualisiert
- und alle Dateien im Ziel gelöscht, die nicht im Backup vorhanden sind (am Ende des Durchlaufs)
⚠️ Achtung
Dieser Befehl löscht alle Dateien im Zielverzeichnis, die nicht im Backup enthalten sind.
Vor der Ausführung sollte unbedingt sichergestellt werden, dass das Backup vollständig und korrekt ist.💡 Empfehlung: Testlauf mit
--dry-rundurchführen.
Hinweis
joist nur ein Beispiel. Benutzername und Pfade müssen an das eigene System angepasst werden./mnt/ext-nvme/Backup/jo/ist nur ein Beispielpfad. Verwende den tatsächlichen Einhängepunkt und Ordnernamen des eingebundenen Laufwerks.- Der Slash am Ende eines Pfads ist wichtig:
/home/jo/kopiert den Inhalt des Verzeichnisses/home/jokopiert das Verzeichnis selbst--exclude='.cache/'schließt den Cache-Ordner aus, um Speicherplatz zu sparen und unnötige temporäre Dateien nicht mitzusichern.- Die Verwendung von
sudoist sinnvoll, damit Dateirechte, Besitzer und erweiterte Attribute korrekt übernommen werden.- Das hier dokumentierte Script wartet nach Fehlern (z. B. wenn das Zielverzeichnis fehlt) und am Ende auf ENTER, damit Fehlermeldungen bzw. die Zusammenfassung gelesen werden können.
- Ohne
--deleteoder--delete-delaywerden im Ziel keine Dateien entfernt, die in der Quelle nicht mehr vorhanden sind. Dadurch entsteht kein exakter Spiegel der Quelle.
Ein einfaches, robustes Bash-Script mit Statusmeldungen für manuelle Backups oder den Start per Autostart:
#!/bin/bash
set -euo pipefail
# ============================================
# backup_home.sh
# V2026-03-27
#
# Home-Backup Script (rsync)
#
# Erstellt ein inkrementelles Backup des Home-
# Verzeichnisses auf ein Zielmedium.
#
# Eigenschaften:
# - erhält Rechte, ACLs und Extended Attributes (-aAX)
# - zeigt Fortschritt (progress2) und detaillierte Statistiken (stats2)
# - schließt unnötige Ordner aus (mit --exclude)
# - Spiegelung: Ziel = exakte Kopie (Löschungen werden mit --delete-delay am Ende ausgeführt)
# - Sicherheitsabfrage vor Start (j/N)
# - pausiert am Ende für sichtbare Zusammenfassung
#
# ============================================
SOURCE="/home/jo/"
DEST="/mnt/ext-nvme/Backup/jo/"
# 👉 Dry-Run optional aktivieren:
# DRYRUN=(--dry-run)
DRYRUN=()
# Optional: KDE Plasma Vault (Tresor) speichert verschlüsselte Daten unter
# ~/.local/share/plasma-vault/ (dieser Pfad ist im Backup enthalten).
# Der Ordner "Vaults/" enthält diese sensiblen Inhalte und wird daher
# vom Backup ausgeschlossen.
# Hinweis: "Vaults/" ist nur ein Beispielpfad und muss ggf. an die
# tatsächliche lokale Konfiguration angepasst werden.
EXCLUDES=(
--exclude=".cache/"
--exclude=".local/share/Trash/"
--exclude="Downloads/"
--exclude="Vaults/"
)
START_TIME=$(date +%s)
clear
echo "💾 Starte Backup..."
echo "Quelle: $SOURCE"
echo "Ziel: $DEST"
echo "Zeit: $(date)"
echo "========================================"
# ✅ Sicherheitsabfrage
echo ""
read -rp "Backup wirklich starten? (j/N): " CONFIRM
if [[ ! "$CONFIRM" =~ ^[jJ]$ ]]; then
echo "❌ Abgebrochen."
exit 0
fi
# Prüfen ob $DEST existiert (kein mountpoint check)
if [ ! -e "$DEST" ]; then
echo "❌ Ziel-Pfad existiert nicht: $DEST"
echo " Lösung: Laufwerk mounten oder Pfad anpassen."
read -rp "Drücke ENTER zum Beenden..." _
exit 1
fi
echo ""
echo "🔄 Backup läuft..."
echo "----------------------------------------"
# rsync (sicher: Löschen erst am Ende)
set +e
rsync -aAX \
--delete-delay \
--info=progress2,stats2 \
--human-readable \
"${DRYRUN[@]}" \
"${EXCLUDES[@]}" \
"$SOURCE" "$DEST"
RSYNC_EXIT=$?
set -e
echo "----------------------------------------"
END_TIME=$(date +%s)
DURATION=$((END_TIME - START_TIME))
printf -v DURATION_FMT '%02d:%02d:%02d' \
$((DURATION/3600)) \
$((DURATION%3600/60)) \
$((DURATION%60))
# ✅ Ergebnis auswerten
if [ $RSYNC_EXIT -eq 0 ]; then
echo "✅ Backup erfolgreich abgeschlossen!"
elif [ $RSYNC_EXIT -eq 24 ]; then
echo "⚠️ Backup abgeschlossen (einige Dateien haben sich währenddessen geändert)"
else
echo "❌ Fehler beim Backup! (Code: $RSYNC_EXIT)"
fi
echo "Zeit: $(date)"
echo "Dauer: $DURATION_FMT (hh:mm:ss)"
echo "========================================"
echo "📊 Zusammenfassung:"
echo "- Fortschritt: aktiv (progress2)"
echo "- Stats: aktiv (stats2)"
echo "- Spiegelung: aktiv (mit --delete-delay)"
echo "- Excludes:"
for e in "${EXCLUDES[@]}"; do
echo " • $e"
done
echo "========================================"
echo ""
read -rp "Drücke ENTER zum Beenden..."
⚠️ Wichtig
Das Script mit Root-Rechten ausführen:
sudo bash backup_home.shAlternativ kann es ausführbar gemacht und direkt gestartet werden:
chmod +x backup_home.sh sudo ./backup_home.sh
Beispiel: KDE Shortcut backup_home.desktop
(Benutzername anpassen)
[Desktop Entry]
Comment[de_DE]=
Comment=
Exec=konsole -e bash -c "sudo /home/jo/bin/backup_home.sh"
GenericName[de_DE]=
GenericName=
Icon=backup
MimeType=
Name[de_DE]=backup_home
Name=backup_home
Path=
StartupNotify=true
Terminal=false
TerminalOptions=
Type=Application
X-DBUS-ServiceName=
X-DBUS-StartupType=
X-KDE-SubstituteUID=false
X-KDE-Username=