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/
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.