🛠️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)

rsync

Alle 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

rsync

Jeder 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/aktuell
🔐

NAS → Cloud, verschlüsselt

rclone

Das 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

rsync

Nur 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

rsync

FAT 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

rsync

Abgebrochene 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

rclone

WebDAV-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

rclone

Zwischen 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

rsync

flock 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

✅ rsync
  1. Slash an der Quelle geprüft?
  2. rsync -an --delete -i … gelesen, besonders *deleting?
  3. Filter mit --debug=FILTER oder im Filter-Tester geprüft?
  4. Rückgabecode im Skript ausgewertet (0, 23, 24)?
  5. Wiederherstellung einmal ausprobiert?
✅ rclone
  1. Richtige Ebene im Ziel (remote:bucket/ordner)?
  2. --dry-run gelesen?
  3. rclone.conf und Crypt-Passwörter getrennt gesichert?
  4. rclone check / cryptcheck eingeplant?
  5. Versionierung (--backup-dir oder beim Anbieter) aktiv?