472 lines
11 KiB
Markdown
472 lines
11 KiB
Markdown
Alles klar – ich gebe dir eine ausführliche Übersicht über **Dateisynchronisation und Backups unter Linux**, gegliedert nach typischen Anwendungsfällen (1-way Backup, 2-way Sync, Spezialfälle). Dazu zeige ich dir jeweils **interessante Funktionen**, **geeignete Tools** und **Code-Beispiele**, die du direkt ausprobieren kannst.
|
||
|
||
---
|
||
|
||
# 🔧 Dateisynchronisation und Backup unter Linux
|
||
|
||
## 1. Grundsätzliche Anwendungsfälle
|
||
|
||
1. **Backup (1-way Synchronisation)**
|
||
|
||
- Ziel: Sicherung von Daten von Quelle → Ziel.
|
||
|
||
- Änderungen im Quellordner werden ins Ziel kopiert.
|
||
|
||
- Änderungen im Ziel haben keine Wirkung zurück.
|
||
|
||
- Typisch für:
|
||
|
||
- Regelmäßige Datensicherungen (lokal oder auf Server/NAS)
|
||
|
||
- Snapshots und inkrementelle Backups
|
||
|
||
2. **Zwei-Wege-Synchronisation (2-way)**
|
||
|
||
- Ziel: Quell- und Zielordner sind identisch.
|
||
|
||
- Änderungen in beiden Richtungen werden abgeglichen.
|
||
|
||
- Typisch für:
|
||
|
||
- Zusammenarbeit zwischen Geräten
|
||
|
||
- Synchronisation von Arbeitsordnern mit Netzwerkfreigaben oder Cloud
|
||
|
||
3. **Weitere Anwendungsbeispiele**
|
||
|
||
- **Offsite-Backup** (z. B. automatisches Backup auf einen entfernten Server via SSH)
|
||
|
||
- **Versionierte Backups** (Aufbewahrung älterer Stände)
|
||
|
||
- **On-the-fly Synchronisation** (z. B. Watcher, der beim Speichern sofort sync’ed)
|
||
|
||
- **Mobile Synchronisation** (z. B. Laptop ↔ NAS, USB-Stick ↔ Rechner)
|
||
|
||
|
||
---
|
||
|
||
## 2. Tools für 1-way Backups
|
||
|
||
### a) **rsync** (Klassiker)
|
||
|
||
Das meistgenutzte Werkzeug, effizient und flexibel.
|
||
|
||
**Einfaches Backup:**
|
||
|
||
```bash
|
||
rsync -avh /home/user/Dokumente/ /media/backup/Dokumente/
|
||
```
|
||
|
||
- `-a` = Archivmodus (erhält Rechte, Zeiten, Links)
|
||
|
||
- `-v` = verbose
|
||
|
||
- `-h` = menschenlesbare Größen
|
||
|
||
|
||
**Mit Löschen (Spiegelung):**
|
||
|
||
```bash
|
||
rsync -avh --delete /home/user/Dokumente/ /media/backup/Dokumente/
|
||
```
|
||
|
||
→ Dateien, die in Quelle gelöscht wurden, werden auch im Ziel gelöscht.
|
||
|
||
**Über SSH (z. B. auf NAS oder Server):**
|
||
|
||
```bash
|
||
rsync -avz /home/user/Dokumente/ user@server:/backup/Dokumente/
|
||
```
|
||
|
||
- `-z` = Kompression
|
||
|
||
|
||
**Interessante Funktionen:**
|
||
|
||
- `--exclude "*.tmp"` → bestimmte Dateien ignorieren
|
||
|
||
- `--progress` → Fortschrittsanzeige
|
||
|
||
- `--link-dest` → inkrementelle Backups mit Hardlinks (ähnlich Time Machine)
|
||
|
||
|
||
---
|
||
|
||
### b) **borgbackup** (für versionierte, komprimierte, verschlüsselte Backups)
|
||
|
||
Ideal für langfristige Backups mit Versionierung.
|
||
|
||
```bash
|
||
borg init --encryption=repokey /media/backup/repo
|
||
borg create --progress /media/backup/repo::2025-09-26 /home/user/Dokumente
|
||
```
|
||
|
||
Später kannst du ältere Versionen wiederherstellen.
|
||
|
||
---
|
||
|
||
## 3. Tools für 2-way Synchronisation
|
||
|
||
### a) **unison**
|
||
|
||
Ein Klassiker für bidirektionale Synchronisation.
|
||
|
||
**Einfacher Start:**
|
||
|
||
```bash
|
||
unison /home/user/Dokumente ssh://user@server//home/user/Dokumente
|
||
```
|
||
|
||
- Erkennt Änderungen auf beiden Seiten
|
||
|
||
- Fragt bei Konflikten nach
|
||
|
||
- Arbeitet ähnlich wie `rsync`, aber **beidseitig**
|
||
|
||
|
||
**Dauerhafte Konfiguration:**
|
||
In `~/.unison/default.prf`:
|
||
|
||
```
|
||
root = /home/user/Dokumente
|
||
root = ssh://user@server//home/user/Dokumente
|
||
auto = true
|
||
batch = true
|
||
```
|
||
|
||
Dann reicht:
|
||
|
||
```bash
|
||
unison
|
||
```
|
||
|
||
---
|
||
|
||
### b) **Syncthing** (komfortabel mit Weboberfläche)
|
||
|
||
- Peer-to-Peer Synchronisation (Ende-zu-Ende verschlüsselt)
|
||
|
||
- Cross-Platform (Linux, Windows, Android, macOS)
|
||
|
||
- Ideal für nahtlose Syncs ohne manuellen Eingriff
|
||
|
||
|
||
Installation:
|
||
|
||
```bash
|
||
sudo apt install syncthing
|
||
syncthing
|
||
```
|
||
|
||
→ Startet Weboberfläche auf [http://127.0.0.1:8384](http://127.0.0.1:8384)
|
||
|
||
---
|
||
|
||
## 4. Automatisierung
|
||
|
||
### a) Cron-Jobs für regelmäßige Backups
|
||
|
||
Beispiel: Täglich um 3 Uhr ein rsync-Backup:
|
||
|
||
```bash
|
||
0 3 * * * rsync -avh --delete /home/user/Dokumente/ /media/backup/Dokumente/
|
||
```
|
||
|
||
(`crontab -e`)
|
||
|
||
### b) systemd Timer (moderner als Cron)
|
||
|
||
Service-Unit (`/etc/systemd/system/backup.service`):
|
||
|
||
```ini
|
||
[Unit]
|
||
Description=Backup Dokumente
|
||
|
||
[Service]
|
||
ExecStart=/usr/bin/rsync -avh --delete /home/user/Dokumente/ /media/backup/Dokumente/
|
||
```
|
||
|
||
Timer (`/etc/systemd/system/backup.timer`):
|
||
|
||
```ini
|
||
[Unit]
|
||
Description=Backup Timer
|
||
|
||
[Timer]
|
||
OnCalendar=daily
|
||
Persistent=true
|
||
|
||
[Install]
|
||
WantedBy=timers.target
|
||
```
|
||
|
||
Aktivieren:
|
||
|
||
```bash
|
||
sudo systemctl enable --now backup.timer
|
||
```
|
||
|
||
---
|
||
|
||
## 5. Zusammenfassung der interessantesten Funktionen
|
||
|
||
- **rsync** → universell, effizient, für Backups und Spiegelungen
|
||
|
||
- **borgbackup** → versioniert, verschlüsselt, platzsparend
|
||
|
||
- **unison** → 2-way Sync mit Konfliktlösung
|
||
|
||
- **syncthing** → benutzerfreundlich, kontinuierliche Synchronisation
|
||
|
||
|
||
---
|
||
|
||
👉 Tipp:
|
||
Wenn du **nur Backups** brauchst → `rsync` oder `borg`.
|
||
Wenn du **aktive Ordner synchron halten willst** → `unison` oder `syncthing`.
|
||
|
||
---
|
||
|
||
Soll ich dir zum Einstieg ein **komplettes Setup-Skript für ein automatisches tägliches Backup mit rsync** schreiben, das du direkt verwenden kannst?
|
||
Sehr gute Fragen 👍 — ich gehe das mit dir systematisch durch.
|
||
|
||
---
|
||
|
||
# 🔄 Unison: Verhalten, Hintergrundbetrieb & Performance
|
||
|
||
## 1. Läuft Unison permanent im Hintergrund?
|
||
|
||
Unison an sich ist **kein permanenter Daemon** wie etwa Syncthing.
|
||
Es funktioniert normalerweise so:
|
||
|
||
- Du startest Unison → es vergleicht Quelle und Ziel → synchronisiert → beendet sich.
|
||
|
||
- Du kannst es per Cron, systemd-Timer oder manuell regelmäßig ausführen.
|
||
|
||
- Es gibt aber einen **"Unison-GUI/Repeat-Modus"**, bei dem es in einer Schleife läuft und z. B. alle 10 Sekunden die Verzeichnisse prüft.
|
||
|
||
|
||
Beispiel für wiederholte Synchronisation:
|
||
|
||
```bash
|
||
unison default -repeat watch
|
||
```
|
||
|
||
- `-repeat watch` = Unison nutzt OS-Funktionalitäten (inotify auf Linux), um Änderungen sofort zu erkennen.
|
||
|
||
- `-repeat 10` = alternativ: Polling alle 10 Sekunden.
|
||
|
||
|
||
Damit verhält sich Unison _fast_ wie Syncthing, aber ist weniger komfortabel, weil es keinen richtigen Daemon hat.
|
||
|
||
---
|
||
|
||
## 2. Start bei Systemstart
|
||
|
||
Damit Unison automatisch startet, kannst du es mit **systemd** einrichten.
|
||
|
||
### Beispiel: systemd Service-Datei
|
||
|
||
`~/.config/systemd/user/unison.service`
|
||
|
||
```ini
|
||
[Unit]
|
||
Description=Unison sync service
|
||
After=network.target
|
||
|
||
[Service]
|
||
ExecStart=/usr/bin/unison default -repeat watch
|
||
Restart=always
|
||
RestartSec=5
|
||
|
||
[Install]
|
||
WantedBy=default.target
|
||
```
|
||
|
||
Dann aktivieren:
|
||
|
||
```bash
|
||
systemctl --user enable --now unison.service
|
||
```
|
||
|
||
→ Jetzt läuft Unison beim Login des Users automatisch und überwacht die definierten Profile.
|
||
|
||
---
|
||
|
||
## 3. Performance Impact
|
||
|
||
Die Performance hängt von der Betriebsart ab:
|
||
|
||
- **Einmalige Ausführung (Standard)**
|
||
|
||
- Minimaler Impact, nur während der Synchronisation.
|
||
|
||
- Nutzt Hashing/Datei-Checksummen, um Änderungen effizient zu erkennen.
|
||
|
||
- Bei großen Verzeichnissen ist der **erste Lauf** teuer (voller Indexaufbau), danach werden nur Änderungen geprüft.
|
||
|
||
- **Dauerbetrieb mit `-repeat watch`**
|
||
|
||
- Nutzt `inotify` → kaum CPU-Last, da nur Änderungen getriggert werden.
|
||
|
||
- Speicherbedarf: wenige Dutzend MB RAM.
|
||
|
||
- CPU-Last: fast 0, außer wenn aktiv synchronisiert wird.
|
||
|
||
- **Dauerbetrieb mit `-repeat 10` (Polling)**
|
||
|
||
- Alle 10 Sekunden kompletter Scan → deutlich mehr I/O bei vielen Dateien.
|
||
|
||
- Sollte nur verwendet werden, wenn `inotify` nicht funktioniert (z. B. bei Netzwerk-Dateisystemen).
|
||
|
||
|
||
**Kurz:**
|
||
|
||
- Lokale Ordner: `-repeat watch` → sehr effizient
|
||
|
||
- Netzwerk-Mounts (NFS, SMB): oft kein inotify → Polling nötig, etwas schwerer
|
||
|
||
|
||
---
|
||
|
||
## 4. Fazit
|
||
|
||
- Unison ist **keine Always-on-Synchronisation wie Syncthing**, aber mit `-repeat watch` + systemd lässt es sich quasi gleichwertig nutzen.
|
||
|
||
- Performance-Impact ist sehr gering, solange du `watch` nutzt.
|
||
|
||
- Für **regelmäßige Backups** → Cron oder systemd Timer reicht.
|
||
|
||
- Für **nahezu Echtzeit-Sync** → `-repeat watch` + systemd Service ist die beste Lösung.
|
||
|
||
|
||
---
|
||
|
||
|
||
## 1. Voraussetzung: Config-Datei
|
||
|
||
Ja, korrekt ✅
|
||
Der Aufruf
|
||
|
||
```bash
|
||
unison default -repeat watch
|
||
```
|
||
|
||
setzt voraus, dass du eine Konfigurationsdatei `~/.unison/default.prf` hast.
|
||
Dort definierst du z. B.:
|
||
|
||
```txt
|
||
root = /home/user/Dokumente
|
||
root = ssh://user@server//home/user/Dokumente
|
||
|
||
auto = true
|
||
batch = true
|
||
```
|
||
|
||
- **`auto = true`** → versucht, Konflikte automatisch zu lösen (kein Nachfragen bei eindeutigen Fällen).
|
||
|
||
- **`batch = true`** → führt ohne Interaktion aus.
|
||
|
||
- Falls Konflikte auftreten, entscheidet er nach den Regeln oder verweigert Sync.
|
||
|
||
- Ohne `batch` würdest du wieder Fragen im Terminal sehen.
|
||
|
||
|
||
👉 Empfehlung: Für systemd immer `auto = true` und `batch = true` setzen, sonst blockiert der Prozess.
|
||
|
||
---
|
||
|
||
## 2. Rückfragen vermeiden (Default-Verhalten)
|
||
|
||
Wie du beobachtet hast, fragt Unison bei `unison [quelle] [ziel]` ohne Konfig bei **Konflikten** („Welche Version behalten?“).
|
||
|
||
- Mit **Konfig + batch + auto** → keine Rückfragen.
|
||
|
||
- Du kannst zusätzlich Regeln setzen, z. B.:
|
||
|
||
|
||
```txt
|
||
prefer = newer # Immer die neuere Version behalten
|
||
prefer = /home/user # Lokale Version gewinnt
|
||
```
|
||
|
||
Das ist wichtig für den systemd-Einsatz, weil ein Dienst nicht sinnvoll auf Eingaben warten kann.
|
||
|
||
---
|
||
|
||
## 3. Logging
|
||
|
||
### a) Standardmäßig
|
||
|
||
Unison schreibt **keine dauerhaften Logs** von sich aus.
|
||
Die Ausgaben gehen in `stdout/stderr` → wenn du es manuell startest, siehst du es im Terminal.
|
||
|
||
### b) Mit systemd
|
||
|
||
systemd fängt alles auf → mit
|
||
|
||
```bash
|
||
journalctl --user -u unison.service
|
||
```
|
||
|
||
siehst du die Logs.
|
||
Wenn dir das reicht, brauchst du nichts extra.
|
||
|
||
### c) Eigene Logdateien
|
||
|
||
Du kannst in der `.prf`-Datei angeben:
|
||
|
||
```txt
|
||
log = /var/log/unison/unison.log
|
||
```
|
||
|
||
oder direkt beim Start per `ExecStart`:
|
||
|
||
```ini
|
||
ExecStart=/usr/bin/unison default -repeat watch -logfile /var/log/unison/unison.log
|
||
```
|
||
|
||
### d) Alte Logs automatisch löschen
|
||
|
||
Unison selbst rotiert keine Logs, aber systemd oder `logrotate` kann das übernehmen.
|
||
Beispiel `logrotate`-Konfig (`/etc/logrotate.d/unison`):
|
||
|
||
```
|
||
/var/log/unison/unison.log {
|
||
daily
|
||
rotate 30
|
||
compress
|
||
missingok
|
||
notifempty
|
||
create 640 user user
|
||
}
|
||
```
|
||
|
||
→ Hält 30 Tage Logs, dann werden sie komprimiert/gelöscht.
|
||
|
||
Wenn du lieber pro Sitzung in `/tmp` loggen willst:
|
||
|
||
```ini
|
||
ExecStart=/usr/bin/unison default -repeat watch -logfile /tmp/unison-%u.log
|
||
```
|
||
|
||
und ein Cronjob/systemd-Timer löscht alte Dateien:
|
||
|
||
```bash
|
||
find /tmp -name 'unison-*.log' -mtime +30 -delete
|
||
```
|
||
|
||
---
|
||
|
||
## 4. Fazit
|
||
|
||
- **Ja**, Config-Datei nötig → dort Batch/Auto einstellen.
|
||
|
||
- **Default-Verhalten einstellen** mit `prefer`-Regeln, sonst blockieren Konflikte.
|
||
|
||
- **Logs**: systemd-Journal reicht oft, alternativ eigene Logdatei + logrotate.
|
||
|
||
|
||
---
|
||
|
||
👉 Soll ich dir eine **komplette Beispielkonfig `default.prf` + passende systemd-Service-Datei** basteln, die direkt „Headless-Sync im Hintergrund“ macht inkl. Log-Rotation? |