Files
it-know-how/Linux/Synchronisation & Backup.md

472 lines
11 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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 synced)
- **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?