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 ZielLokale 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_modulesBandbreiten-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
fiRotierendes 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_passwortchmod 600 /etc/rsyncd.secretsDaemon starten
# Systemd
systemctl enable rsync
systemctl start rsync
# Oder manuell
rsync --daemonClient-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.