rsync ist das Standardwerkzeug für Dateisynchronisation unter Linux. Es überträgt nur geänderte Teile von Dateien und spart damit Zeit und Bandbreite.

Warum rsync?

Vorteile

- Delta-Transfer (nur Änderungen)
- Kompression während Übertragung
- Berechtigungen und Attribute erhalten
- SSH-Verschlüsselung
- Resume bei Abbruch
- Trockenlauf möglich

rsync vs. cp/scp

| Feature | rsync | cp | scp | |---------|-------|-----|-----| | Delta-Transfer | Ja | Nein | Nein | | Kompression | Ja | Nein | Optional | | Progress | Ja | Nein | Nein | | Attribut-Erhalt | Ja | Teilweise | Teilweise | | Resume | Ja | Nein | Nein |

Installation

# Debian/Ubuntu
apt install rsync

# CentOS/RHEL
dnf install rsync

Grundlegende Syntax

rsync [Optionen] Quelle Ziel

Wichtige Optionen

Häufig verwendete Optionen

| Option | Kurz | Beschreibung | |--------|------|--------------| | --archive | -a | Archiv-Modus (= -rlptgoD) | | --verbose | -v | Ausführliche Ausgabe | | --human-readable | -h | Lesbare Größen | | --progress | | Fortschrittsanzeige | | --compress | -z | Kompression | | --delete | | Im Ziel löschen was in Quelle fehlt | | --dry-run | -n | Trockenlauf (nichts ändern) | | --exclude | | Dateien ausschließen | | --include | | Dateien einschließen |

Archiv-Modus im Detail

-a = -rlptgoD

-r  Rekursiv
-l  Symlinks kopieren
-p  Berechtigungen erhalten
-t  Zeitstempel erhalten
-g  Gruppe erhalten
-o  Besitzer erhalten
-D  Devices und Specials erhalten

Lokale Synchronisation

Einfache Kopie

# Verzeichnis kopieren
rsync -av /quell/verzeichnis/ /ziel/verzeichnis/

# WICHTIG: Trailing Slash!
# Mit /: Inhalt von quell/verzeichnis nach ziel/verzeichnis
# Ohne /: quell/verzeichnis selbst nach ziel/verzeichnis

Mit Fortschritt

rsync -avh --progress /quelle/ /ziel/

Mit Löschung

# Dateien im Ziel löschen, die in Quelle nicht existieren
rsync -av --delete /quelle/ /ziel/

Trockenlauf

# Zeigt was passieren würde, ohne Änderungen
rsync -avn --delete /quelle/ /ziel/

Remote-Synchronisation (SSH)

Zum Remote-Server

# Push: Lokal → Remote
rsync -avz /lokales/verzeichnis/ user@server:/remote/verzeichnis/

Vom Remote-Server

# Pull: Remote → Lokal
rsync -avz user@server:/remote/verzeichnis/ /lokales/verzeichnis/

Mit SSH-Key

rsync -avz -e "ssh -i ~/.ssh/my_key" /quelle/ user@server:/ziel/

Mit SSH-Port

rsync -avz -e "ssh -p 2222" /quelle/ user@server:/ziel/

Bandbreite begrenzen

# Limit: 5000 KB/s
rsync -avz --bwlimit=5000 /quelle/ user@server:/ziel/

Dateien ausschließen

Einzelne Muster

rsync -av --exclude='*.log' /quelle/ /ziel/
rsync -av --exclude='*.tmp' --exclude='cache/' /quelle/ /ziel/

Mit Exclude-Datei

# exclude.txt
*.log
*.tmp
.git/
node_modules/
__pycache__/
.DS_Store
rsync -av --exclude-from='exclude.txt' /quelle/ /ziel/

Include und Exclude kombinieren

# Nur bestimmte Dateitypen
rsync -av --include='*.php' --include='*/' --exclude='*' /quelle/ /ziel/

Backup-Szenarien

Einfaches Backup

#!/bin/bash
# backup.sh

SOURCE="/var/www"
DEST="/backup/www"
DATE=$(date +%Y%m%d)

rsync -avh --delete \
    --exclude='*.log' \
    --exclude='cache/' \
    "$SOURCE/" "$DEST/"

echo "Backup abgeschlossen: $(date)"
#!/bin/bash
# incremental-backup.sh

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

# Neues Backup mit Hard Links zum letzten
rsync -avh --delete \
    --link-dest="$LATEST" \
    "$SOURCE/" "$BACKUP_DIR/$DATE/"

# Symlink aktualisieren
rm -f "$LATEST"
ln -s "$BACKUP_DIR/$DATE" "$LATEST"

Backup zu Remote-Server

#!/bin/bash
# remote-backup.sh

SOURCE="/var/www"
REMOTE="backup@backup-server.com"
DEST="/backups/webserver"

rsync -avz --delete \
    -e "ssh -i /root/.ssh/backup_key" \
    --exclude='*.log' \
    "$SOURCE/" "$REMOTE:$DEST/"

Mirroring

Website spiegeln

rsync -avz --delete /var/www/html/ user@mirror-server:/var/www/html/

Bidirektionale Synchronisation

# Vorsicht: Kann zu Konflikten führen!
# Besser: Unison oder andere Tools für bidirektionale Sync

Fortgeschrittene Optionen

Checksum statt Zeitstempel

# Vergleich per Checksum (langsamer, genauer)
rsync -avc /quelle/ /ziel/

Nur neuere Dateien

rsync -av --update /quelle/ /ziel/

Maximale Dateigröße

# Nur Dateien unter 100MB
rsync -av --max-size=100M /quelle/ /ziel/

Minimale Dateigröße

# Nur Dateien über 1KB
rsync -av --min-size=1K /quelle/ /ziel/

Backup vor Überschreiben

rsync -av --backup --backup-dir=/backup/old /quelle/ /ziel/

Partial (Resume)

# Teilweise übertragene Dateien behalten
rsync -avP /quelle/ /ziel/
# -P = --partial --progress

rsync Daemon

Server-Konfiguration

# /etc/rsyncd.conf

uid = nobody
gid = nobody
use chroot = yes
max connections = 4
syslog facility = local5

[backup]
    path = /backup
    comment = Backup-Verzeichnis
    read only = no
    auth users = backup
    secrets file = /etc/rsyncd.secrets
    hosts allow = 192.168.1.0/24
# /etc/rsyncd.secrets
backup:geheimes_passwort
chmod 600 /etc/rsyncd.secrets
systemctl enable --now rsync

Client-Verbindung

# Mit rsync-Protokoll
rsync -av /quelle/ backup@server::backup/ziel/

# Passwort aus Datei
rsync -av --password-file=/etc/rsync.pass /quelle/ backup@server::backup/

Praktische Beispiele

Home-Verzeichnis sichern

rsync -avh --delete \
    --exclude='.cache' \
    --exclude='Downloads' \
    --exclude='.local/share/Trash' \
    ~/ /backup/home/

Datenbank-Dump synchronisieren

# Erst Dump erstellen, dann sync
mysqldump --all-databases | gzip > /backup/mysql/dump.sql.gz
rsync -avz /backup/mysql/ user@backup-server:/backups/mysql/

Deployment

rsync -avz --delete \
    --exclude='.git' \
    --exclude='node_modules' \
    --exclude='.env' \
    ./dist/ user@webserver:/var/www/app/

Zwei Server synchron halten

#!/bin/bash
# sync-servers.sh

rsync -avz --delete \
    -e "ssh -i /root/.ssh/sync_key" \
    /var/www/html/ root@server2:/var/www/html/

rsync -avz --delete \
    -e "ssh -i /root/.ssh/sync_key" \
    /etc/nginx/ root@server2:/etc/nginx/

Fehlerbehandlung

Häufige Fehler

# Permission denied
# Lösung: sudo oder Benutzerrechte prüfen

# Connection refused
# Lösung: SSH-Dienst prüfen, Firewall öffnen

# Host key verification failed
# Lösung: ssh-keyscan server >> ~/.ssh/known_hosts

Debugging

# Sehr ausführlich
rsync -avvv /quelle/ /ziel/

# Mit Stats
rsync -av --stats /quelle/ /ziel/

Timeout setzen

rsync -av --timeout=60 /quelle/ user@server:/ziel/

Performance-Tipps

Kompression je nach Netzwerk

# Langsames Netzwerk: Kompression
rsync -avz /quelle/ user@server:/ziel/

# Schnelles LAN: Ohne Kompression (CPU-Ersparnis)
rsync -av /quelle/ user@server:/ziel/

Parallelisierung (mit xargs)

# Mehrere rsync-Prozesse
find /quelle -maxdepth 1 -type d | xargs -P4 -I{} rsync -av {}/ /ziel/

Große Dateien

# Partial und Progress für große Dateien
rsync -avhP --inplace large_file user@server:/ziel/

Zusammenfassung

| Aufgabe | Befehl | |---------|--------| | Einfache Kopie | rsync -av /quelle/ /ziel/ | | Mit Löschen | rsync -av --delete /quelle/ /ziel/ | | Remote Push | rsync -avz /lokal/ user@server:/remote/ | | Remote Pull | rsync -avz user@server:/remote/ /lokal/ | | Trockenlauf | rsync -avn /quelle/ /ziel/ | | Mit Exclude | rsync -av --exclude='*.log' /quelle/ /ziel/ |

Fazit

rsync ist unverzichtbar für Backups und Synchronisation. Der Delta-Transfer spart Zeit und Bandbreite, besonders bei großen Datenmengen mit wenig Änderungen. Nutzen Sie immer -n für Trockenläufe bei kritischen Operationen und achten Sie auf den Trailing Slash bei Verzeichnissen.