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öglichrsync 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 rsyncGrundlegende Syntax
rsync [Optionen] Quelle ZielWichtige 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 erhaltenLokale 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/verzeichnisMit 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_Storersync -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)"Inkrementelles Backup mit Hard Links
#!/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 SyncFortgeschrittene 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 --progressrsync 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_passwortchmod 600 /etc/rsyncd.secrets
systemctl enable --now rsyncClient-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_hostsDebugging
# 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.