🛠️Praxis: fertige Befehle und typische Fehler
Bewährte Kommandos für wiederkehrende Aufgaben – mit Beispielpfaden, die du an deine Umgebung anpasst. Vor jedem Befehl mit--delete bzw. sync: erst den Probelauf.
📦Einsatzszenarien
Komplettes Server-Backup (Pull auf den Backup-Rechner)
rsyncAlle Metadaten inkl. Hardlinks, ACLs und xattrs, UIDs als Zahlen, virtuelle Dateisysteme ausgeklammert. Der Backup-Rechner holt – so hat der Server keinen Schreibzugriff auf die Sicherung.
rsync -aHAXx --numeric-ids --delete \
--exclude='/dev/*' --exclude='/proc/*' --exclude='/sys/*' \
--exclude='/run/*' --exclude='/tmp/*' \
root@server.example.org:/ /backup/server/Tägliche Snapshots mit Rotation
rsyncJeder Tag ein vollständiges Verzeichnis, unveränderte Dateien als Hardlink auf den Vortag. Details auf der Seite „Snapshots“.
HEUTE=$(date +%F)
rsync -a --delete --link-dest=/backup/snapshots/aktuell \
user@nas:/srv/daten/ /backup/snapshots/$HEUTE/ \
&& ln -sfn /backup/snapshots/$HEUTE /backup/snapshots/aktuellNAS → Cloud, verschlüsselt
rcloneDas Crypt-Remote „tresor“ zeigt auf einen B2-Bucket. Namen und Inhalte sind beim Anbieter verschlüsselt; geänderte und gelöschte Dateien wandern in einen Versionsordner.
rclone sync /srv/daten tresor:daten \ --backup-dir tresor:versionen/$(date +%F) \ --transfers 8 --fast-list \ --log-file /var/log/rclone.log -v rclone cryptcheck /srv/daten tresor:daten # gelegentlich prüfen
Website ausliefern
rsyncNur Geändertes, komprimiert über SSH; Entwicklungsballast bleibt zu Hause. Vorher immer einmal mit -n.
rsync -az --delete --exclude node_modules --exclude .git \
--exclude '.env*' ./ deploy@web.example.org:/var/www/site/Musik auf einen FAT/exFAT-USB-Stick
rsyncFAT kennt keine Besitzer/Rechte und speichert Zeiten nur auf 2 Sekunden genau: -rt statt -a, und eine Sekunde Toleranz.
rsync -rtv --modify-window=1 --delete ~/Musik/ /media/usb/Musik/
Große Datei über wackelige Leitung
rsyncAbgebrochene Teile bleiben erhalten und dienen beim nächsten Versuch als Basis. Bandbreite begrenzen, um die Leitung nicht zu blockieren.
rsync -avP --partial-dir=.rsync-partial --bwlimit=2m \
vm-image.qcow2 user@nas:/srv/vm/Fotos in die Nextcloud
rcloneWebDAV-Remote mit vendor = nextcloud (dann gibt es ModTime und Hashes). copy statt sync: Fotos, die du lokal löschst, bleiben in der Cloud erhalten.
rclone copy ~/Bilder nextcloud:Fotos --transfers 8 -P
Von einer Cloud in die andere
rcloneZwischen verschiedenen Remotes lädt rclone herunter und wieder hoch (Daten fließen durch den eigenen Rechner). Innerhalb desselben Remotes kopiert der Anbieter server-seitig.
rclone copy gdrive:Archiv onedrive:Archiv -P --transfers 8 rclone copy s3:alt-bucket s3:neu-bucket # server-seitig
Als Cron-Job, nie doppelt
rsyncflock verhindert, dass ein langsamer Lauf vom nächsten überholt wird; der Rückgabecode landet im Log.
# crontab -e 30 2 * * * flock -n /run/backup.lock rsync -a --delete /srv/daten/ user@nas:/backup/daten/ >> /var/log/backup.log 2>&1 || echo "rsync-Fehler $?" >> /var/log/backup.log
🧯Häufige Fehler
⚠️ Slash an der Quelle
- Symptom:
- Ziel enthält plötzlich ziel/projekt/projekt/… oder die Dateien liegen eine Ebene zu hoch.
- Ursache:
- rsync projekt ziel/ kopiert das Verzeichnis, rsync projekt/ ziel/ nur den Inhalt.
- Lösung:
- Quelle fast immer mit Slash schreiben und das Ziel vollständig benennen: rsync -a projekt/ ziel/projekt/
⚠️ --delete ohne Probelauf
- Symptom:
- Nach einem Tippfehler (Quelle und Ziel vertauscht, leeres Quellverzeichnis) ist das Ziel leer.
- Ursache:
- --delete tut genau, was es soll – auch mit falschen Pfaden.
- Lösung:
- Erst rsync -an --delete -i …; zusätzlich --max-delete=N als Bremse oder --backup-dir. Bei rclone: --dry-run / --interactive.
⚠️ --delete mit Wildcard
- Symptom:
- rsync -a --delete src/* ziel/ löscht nichts und versteckte Dateien fehlen.
- Ursache:
- Die Shell expandiert * zu einzelnen Dateien; rsync bekommt kein Verzeichnis, also gibt es nichts zu „spiegeln“. Punktdateien matcht * nicht.
- Lösung:
- Verzeichnis übergeben: rsync -a --delete src/ ziel/
⚠️ FAT/exFAT: alles wird jedes Mal kopiert
- Symptom:
- Jeder Lauf überträgt alle Dateien erneut.
- Ursache:
- FAT speichert Zeiten nur auf 2 Sekunden genau, der Quick-Check sieht Unterschiede.
- Lösung:
- --modify-window=1 (rclone: --modify-window 2s).
⚠️ FAT: Zeitzone und Sommerzeit
- Symptom:
- Nach der Zeitumstellung wird alles erneut kopiert, Zeiten weichen um genau eine Stunde ab.
- Ursache:
- FAT speichert Ortszeit ohne Zeitzone; die Umrechnung ändert sich mit der Sommerzeit.
- Lösung:
- Unter Linux mit Mount-Option tz=UTC einhängen oder einmalig mit --size-only abgleichen.
⚠️ Rechte: chown failed
- Symptom:
- „chown … failed: Operation not permitted (1)“, Rückgabecode 23.
- Ursache:
- -a enthält -o/-g; Besitzer setzen darf nur root. Auf FAT/SMB gibt es gar keine Unix-Rechte.
- Lösung:
- Als root laufen lassen, --no-o --no-g verwenden, -rt statt -a (FAT) oder --fake-super für Backups ohne root.
⚠️ Zielpfad existiert nicht
- Symptom:
- mkdir … failed: No such file or directory (2), Rückgabecode 11.
- Ursache:
- rsync legt nur die letzte Ebene des Zielpfads an – absichtlich, um Tippfehler zu erkennen.
- Lösung:
- Elternverzeichnis anlegen oder --mkpath (rsync ≥ 3.2.3).
⚠️ Include ohne „+ */“
- Symptom:
- --include='*.jpg' --exclude='*' überträgt nur Dateien der obersten Ebene.
- Ursache:
- „- *“ schließt auch Unterverzeichnisse aus, rsync schaut gar nicht hinein.
- Lösung:
- --include='*/' --include='*.jpg' --exclude='*' (und ggf. -m gegen leere Ordner).
⚠️ „protocol version mismatch – is your shell clean?“
- Symptom:
- Verbindung bricht sofort ab.
- Ursache:
- Eine Login-Datei (.bashrc o. ä.) schreibt beim nicht-interaktiven SSH-Login Text auf stdout – das stört das rsync-Protokoll.
- Lösung:
- Ausgaben in Login-Skripten nur für interaktive Shells; testen mit ssh host /bin/true > out.dat (Datei muss leer sein).
⚠️ „file has vanished“ (Code 24)
- Symptom:
- Rückgabecode 24 bei Backups laufender Systeme.
- Ursache:
- Dateien verschwanden zwischen Auflisten und Kopieren (Temp-Dateien, Caches).
- Lösung:
- Im Skript 24 als Warnung behandeln; flüchtige Verzeichnisse ausschließen oder aus einem Dateisystem-Snapshot sichern.
⚠️ rclone: falsche Ebene
- Symptom:
- rclone copy /srv/fotos b2:bucket legt die Fotos direkt in die Bucket-Wurzel.
- Ursache:
- rclone kopiert immer den Inhalt – es gibt keine Slash-Semantik.
- Lösung:
- Ziel mit Ordnernamen angeben: rclone copy /srv/fotos b2:bucket/fotos
⚠️ rclone/rsync: Änderung übersehen
- Symptom:
- Eine geänderte Datei wird nie übertragen.
- Ursache:
- Gleiche Größe und gleiche Änderungszeit – der Standardvergleich schaut nicht in den Inhalt.
- Lösung:
- Gelegentlich rsync -c bzw. rclone --checksum oder rclone check laufen lassen.
✅Checkliste vor dem ersten echten Lauf
- Slash an der Quelle geprüft?
rsync -an --delete -i …gelesen, besonders*deleting?- Filter mit
--debug=FILTERoder im Filter-Tester geprüft? - Rückgabecode im Skript ausgewertet (0, 23, 24)?
- Wiederherstellung einmal ausprobiert?
- Richtige Ebene im Ziel (
remote:bucket/ordner)? --dry-rungelesen?rclone.confund Crypt-Passwörter getrennt gesichert?rclone check/cryptcheckeingeplant?- Versionierung (
--backup-diroder beim Anbieter) aktiv?