Zum Inhalt springen

rsync

rsync (Remote Sync) ist das Standard-Werkzeug für effiziente Datei-Synchronisation. Es überträgt nur geänderte Teile von Dateien — nicht alles bei jeder Ausführung.

Terminal-Fenster
rsync [optionen] QUELLE ZIEL

rsync vergleicht Quelle und Ziel anhand von Größe und Zeitstempel (oder Prüfsummen) und überträgt nur Unterschiede.

OptionBedeutung
-a / --archiveArchiv-Modus: rekursiv + Rechte, Zeitstempel, Symlinks, Owner
-v / --verboseFortschritt anzeigen
-z / --compressKomprimierung während der Übertragung
-n / --dry-runNur anzeigen, was gemacht würde — nichts verändern
--deleteDateien im Ziel löschen, die in der Quelle nicht mehr existieren
--excludeDateien/Verzeichnisse ausschließen
--progressFortschritt pro Datei anzeigen
-P--progress + --partial (Unterbrechungen fortsetzbar)
--bwlimit=RATEBandbreite begrenzen (z.B. --bwlimit=10m)

-a ist äquivalent zu -rlptgoD — fast immer der richtige Startpunkt.

Terminal-Fenster
# Verzeichnis sichern
rsync -av /home/micha/ /backup/micha/
# Wichtig: Slash am Ende der Quelle
rsync -av /home/micha/ /backup/micha/ # Inhalt von micha/ → backup/micha/
rsync -av /home/micha /backup/ # Verzeichnis micha → backup/micha/
Terminal-Fenster
# Lokal → Remote
rsync -avz /home/micha/ user@server:/backup/micha/
# Remote → Lokal
rsync -avz user@server:/var/www/ /backup/webserver/
# Mit SSH-Port
rsync -avz -e "ssh -p 2222" /home/micha/ user@server:/backup/micha/
Terminal-Fenster
# Synchronisiert exakt: Gelöschtes in der Quelle wird auch im Ziel gelöscht
rsync -av --delete /home/micha/ /backup/micha/

Ohne --delete ist das Ziel ein additive Kopie — gelöschte Dateien bleiben im Backup erhalten. Je nach Anwendungsfall kann das erwünscht sein oder nicht.

Terminal-Fenster
# Einzelne Muster
rsync -av --exclude="*.tmp" --exclude=".cache/" /home/micha/ /backup/micha/
# Ausschluss-Datei
rsync -av --exclude-from=/etc/backup-exclude.txt /home/micha/ /backup/micha/

Beispiel /etc/backup-exclude.txt:

*.tmp
*.log
.cache/
.local/share/Trash/
node_modules/
Terminal-Fenster
rsync -avn --delete /home/micha/ /backup/micha/

Zeigt genau an, was gemacht würde, ohne etwas zu verändern. Empfehlenswert vor dem ersten Einsatz und bei --delete.

Für tägliche Snapshots mit minimalem Speicherverbrauch: Hard-Links auf unveränderte Dateien aus dem Vortag:

#!/bin/bash
DATUM=$(date +%Y-%m-%d)
GESTERN=$(date -d yesterday +%Y-%m-%d)
QUELLE=/home/
ZIEL=/backup/snapshots
rsync -av --delete \
--link-dest="$ZIEL/$GESTERN" \
"$QUELLE" "$ZIEL/$DATUM/"

Jedes Verzeichnis snapshots/2025-01-15/ sieht wie ein vollständiges Backup aus, belegt aber nur den Speicher der tatsächlich geänderten Dateien.

/usr/local/bin/backup-home.sh
#!/bin/bash
QUELLE=/home/
ZIEL=/backup/home/
LOG=/var/log/backup.log
rsync -av --delete \
--exclude="*.tmp" \
--exclude=".cache/" \
"$QUELLE" "$ZIEL" >> "$LOG" 2>&1
echo "$(date): Backup abgeschlossen" >> "$LOG"

Als systemd-Timer oder Cron-Job täglich ausführen:

Terminal-Fenster
# Crontab: täglich um 2:30 Uhr
30 2 * * * /usr/local/bin/backup-home.sh