rsync ist das Standard-Tool für Datensynchronisation unter Linux. Es überträgt nur geänderte Dateiteile und ist damit extrem effizient für Backups und Spiegelungen.

Funktionsweise

Delta-Transfer

Quelle: file.dat (100 MB, 10 KB geändert)
           ↓
    rsync-Algorithmus
           ↓
Übertragung: nur 10 KB
           ↓
Ziel: file.dat (aktualisiert)

Grundlegende Syntax

rsync [Optionen] Quelle Ziel

Lokale Synchronisation

# Verzeichnis kopieren
rsync -av /quelle/ /ziel/

# Mit Fortschritt
rsync -avh --progress /quelle/ /ziel/

Remote-Synchronisation

# Zu Remote-Server
rsync -avz /lokaler/pfad/ user@server:/remote/pfad/

# Von Remote-Server
rsync -avz user@server:/remote/pfad/ /lokaler/pfad/

Wichtige Optionen

Standard-Optionen

| Option | Beschreibung | |--------|--------------| | -a | Archiv-Modus (rekursiv, Rechte, Links) | | -v | Verbose (ausführliche Ausgabe) | | -z | Kompression während Übertragung | | -h | Human-readable (Größen) | | -P | Fortschritt und partial | | -n | Dry-run (nur simulieren) |

Erweiterte Optionen

| Option | Beschreibung | |--------|--------------| | --delete | Gelöschte Dateien auch am Ziel löschen | | --exclude | Dateien/Verzeichnisse ausschließen | | --include | Explizit einschließen | | --backup | Backup vor Überschreiben | | --backup-dir | Backup-Verzeichnis | | --bwlimit | Bandbreite begrenzen (KB/s) | | --partial | Teilweise übertragene Dateien behalten | | --compress-level | Kompressionsgrad (0-9) |

Datei-Optionen

| Option | Beschreibung | |--------|--------------| | -r | Rekursiv | | -l | Symlinks als Symlinks | | -p | Berechtigungen erhalten | | -t | Zeitstempel erhalten | | -o | Owner erhalten (root) | | -g | Gruppe erhalten | | -D | Devices und Specials |

Praktische Beispiele

Einfaches Backup

# Lokales Backup
rsync -avh --progress /home/user/ /backup/user/

# Mit Löschen (exakte Spiegelung)
rsync -avh --delete /home/user/ /backup/user/

Remote-Backup

# Über SSH (Standard)
rsync -avz -e ssh /home/user/ user@backup-server:/backup/user/

# Mit speziellem SSH-Port
rsync -avz -e "ssh -p 2222" /home/user/ user@server:/backup/

# Mit SSH-Key
rsync -avz -e "ssh -i /path/to/key" /data/ user@server:/backup/

Ausschlüsse

# Einzelne Dateien/Verzeichnisse
rsync -av --exclude='*.tmp' --exclude='.cache' /home/ /backup/

# Exclude-Datei
rsync -av --exclude-from='/etc/rsync-exclude.txt' /home/ /backup/
# /etc/rsync-exclude.txt
*.tmp
*.log
.cache
.local/share/Trash
node_modules

Bandbreiten-Limit

# Auf 5 MB/s begrenzen
rsync -avz --bwlimit=5000 /data/ user@server:/backup/

# Für langsame Verbindungen
rsync -avz --bwlimit=1000 --compress-level=9 /data/ user@server:/backup/

Inkrementelles Backup

#!/bin/bash
# Inkrementelles Backup mit Hard Links

DATE=$(date +%Y-%m-%d)
BACKUP_DIR="/backup"
SOURCE="/home"
LATEST="$BACKUP_DIR/latest"
TARGET="$BACKUP_DIR/$DATE"

rsync -av --delete \
    --link-dest="$LATEST" \
    "$SOURCE/" "$TARGET/"

# Link aktualisieren
rm -f "$LATEST"
ln -s "$TARGET" "$LATEST"

Mirror mit Checksummen

# Prüfsummen statt Timestamp
rsync -avc --checksum /source/ /destination/

Backup-Strategien

Tägliches Backup-Script

#!/bin/bash
# /usr/local/bin/daily-backup.sh

SOURCE="/var/www"
DEST="backup-server:/backup/www"
LOG="/var/log/rsync-backup.log"
EXCLUDE="/etc/rsync-exclude.txt"

echo "=== Backup Start: $(date) ===" >> $LOG

rsync -avz --delete \
    --exclude-from="$EXCLUDE" \
    -e "ssh -i /root/.ssh/backup_key" \
    "$SOURCE/" "$DEST/" >> $LOG 2>&1

RESULT=$?

if [ $RESULT -eq 0 ]; then
    echo "=== Backup erfolgreich: $(date) ===" >> $LOG
else
    echo "=== Backup FEHLER ($RESULT): $(date) ===" >> $LOG
    # Benachrichtigung senden
    mail -s "Backup Fehler" admin@example.de < $LOG
fi

Rotierendes Backup

#!/bin/bash
# Wöchentliche Rotation

BACKUP_BASE="/backup"
SOURCE="/data"

# Rotation
rm -rf $BACKUP_BASE/weekly.4
mv $BACKUP_BASE/weekly.3 $BACKUP_BASE/weekly.4 2>/dev/null
mv $BACKUP_BASE/weekly.2 $BACKUP_BASE/weekly.3 2>/dev/null
mv $BACKUP_BASE/weekly.1 $BACKUP_BASE/weekly.2 2>/dev/null
mv $BACKUP_BASE/weekly.0 $BACKUP_BASE/weekly.1 2>/dev/null

# Neues Backup mit Hard Links zum vorherigen
rsync -av --delete \
    --link-dest=$BACKUP_BASE/weekly.1 \
    $SOURCE/ $BACKUP_BASE/weekly.0/

Zwei-Wege Synchronisation

# Achtung: Konflikte möglich!
# Besser: unison oder syncthing verwenden

# Von A nach B
rsync -avz --update serverA:/data/ /local/data/

# Von B nach A
rsync -avz --update /local/data/ serverB:/data/

rsync-Daemon

Server-Konfiguration

# /etc/rsyncd.conf

uid = nobody
gid = nogroup
use chroot = yes
max connections = 10
pid file = /var/run/rsyncd.pid
log file = /var/log/rsyncd.log

[backup]
    path = /backup
    comment = Backup Storage
    read only = no
    list = yes
    auth users = backupuser
    secrets file = /etc/rsyncd.secrets
    hosts allow = 192.168.1.0/24
# /etc/rsyncd.secrets
backupuser:sicheres_passwort
chmod 600 /etc/rsyncd.secrets

Daemon starten

# Systemd
systemctl enable rsync
systemctl start rsync

# Oder manuell
rsync --daemon

Client-Verbindung

# Mit rsync-Protokoll
rsync -avz /data/ backupuser@server::backup/data/

# Passwort aus Datei
rsync -avz --password-file=/etc/rsync.pass /data/ backupuser@server::backup/

Fehlerbehandlung

Return Codes

| Code | Bedeutung | |------|-----------| | 0 | Erfolgreich | | 1 | Syntax-Fehler | | 2 | Protokoll-Inkompatibilität | | 3 | Fehler bei Dateiauswahl | | 5 | Error starting client-server protocol | | 10 | Fehler in Socket I/O | | 11 | Fehler in Datei I/O | | 12 | Fehler in rsync-Protokollstrom | | 23 | Partial transfer | | 24 | Verschwindende Quelldateien | | 30 | Timeout |

Partial und Resume

# Teilweise Übertragung fortsetzen
rsync -avP --partial /source/ /destination/

# Partial-Verzeichnis
rsync -av --partial-dir=.rsync-partial /source/ /destination/

Timeout

# I/O Timeout (Sekunden)
rsync -avz --timeout=60 /source/ user@server:/dest/

Performance-Tipps

Schnelle Übertragung

# Ohne Kompression (schnelles Netzwerk)
rsync -av --no-compress /source/ /destination/

# Mit schnellem Cipher
rsync -avz -e "ssh -c aes128-gcm@openssh.com" /source/ user@server:/dest/

Große Dateien

# Inplace-Update (weniger I/O)
rsync -av --inplace /source/ /destination/

# Append-Mode für wachsende Dateien
rsync -av --append /source/log.txt user@server:/dest/

Viele kleine Dateien

# Dateiliste vorab erstellen
rsync -av --files-from=/tmp/filelist.txt / user@server:/backup/

Zusammenfassung

| Option | Funktion | |--------|----------| | -a | Archiv-Modus | | -v | Verbose | | -z | Kompression | | -P | Progress + Partial | | --delete | Löschen am Ziel | | --exclude | Ausschließen | | --bwlimit | Bandbreite begrenzen | | --link-dest | Hard Links für Backups |

| Befehl | Funktion | |--------|----------| | rsync -avh | Standard-Sync | | rsync -avzn | Dry-Run | | rsync --daemon | Server-Modus |

| Datei | Funktion | |-------|----------| | /etc/rsyncd.conf | Daemon-Config | | /etc/rsyncd.secrets | Passwörter | | ~/.ssh/config | SSH-Optionen |

Fazit

rsync ist unverzichtbar für Backups und Synchronisation unter Linux. Der Delta-Transfer spart Bandbreite und Zeit. SSH-Integration bietet sichere Übertragung. Inkrementelle Backups mit Hard Links sind speichereffizient. Der Daemon-Modus ermöglicht zentrale Backup-Server. Die Kombination mit Cron automatisiert Backup-Prozesse zuverlässig.