TL;DR — Kurzzusammenfassung
rsync-Leitfaden: Delta-Algorithmus, essentielle Flags, SSH-Remote-Backups, --link-dest-Snapshots, cron-Automatisierung und Daemon-Modus unter Linux.
rsync ist das Standard-Linux-Tool für effizientes Kopieren von Dateien und Remote-Backups. Sein Delta-Übertragungsalgorithmus berechnet Prüfsummen auf beiden Seiten und sendet nur die unterschiedlichen Bytes — was es für wiederholte Übertragungen großer Verzeichnisbäume deutlich schneller als scp macht. Dieser Leitfaden deckt alles ab, von grundlegenden Flags bis hin zu produktionsreifen inkrementellen Backup-Skripten mit --link-dest-Rotation.
Voraussetzungen
- Linux-System (Ubuntu 22.04+, Debian 12+, RHEL 9+ oder eine aktuelle Distribution).
- rsync auf Quell- und Zielrechnern installiert (
sudo apt install rsync/sudo dnf install rsync). - SSH-Schlüsselauthentifizierung für Remote-Übertragungen konfiguriert.
- Root- oder sudo-Zugriff für systemweite Backups.
Wie rsync funktioniert
rsync verwendet den Delta-Übertragungsalgorithmus, um die über das Netzwerk gesendeten Daten zu minimieren:
- Der Sender listet Dateien auf und berechnet gleitende Prüfsummen kleiner Blöcke.
- Der Empfänger prüft, welche Blöcke er bereits besitzt.
- Nur fehlende oder geänderte Blöcke werden übertragen.
- Metadaten (Berechtigungen, Zeitstempel, Eigentümer) werden separat synchronisiert.
Bei einem großen Verzeichnis, das sich täglich nur um 1% ändert, überträgt rsync bei nachfolgenden Durchläufen typischerweise weniger als 1% der Gesamtdaten. Die erste Übertragung ist immer eine vollständige Kopie; jeder nachfolgende Durchlauf ist standardmäßig inkrementell.
Wichtige Eigenschaften:
- Prüfsummenbasiert — erkennt Änderungen auch wenn der Änderungszeitstempel nicht aktualisiert wurde.
- Atomare Übertragung — Dateien werden unter einem temporären Namen geschrieben und bei Abschluss umbenannt.
- Plattformübergreifend — läuft auf Linux, macOS und Windows (über WSL oder Cygwin).
- Protokollversion ausgehandelt — Client und Server einigen sich beim Verbindungsaufbau auf die höchste unterstützte Version.
Grundlegende Syntax
rsync [OPTIONEN] QUELLE ZIEL
| Muster | Bedeutung |
|---|---|
rsync -a /src/ /dst/ | Kopiert den Inhalt von /src/ nach /dst/ |
rsync -a /src /dst/ | Kopiert das Verzeichnis /src selbst nach /dst/ |
rsync -a benutzer@host:/remote/ /lokal/ | Holt vom Remote ins Lokale |
rsync -a /lokal/ benutzer@host:/remote/ | Sendet vom Lokalen ins Remote |
Der abschließende Schrägstrich bei der Quelle ist wichtig. /src/ bedeutet „Inhalt von src kopieren”; /src bedeutet „Verzeichnis src selbst ins Ziel kopieren”.
Wesentliche Flags
rsync -avzP --delete \
--exclude='*.tmp' \
--exclude='.cache/' \
/home/benutzer/ benutzer@backupserver:/backups/home/
| Flag | Wirkung |
|---|---|
-a | Archiv: rekursiv + erhält Berechtigungen, Eigentümer, Zeitstempel, Symlinks, Gerätedateien |
-v | Ausführlich: zeigt jede übertragene Datei |
-z | Komprimiert Daten während der Übertragung (nützlich bei langsamen Links; bei schnellem LAN weglassen) |
-P | Zeigt Fortschritt pro Datei + behält Teildateien (--progress --partial kombiniert) |
--delete | Löscht am Ziel Dateien, die in der Quelle fehlen — erstellt einen exakten Spiegel |
-n / --dry-run | Simuliert die Übertragung ohne Änderungen vorzunehmen |
--exclude=MUSTER | Überspringt Dateien, die dem Muster entsprechen |
--include=MUSTER | Erzwingt die Aufnahme auch wenn ein breiterer Ausschluss sie überspringen würde |
-e ssh | Verwendet SSH als Transport (Standard in modernem rsync; Optionen mit -e 'ssh -p 2222' hinzufügen) |
--checksum | Vergleicht Dateiinhalte (nicht nur Größe+mtime); langsamer, erkennt aber stille Beschädigung |
--bwlimit=KBPS | Begrenzt die Bandbreitennutzung (z.B. --bwlimit=10000 für 10 MB/s) |
--log-file=PFAD | Schreibt ein Übertragungsprotokoll in die angegebene Datei |
--stats | Gibt nach Abschluss der Übertragung zusammenfassende Statistiken aus |
Führen Sie immer zuerst einen Trockenlauf durch
rsync -avzn --delete /wichtig/ benutzer@host:/backup/wichtig/
Überprüfen Sie die Ausgabe, dann führen Sie ohne -n erneut aus, um die Änderungen anzuwenden.
Remote-Synchronisierung über SSH
Senden (lokal → remote)
rsync -avz -e "ssh -i ~/.ssh/backup_ed25519" \
/var/www/html/ \
backupuser@192.168.1.50:/backups/webroot/
Holen (remote → lokal)
rsync -avz -e "ssh -i ~/.ssh/backup_ed25519" \
backupuser@192.168.1.50:/backups/webroot/ \
/var/www/html/
Benutzerdefinierter SSH-Port
rsync -avz -e "ssh -p 2222" /src/ benutzer@host:/dst/
Backup-SSH-Schlüssel einschränken
In ~/.ssh/authorized_keys auf dem Backup-Server den öffentlichen Schlüssel mit einem erzwungenen Befehl versehen:
command="rsync --server --daemon .",no-port-forwarding,no-X11-forwarding,no-agent-forwarding ssh-ed25519 AAAA...schlüssel...
Bandbreitenbegrenzung
# Auf 5 MB/s begrenzen
rsync -avz --bwlimit=5000 /quelle/ benutzer@host:/ziel/
# Auf 1 MB/s für Hintergrund-Backup-Jobs begrenzen
rsync -avz --bwlimit=1000 --delete /home/ benutzer@host:/backups/home/
Für dynamischere Drosselung:
nice -n 19 ionice -c 3 rsync -avz --bwlimit=2000 /quelle/ benutzer@host:/ziel/
Berechtigungen, Eigentümer und Erweiterte Attribute erhalten
Das Flag -a ist eine Kurzform für -rlptgoD:
| Unter-Flag | Erhält |
|---|---|
-r | Rekursion |
-l | Symbolische Links als symbolische Links |
-p | Berechtigungen (chmod-Bits) |
-t | Änderungszeitstempel |
-g | Gruppeneigentümer |
-o | Benutzereigentümer (erfordert Root) |
-D | Geräte- und Sonderdateien |
Für ACLs und erweiterte Attribute:
rsync -aAX /quelle/ /ziel/
| Extra-Flag | Erhält |
|---|---|
-A | POSIX-ACLs |
-X | Erweiterte Attribute (xattrs) |
Inkrementelle Backups mit —link-dest
--link-dest ermöglicht Hard-Link-basierte Snapshot-Backups — jedes tägliche Verzeichnis sieht wie eine vollständige Kopie aus, aber nur neue oder geänderte Dateien benötigen zusätzlichen Speicherplatz.
Konzept
/backups/
2026-03-20/ ← vollständige Daten, 50 GB
2026-03-21/ ← unveränderte Dateien per Hard-Link + nur geänderte Dateien; ~200 MB extra
2026-03-22/ ← per Hard-Link von 2026-03-21 + heutige Änderungen; ~150 MB extra
Skript
#!/bin/bash
set -euo pipefail
QUELLE="/home/"
ZIEL="backupuser@192.168.1.50:/backups"
HEUTE=$(date +%Y-%m-%d)
GESTERN=$(date -d "yesterday" +%Y-%m-%d)
SSH_KEY="/root/.ssh/backup_ed25519"
rsync -avz \
-e "ssh -i $SSH_KEY" \
--link-dest="$ZIEL/daily/$GESTERN" \
--delete \
"$QUELLE" \
"$ZIEL/daily/$HEUTE/"
echo "Backup abgeschlossen: $HEUTE"
Rotation: täglich / wöchentlich / monatlich
#!/bin/bash
QUELLE="/home/"
BASIS="/backups"
HEUTE=$(date +%Y-%m-%d)
DOW=$(date +%u)
DOM=$(date +%d)
ZIEL_HEUTE="$BASIS/daily/$HEUTE"
LETZTER_LINK="$BASIS/daily/latest"
rsync -a --delete \
--link-dest="$LETZTER_LINK" \
"$QUELLE" "$ZIEL_HEUTE/"
ln -sfn "$ZIEL_HEUTE" "$LETZTER_LINK"
[ "$DOW" -eq 7 ] && cp -al "$ZIEL_HEUTE" "$BASIS/weekly/$(date +%Y-W%V)"
[ "$DOM" -eq 01 ] && cp -al "$ZIEL_HEUTE" "$BASIS/monthly/$(date +%Y-%m)"
find "$BASIS/daily" -maxdepth 1 -type d | sort | head -n -7 | xargs rm -rf
find "$BASIS/weekly" -maxdepth 1 -type d | sort | head -n -4 | xargs rm -rf
find "$BASIS/monthly" -maxdepth 1 -type d | sort | head -n -12 | xargs rm -rf
Automatisierung mit cron und systemd-Timern
cron
crontab -e
# Hinzufügen:
0 2 * * * /usr/local/bin/rsync-backup.sh >> /var/log/rsync-backup.log 2>&1
systemd-Dienst + Timer
/etc/systemd/system/rsync-backup.service:
[Unit]
Description=Tägliches rsync-Backup
After=network-online.target
Wants=network-online.target
[Service]
Type=oneshot
User=root
ExecStart=/usr/local/bin/rsync-backup.sh
StandardOutput=journal
StandardError=journal
/etc/systemd/system/rsync-backup.timer:
[Unit]
Description=Täglicher rsync-Backup-Timer
[Timer]
OnCalendar=*-*-* 02:00:00
RandomizedDelaySec=10min
Persistent=true
[Install]
WantedBy=timers.target
systemctl daemon-reload
systemctl enable --now rsync-backup.timer
rsync Daemon-Modus
Für hohe Volumina oder geplante Pulls ohne interaktive SSH-Authentifizierung:
/etc/rsyncd.conf
uid = nobody
gid = nogroup
use chroot = yes
max connections = 4
log file = /var/log/rsyncd.log
[backups]
path = /backups/shared
comment = Geteilter Backup-Bereich
read only = no
auth users = backupclient
secrets file = /etc/rsyncd.secrets
hosts allow = 192.168.1.0/24
hosts deny = *
chmod 600 /etc/rsyncd.secrets
systemctl enable --now rsync
Client-Nutzung
rsync -avz backupclient@backupserver::backups /lokal/wiederherstellen/
Der doppelte Doppelpunkt (::) signalisiert den Daemon-Modus.
Überwachung und Protokollierung
rsync -avz --stats /quelle/ /ziel/ 2>&1 | tee /var/log/rsync-$(date +%Y%m%d).log
Fehler in Skripten überprüfen
rsync -avz /quelle/ /ziel/
EXIT=$?
if [ $EXIT -ne 0 ] && [ $EXIT -ne 24 ]; then
echo "rsync fehlgeschlagen mit Code $EXIT" | mail -s "Backup fehlgeschlagen auf $(hostname)" admin@beispiel.com
fi
Exit-Code 24 (Dateien während der Übertragung verschwunden) ist bei aktiven Systemen normal; behandeln Sie ihn als Erfolg.
rsync vs scp vs sftp vs Borg vs rclone
| Merkmal | rsync | scp | sftp | BorgBackup | rclone |
|---|---|---|---|---|---|
| Delta-Übertragung | Ja | Nein | Nein | Ja (Dedup) | Teilweise |
| Partielle fortsetzen | Ja (-P) | Nein | Ja | Ja | Ja |
| Verschlüsselung | Via SSH | SSH | SSH | AES-256 nativ | Via SSH/API |
| Deduplizierung | Nein | Nein | Nein | Ja | Nein |
| Inkrementelle Snapshots | Ja (--link-dest) | Nein | Nein | Ja | Nein |
| Cloud-Backends | Nein | Nein | Nein | Nur SSH | S3, GCS, viele |
| Komprimierung | Ja (-z) | Nein | Nein | lz4/zstd | Ja |
| Am besten für | Spiegelung, Backups | Einmalige Kopie | Interaktive Dateien | Speichereffizientes Backup | Cloud-Sync |
Zusammenfassung
- rsync verwendet Delta-Übertragung — nur geänderte Dateiblöcke werden gesendet, was wiederholte Backups sehr schnell macht.
- Verwenden Sie
-aAXz, um alle Metadaten einschließlich ACLs und xattrs zu erhalten; fügen Sie-Pfür fortsetzbare Übertragungen hinzu. - Führen Sie immer einen Trockenlauf mit
-ndurch, bevor Sie--deletezu einem neuen Ziel hinzufügen. --link-desterstellt speichereffiziente Hard-Link-Snapshots — die Grundlage professioneller Rotationsschemata.- Schränken Sie Backup-SSH-Schlüssel in
authorized_keysmit einem erzwungenen Befehl ein, um den Schadenradius zu begrenzen. - Bevorzugen Sie systemd-Timer gegenüber cron für automatisierte Backups — bessere Protokollierung und Behandlung verpasster Läufe.
- Exit-Code 24 ist bei aktiven Systemen normal; behandeln Sie ihn in Skripten als Erfolg.
- Führen Sie
rsync --statsaus und protokollieren Sie die Ausgabe, um stille Backup-Fehler zu erkennen, bevor Sie wiederherstellen müssen.