Metainformationen zur Seite
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| magicmirror:magicmirror_tipps:test [07.10.2026] – angelegt kolja | magicmirror:magicmirror_tipps:test [07.10.2026] (aktuell) – gelöscht kolja | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| - | ====== MagicMirror – manuelles Backup auf NAS ====== | ||
| - | ===== Zweck ===== | ||
| - | |||
| - | Der komplette MagicMirror-Ordner soll manuell auf einem NAS gesichert werden. | ||
| - | |||
| - | Das Backup wird nur gestartet, wenn das NAS tatsächlich erreichbar und als CIFS/ | ||
| - | |||
| - | Das ist besonders wichtig, da das lokale Verzeichnis | ||
| - | |||
| - | / | ||
| - | |||
| - | auch dann existieren kann, wenn das NAS nicht verbunden ist. | ||
| - | |||
| - | Ohne zusätzliche Prüfung könnte ein Backup-Script sonst versehentlich auf die lokale SSD des Raspberry Pi schreiben. | ||
| - | |||
| - | Das Backup wird: | ||
| - | |||
| - | * ausschließlich manuell gestartet | ||
| - | * im Hintergrund ausgeführt | ||
| - | * mit Datum und Uhrzeit gespeichert | ||
| - | * als vollständiges TAR.GZ-Archiv erstellt | ||
| - | * nach der Erstellung automatisch geprüft | ||
| - | * bei einem Fehler als '' | ||
| - | * nicht gestartet, wenn das NAS nicht erreichbar ist | ||
| - | * gegen mehrere gleichzeitig laufende Backups geschützt | ||
| - | |||
| - | Es gibt bewusst: | ||
| - | |||
| - | * keinen automatischen Zeitplan | ||
| - | * keine automatische Löschung alter Backups | ||
| - | * keine automatische Rotation | ||
| - | |||
| - | ===== Warum TAR.GZ und nicht rsync? ===== | ||
| - | |||
| - | Ursprünglich wurde versucht, den kompletten MagicMirror-Ordner mit '' | ||
| - | |||
| - | Dabei traten Fehler dieser Art auf: | ||
| - | |||
| - | < | ||
| - | symlink " | ||
| - | </ | ||
| - | |||
| - | MagicMirror und insbesondere '' | ||
| - | |||
| - | Die verwendete SMB/ | ||
| - | |||
| - | Deshalb wird der komplette MagicMirror-Ordner jetzt zuerst als TAR.GZ-Archiv geschrieben. | ||
| - | |||
| - | Innerhalb eines TAR-Archivs bleiben: | ||
| - | |||
| - | * Symlinks | ||
| - | * versteckte Dateien | ||
| - | * .git-Verzeichnisse | ||
| - | * node_modules | ||
| - | * Dateistruktur | ||
| - | |||
| - | erhalten. | ||
| - | |||
| - | Das NAS sieht dabei nur eine normale Datei: | ||
| - | |||
| - | < | ||
| - | MagicMirror.tar.gz | ||
| - | </ | ||
| - | |||
| - | |||
| - | ====== Schnellstart – vorhandenes System ====== | ||
| - | |||
| - | ===== Backup starten ===== | ||
| - | |||
| - | Das Backup wird mit folgendem Befehl manuell gestartet: | ||
| - | |||
| - | <code bash> | ||
| - | ~/ | ||
| - | </ | ||
| - | |||
| - | Beispielausgabe: | ||
| - | |||
| - | < | ||
| - | Prüfe NAS ... | ||
| - | NAS ist erreichbar. | ||
| - | |||
| - | Backup wird im Hintergrund gestartet. | ||
| - | Quelle: / | ||
| - | Ziel: / | ||
| - | Log: / | ||
| - | |||
| - | Backup-Prozess gestartet. | ||
| - | PID: 12345 | ||
| - | </ | ||
| - | |||
| - | Das Terminal kann danach geschlossen werden. | ||
| - | |||
| - | Das Backup läuft über '' | ||
| - | |||
| - | |||
| - | ===== Aktuellen Backup-Status ansehen ===== | ||
| - | |||
| - | Das neueste Log anzeigen: | ||
| - | |||
| - | <code bash> | ||
| - | tail -f "$(ls -t ~/ | ||
| - | </ | ||
| - | |||
| - | Mit | ||
| - | |||
| - | < | ||
| - | Ctrl+C | ||
| - | </ | ||
| - | |||
| - | wird nur die Log-Anzeige beendet. | ||
| - | |||
| - | Das Backup selbst läuft weiter. | ||
| - | |||
| - | |||
| - | ===== Prüfen, ob ein Backup noch läuft ===== | ||
| - | |||
| - | <code bash> | ||
| - | pgrep -af ' | ||
| - | </ | ||
| - | |||
| - | Wenn keine Ausgabe erscheint, läuft aktuell kein Backup. | ||
| - | |||
| - | |||
| - | ===== Erfolgreiches Backup ===== | ||
| - | |||
| - | Bei erfolgreichem Abschluss steht im Log: | ||
| - | |||
| - | < | ||
| - | ================================================== | ||
| - | BACKUP ERFOLGREICH | ||
| - | Ende: ... | ||
| - | |||
| - | Archiv: | ||
| - | / | ||
| - | |||
| - | Größe: | ||
| - | ... | ||
| - | ================================================== | ||
| - | </ | ||
| - | |||
| - | Auf dem NAS befindet sich anschließend beispielsweise: | ||
| - | |||
| - | < | ||
| - | Backup_magicmirror/ | ||
| - | └── Manuelle_Backups/ | ||
| - | ├── MagicMirror_2026-10-07_11-28-53/ | ||
| - | │ | ||
| - | ├── MagicMirror_2026-11-15_17-22-10/ | ||
| - | │ | ||
| - | └── ... | ||
| - | </ | ||
| - | |||
| - | |||
| - | ===== Fehlgeschlagenes Backup ===== | ||
| - | |||
| - | Während das Backup läuft, trägt der Zielordner absichtlich den Zusatz: | ||
| - | |||
| - | < | ||
| - | _INCOMPLETE | ||
| - | </ | ||
| - | |||
| - | Beispiel: | ||
| - | |||
| - | < | ||
| - | MagicMirror_2026-10-07_11-28-53_INCOMPLETE | ||
| - | </ | ||
| - | |||
| - | Erst wenn: | ||
| - | |||
| - | * TAR erfolgreich beendet wurde | ||
| - | * gzip das Archiv erfolgreich geprüft hat | ||
| - | * TAR das Archiv vollständig lesen konnte | ||
| - | |||
| - | wird der Ordner umbenannt und '' | ||
| - | |||
| - | Bleibt '' | ||
| - | |||
| - | |||
| - | ====== NAS-Mount überprüfen ====== | ||
| - | |||
| - | ===== Ist das NAS wirklich gemountet? ===== | ||
| - | |||
| - | <code bash> | ||
| - | findmnt / | ||
| - | </ | ||
| - | |||
| - | Bei korrektem systemd-Automount können zwei Zeilen erscheinen: | ||
| - | |||
| - | < | ||
| - | / | ||
| - | / | ||
| - | </ | ||
| - | |||
| - | Das ist korrekt. | ||
| - | |||
| - | Die erste Zeile ist der systemd-Automount. | ||
| - | |||
| - | Die zweite Zeile ist die tatsächlich gemountete SMB/ | ||
| - | |||
| - | |||
| - | ===== Speicherplatz des NAS anzeigen ===== | ||
| - | |||
| - | <code bash> | ||
| - | df -h / | ||
| - | </ | ||
| - | |||
| - | |||
| - | ===== Schreibzugriff testen ===== | ||
| - | |||
| - | <code bash> | ||
| - | touch / | ||
| - | ls -l / | ||
| - | rm / | ||
| - | </ | ||
| - | |||
| - | Wenn alle drei Befehle ohne Fehler funktionieren, | ||
| - | |||
| - | |||
| - | ====== Einrichtung auf einem neuen Raspberry Pi ====== | ||
| - | |||
| - | Diese Anleitung beschreibt die komplette Einrichtung auf einem frischen Raspberry Pi. | ||
| - | |||
| - | Als Platzhalter werden verwendet: | ||
| - | |||
| - | < | ||
| - | < | ||
| - | < | ||
| - | < | ||
| - | < | ||
| - | < | ||
| - | < | ||
| - | < | ||
| - | </ | ||
| - | |||
| - | Beispiel für eine Freigabe: | ||
| - | |||
| - | < | ||
| - | //< | ||
| - | </ | ||
| - | |||
| - | |||
| - | ===== 1. Benutzer auf dem Raspberry Pi anlegen ===== | ||
| - | |||
| - | Bei aktuellen Raspberry-Pi-OS-Versionen wird normalerweise bereits während der Installation ein Benutzer angelegt. | ||
| - | |||
| - | Falls ein zusätzlicher Benutzer benötigt wird: | ||
| - | |||
| - | <code bash> | ||
| - | sudo adduser < | ||
| - | </ | ||
| - | |||
| - | Falls der Benutzer Administratorrechte erhalten soll: | ||
| - | |||
| - | <code bash> | ||
| - | sudo usermod -aG sudo < | ||
| - | </ | ||
| - | |||
| - | Danach kontrollieren: | ||
| - | |||
| - | <code bash> | ||
| - | id < | ||
| - | </ | ||
| - | |||
| - | |||
| - | ===== 2. Gruppe für NAS-Zugriff anlegen ===== | ||
| - | |||
| - | Für den NAS-Zugriff wird eine eigene Gruppe verwendet: | ||
| - | |||
| - | <code bash> | ||
| - | sudo groupadd nasusers | ||
| - | </ | ||
| - | |||
| - | Falls die Gruppe bereits existiert, erscheint eine entsprechende Meldung. Das ist unkritisch. | ||
| - | |||
| - | Benutzer zur Gruppe hinzufügen: | ||
| - | |||
| - | <code bash> | ||
| - | sudo usermod -aG nasusers < | ||
| - | </ | ||
| - | |||
| - | Danach neu anmelden oder den Raspberry Pi neu starten, damit die neue Gruppenmitgliedschaft aktiv wird. | ||
| - | |||
| - | Prüfen: | ||
| - | |||
| - | <code bash> | ||
| - | getent group nasusers | ||
| - | </ | ||
| - | |||
| - | und: | ||
| - | |||
| - | <code bash> | ||
| - | id < | ||
| - | </ | ||
| - | |||
| - | In der Ausgabe von '' | ||
| - | |||
| - | |||
| - | ===== 3. UID und GID ermitteln ===== | ||
| - | |||
| - | Die numerische Benutzer-ID ermitteln: | ||
| - | |||
| - | <code bash> | ||
| - | id -u < | ||
| - | </ | ||
| - | |||
| - | Die Gruppen-ID von '' | ||
| - | |||
| - | <code bash> | ||
| - | getent group nasusers | ||
| - | </ | ||
| - | |||
| - | Beispiel: | ||
| - | |||
| - | < | ||
| - | nasusers: | ||
| - | </ | ||
| - | |||
| - | Dann wäre: | ||
| - | |||
| - | < | ||
| - | GID = 1003 | ||
| - | </ | ||
| - | |||
| - | Die tatsächlichen Werte auf dem jeweiligen Pi verwenden. | ||
| - | |||
| - | |||
| - | ===== 4. CIFS-Unterstützung installieren ===== | ||
| - | |||
| - | Für den Zugriff auf eine Windows-/ | ||
| - | |||
| - | <code bash> | ||
| - | sudo apt update | ||
| - | sudo apt install cifs-utils | ||
| - | </ | ||
| - | |||
| - | Ein kompletter Samba-Server wird nicht benötigt. | ||
| - | |||
| - | Der Raspberry Pi ist hier nur SMB-Client. | ||
| - | |||
| - | |||
| - | ===== 5. Lokalen Mountpunkt anlegen ===== | ||
| - | |||
| - | <code bash> | ||
| - | sudo mkdir -p / | ||
| - | </ | ||
| - | |||
| - | Dieser Ordner ist nur der lokale Einhängepunkt. | ||
| - | |||
| - | Die eigentlichen Daten befinden sich später auf dem NAS. | ||
| - | |||
| - | |||
| - | ===== 6. Zugangsdaten des NAS sicher speichern ===== | ||
| - | |||
| - | Verzeichnis anlegen: | ||
| - | |||
| - | <code bash> | ||
| - | sudo mkdir -p /etc/samba | ||
| - | </ | ||
| - | |||
| - | Credentials-Datei erstellen: | ||
| - | |||
| - | <code bash> | ||
| - | sudo nano / | ||
| - | </ | ||
| - | |||
| - | Inhalt: | ||
| - | |||
| - | < | ||
| - | username=< | ||
| - | password=< | ||
| - | </ | ||
| - | |||
| - | Optional kann bei Bedarf zusätzlich eine Domain bzw. Workgroup angegeben werden: | ||
| - | |||
| - | < | ||
| - | domain=WORKGROUP | ||
| - | </ | ||
| - | |||
| - | Die Datei darf nicht für normale Benutzer lesbar sein: | ||
| - | |||
| - | <code bash> | ||
| - | sudo chown root:root / | ||
| - | sudo chmod 600 / | ||
| - | </ | ||
| - | |||
| - | Kontrolle: | ||
| - | |||
| - | <code bash> | ||
| - | ls -l / | ||
| - | </ | ||
| - | |||
| - | Erwartet wird ungefähr: | ||
| - | |||
| - | < | ||
| - | -rw------- 1 root root ... | ||
| - | </ | ||
| - | |||
| - | Das Passwort niemals direkt in ''/ | ||
| - | |||
| - | |||
| - | ===== 7. NAS in /etc/fstab eintragen ===== | ||
| - | |||
| - | Vorher Sicherung erstellen: | ||
| - | |||
| - | <code bash> | ||
| - | sudo cp /etc/fstab / | ||
| - | </ | ||
| - | |||
| - | Datei bearbeiten: | ||
| - | |||
| - | <code bash> | ||
| - | sudo nano /etc/fstab | ||
| - | </ | ||
| - | |||
| - | Folgende Zeile ergänzen: | ||
| - | |||
| - | < | ||
| - | //< | ||
| - | </ | ||
| - | |||
| - | Dabei müssen ''< | ||
| - | |||
| - | |||
| - | ===== Bedeutung der wichtigsten Mount-Optionen ===== | ||
| - | |||
| - | ^ Option ^ Bedeutung ^ | ||
| - | | credentials=... | Zugangsdaten liegen in einer separaten geschützten Datei | | ||
| - | | vers=3.0 | SMB 3 wird verwendet | | ||
| - | | uid=< | ||
| - | | gid=< | ||
| - | | file_mode=0660 | Lesen/ | ||
| - | | dir_mode=0770 | Vollzugriff auf Verzeichnisse für Benutzer und Gruppe | | ||
| - | | _netdev | Kennzeichnet den Mount als Netzwerk-Dateisystem | | ||
| - | | nofail | Der Pi darf auch starten, wenn das NAS nicht erreichbar ist | | ||
| - | | x-systemd.automount | NAS wird erst beim ersten Zugriff verbunden | | ||
| - | | x-systemd.mount-timeout=10s | Mountversuch läuft nicht unbegrenzt | | ||
| - | |||
| - | |||
| - | ===== 8. systemd neu einlesen ===== | ||
| - | |||
| - | <code bash> | ||
| - | sudo systemctl daemon-reload | ||
| - | </ | ||
| - | |||
| - | Automount starten: | ||
| - | |||
| - | <code bash> | ||
| - | sudo systemctl start mnt-nasbackup.automount | ||
| - | </ | ||
| - | |||
| - | Status kontrollieren: | ||
| - | |||
| - | <code bash> | ||
| - | systemctl status mnt-nasbackup.automount --no-pager -l | ||
| - | </ | ||
| - | |||
| - | Die korrekte Anzeige lautet: | ||
| - | |||
| - | < | ||
| - | Active: active (waiting) | ||
| - | </ | ||
| - | |||
| - | '' | ||
| - | |||
| - | Das NAS ist zu diesem Zeitpunkt möglicherweise noch gar nicht physisch gemountet. | ||
| - | |||
| - | systemd wartet auf den ersten Zugriff. | ||
| - | |||
| - | |||
| - | ===== 9. NAS-Mount auslösen ===== | ||
| - | |||
| - | Ein einfacher Zugriff reicht: | ||
| - | |||
| - | <code bash> | ||
| - | ls -la / | ||
| - | </ | ||
| - | |||
| - | Dadurch wird der CIFS-Mount automatisch aktiviert. | ||
| - | |||
| - | |||
| - | ===== 10. Mount kontrollieren ===== | ||
| - | |||
| - | <code bash> | ||
| - | findmnt / | ||
| - | </ | ||
| - | |||
| - | Es sollte unter anderem eine CIFS-Zeile erscheinen: | ||
| - | |||
| - | < | ||
| - | //< | ||
| - | </ | ||
| - | |||
| - | Speicherplatz prüfen: | ||
| - | |||
| - | <code bash> | ||
| - | df -h / | ||
| - | </ | ||
| - | |||
| - | |||
| - | ===== 11. Schreibzugriff testen ===== | ||
| - | |||
| - | <code bash> | ||
| - | touch / | ||
| - | ls -l / | ||
| - | rm / | ||
| - | </ | ||
| - | |||
| - | Erst wenn dieser Test funktioniert, | ||
| - | |||
| - | |||
| - | ====== Backup-Script installieren ====== | ||
| - | |||
| - | ===== 1. Script-Verzeichnis anlegen ===== | ||
| - | |||
| - | Als normaler Pi-Benutzer: | ||
| - | |||
| - | <code bash> | ||
| - | mkdir -p ~/bin | ||
| - | </ | ||
| - | |||
| - | |||
| - | ===== 2. Backup-Script erstellen ===== | ||
| - | |||
| - | <code bash> | ||
| - | nano ~/ | ||
| - | </ | ||
| - | |||
| - | Folgenden Inhalt einfügen: | ||
| - | |||
| - | <code bash> | ||
| - | # | ||
| - | |||
| - | SOURCE=" | ||
| - | NAS="/ | ||
| - | BACKUP_BASE=" | ||
| - | LOGDIR=" | ||
| - | |||
| - | # WICHTIG: | ||
| - | # Hier exakt den erwarteten NAS-Share eintragen. | ||
| - | # Dadurch verhindert das Script, dass versehentlich auf | ||
| - | # das lokale Verzeichnis / | ||
| - | EXPECTED_SOURCE="//< | ||
| - | |||
| - | |||
| - | check_nas() { | ||
| - | |||
| - | # Der Zugriff auf den Mountpunkt löst den systemd-Automount aus. | ||
| - | # timeout verhindert, dass das Script bei einem nicht erreichbaren | ||
| - | # NAS unbegrenzt wartet. | ||
| - | if ! timeout 15s stat " | ||
| - | echo " | ||
| - | return 1 | ||
| - | fi | ||
| - | |||
| - | # Prüfen, welches Dateisystem tatsächlich hinter / | ||
| - | # | ||
| - | # Ein vorhandenes autofs-Verzeichnis reicht NICHT aus. | ||
| - | # Es muss wirklich ein CIFS-Mount des richtigen NAS-Shares vorhanden sein. | ||
| - | MOUNT_INFO=" | ||
| - | |||
| - | FSTYPE=" | ||
| - | MOUNT_SOURCE=" | ||
| - | |||
| - | if [[ " | ||
| - | echo " | ||
| - | echo " | ||
| - | return 1 | ||
| - | fi | ||
| - | |||
| - | return 0 | ||
| - | } | ||
| - | |||
| - | |||
| - | # ========================================================= | ||
| - | # Hintergrundprozess | ||
| - | # ========================================================= | ||
| - | |||
| - | if [[ " | ||
| - | |||
| - | FINAL_DEST=" | ||
| - | |||
| - | # Während der Sicherung bekommt der Ordner bewusst | ||
| - | # den Zusatz _INCOMPLETE. | ||
| - | TEMP_DEST=" | ||
| - | |||
| - | ARCHIVE=" | ||
| - | |||
| - | |||
| - | # ----------------------------------------------------- | ||
| - | # Verhindert mehrere gleichzeitige Backups | ||
| - | # ----------------------------------------------------- | ||
| - | |||
| - | exec 9>/ | ||
| - | |||
| - | if ! flock -n 9; then | ||
| - | echo " | ||
| - | exit 1 | ||
| - | fi | ||
| - | |||
| - | |||
| - | echo | ||
| - | echo " | ||
| - | echo " | ||
| - | echo " | ||
| - | echo " | ||
| - | echo " | ||
| - | echo " | ||
| - | echo | ||
| - | |||
| - | |||
| - | # ----------------------------------------------------- | ||
| - | # NAS im Hintergrundprozess nochmals prüfen | ||
| - | # ----------------------------------------------------- | ||
| - | |||
| - | if ! check_nas; then | ||
| - | echo | ||
| - | echo " | ||
| - | exit 2 | ||
| - | fi | ||
| - | |||
| - | |||
| - | # ----------------------------------------------------- | ||
| - | # Temporären Backup-Ordner anlegen | ||
| - | # ----------------------------------------------------- | ||
| - | |||
| - | mkdir -p " | ||
| - | echo " | ||
| - | exit 3 | ||
| - | } | ||
| - | |||
| - | |||
| - | echo " | ||
| - | echo | ||
| - | |||
| - | |||
| - | # ----------------------------------------------------- | ||
| - | # Gesamten MagicMirror-Ordner sichern | ||
| - | # | ||
| - | # Gesichert werden unter anderem: | ||
| - | # | ||
| - | # - config | ||
| - | # - css | ||
| - | # - modules | ||
| - | # - node_modules | ||
| - | # - versteckte Dateien | ||
| - | # - .git | ||
| - | # - symbolische Links | ||
| - | # | ||
| - | # Das Archiv enthält einen obersten Ordner " | ||
| - | # ----------------------------------------------------- | ||
| - | |||
| - | tar \ | ||
| - | --create \ | ||
| - | --gzip \ | ||
| - | --file=" | ||
| - | --directory=" | ||
| - | MagicMirror | ||
| - | |||
| - | RESULT=$? | ||
| - | |||
| - | |||
| - | # ----------------------------------------------------- | ||
| - | # tar-Fehler behandeln | ||
| - | # ----------------------------------------------------- | ||
| - | |||
| - | if [[ $RESULT -ne 0 ]]; then | ||
| - | echo | ||
| - | echo " | ||
| - | echo " | ||
| - | echo "tar Fehlercode: $RESULT" | ||
| - | echo | ||
| - | echo " | ||
| - | echo " | ||
| - | echo " | ||
| - | exit " | ||
| - | fi | ||
| - | |||
| - | |||
| - | echo | ||
| - | echo " | ||
| - | echo " | ||
| - | |||
| - | |||
| - | # ----------------------------------------------------- | ||
| - | # gzip-Struktur prüfen | ||
| - | # ----------------------------------------------------- | ||
| - | |||
| - | if ! gzip -t " | ||
| - | echo | ||
| - | echo " | ||
| - | exit 4 | ||
| - | fi | ||
| - | |||
| - | |||
| - | # ----------------------------------------------------- | ||
| - | # Zusätzlich prüfen, ob TAR das gesamte Archiv lesen kann | ||
| - | # ----------------------------------------------------- | ||
| - | |||
| - | if ! tar -tzf " | ||
| - | echo | ||
| - | echo " | ||
| - | exit 5 | ||
| - | fi | ||
| - | |||
| - | |||
| - | # ----------------------------------------------------- | ||
| - | # Erst jetzt gilt das Backup als erfolgreich. | ||
| - | # | ||
| - | # Der Zusatz _INCOMPLETE wird entfernt. | ||
| - | # ----------------------------------------------------- | ||
| - | |||
| - | mv " | ||
| - | |||
| - | |||
| - | echo | ||
| - | echo " | ||
| - | echo " | ||
| - | echo "Ende: $(date)" | ||
| - | echo | ||
| - | echo " | ||
| - | echo " | ||
| - | echo | ||
| - | echo " | ||
| - | du -h " | ||
| - | echo " | ||
| - | |||
| - | exit 0 | ||
| - | fi | ||
| - | |||
| - | |||
| - | # ========================================================= | ||
| - | # Manueller Aufruf | ||
| - | # ========================================================= | ||
| - | |||
| - | |||
| - | # --------------------------------------------------------- | ||
| - | # Prüfen, ob MagicMirror überhaupt existiert | ||
| - | # --------------------------------------------------------- | ||
| - | |||
| - | if [[ ! -d " | ||
| - | echo | ||
| - | echo " | ||
| - | echo " | ||
| - | exit 1 | ||
| - | fi | ||
| - | |||
| - | |||
| - | echo " | ||
| - | |||
| - | |||
| - | # --------------------------------------------------------- | ||
| - | # NAS prüfen | ||
| - | # --------------------------------------------------------- | ||
| - | |||
| - | if ! check_nas; then | ||
| - | |||
| - | echo | ||
| - | echo " | ||
| - | echo " | ||
| - | echo | ||
| - | echo "Das NAS ist offline oder der Share nicht gemountet." | ||
| - | echo | ||
| - | echo "Es wurden keine Daten lokal nach" | ||
| - | echo "/ | ||
| - | echo " | ||
| - | echo | ||
| - | |||
| - | exit 1 | ||
| - | fi | ||
| - | |||
| - | |||
| - | # --------------------------------------------------------- | ||
| - | # Ziel- und Log-Verzeichnisse erstellen | ||
| - | # --------------------------------------------------------- | ||
| - | |||
| - | mkdir -p " | ||
| - | mkdir -p " | ||
| - | |||
| - | |||
| - | # --------------------------------------------------------- | ||
| - | # Datum und Uhrzeit erzeugen | ||
| - | # --------------------------------------------------------- | ||
| - | |||
| - | STAMP=" | ||
| - | |||
| - | DEST=" | ||
| - | LOG=" | ||
| - | |||
| - | |||
| - | echo "NAS ist erreichbar." | ||
| - | echo | ||
| - | echo " | ||
| - | echo " | ||
| - | echo " | ||
| - | echo " | ||
| - | echo | ||
| - | |||
| - | |||
| - | # --------------------------------------------------------- | ||
| - | # Hintergrundprozess starten | ||
| - | # | ||
| - | # nohup sorgt dafür, dass das Backup weiterläuft, | ||
| - | # wenn das SSH-/ | ||
| - | # --------------------------------------------------------- | ||
| - | |||
| - | nohup " | ||
| - | |||
| - | PID=$! | ||
| - | |||
| - | |||
| - | echo " | ||
| - | echo "PID: $PID" | ||
| - | echo | ||
| - | echo " | ||
| - | echo "tail -f \" | ||
| - | echo | ||
| - | |||
| - | exit 0 | ||
| - | </ | ||
| - | |||
| - | |||
| - | ===== 3. Script ausführbar machen ===== | ||
| - | |||
| - | <code bash> | ||
| - | chmod +x ~/ | ||
| - | </ | ||
| - | |||
| - | |||
| - | ===== 4. Ersten Test durchführen ===== | ||
| - | |||
| - | <code bash> | ||
| - | ~/ | ||
| - | </ | ||
| - | |||
| - | Danach Log ansehen: | ||
| - | |||
| - | <code bash> | ||
| - | tail -f "$(ls -t ~/ | ||
| - | </ | ||
| - | |||
| - | |||
| - | ====== Verhalten bei ausgeschaltetem NAS ====== | ||
| - | |||
| - | Wenn das NAS ausgeschaltet oder die Freigabe nicht erreichbar ist, darf das Script kein Backup starten. | ||
| - | |||
| - | Beispiel: | ||
| - | |||
| - | < | ||
| - | Prüfe NAS ... | ||
| - | |||
| - | FEHLER: NAS ist nicht erreichbar. | ||
| - | |||
| - | !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | ||
| - | BACKUP NICHT GESTARTET | ||
| - | |||
| - | Das NAS ist offline oder der Share nicht gemountet. | ||
| - | |||
| - | Es wurden keine Daten lokal nach | ||
| - | / | ||
| - | !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | ||
| - | </ | ||
| - | |||
| - | Das ist ein wichtiges Sicherheitsmerkmal. | ||
| - | |||
| - | Das Script prüft nicht nur, ob ''/ | ||
| - | |||
| - | * dass tatsächlich ein CIFS-Dateisystem gemountet ist | ||
| - | * dass genau der erwartete NAS-Share gemountet wurde | ||
| - | |||
| - | |||
| - | ====== Wiederherstellung eines Backups ====== | ||
| - | |||
| - | ===== Archiv zunächst prüfen ===== | ||
| - | |||
| - | Vor einer Wiederherstellung kann das Archiv getestet werden: | ||
| - | |||
| - | <code bash> | ||
| - | gzip -t / | ||
| - | </ | ||
| - | |||
| - | Wenn keine Ausgabe erscheint, ist die gzip-Struktur in Ordnung. | ||
| - | |||
| - | TAR-Inhalt testen: | ||
| - | |||
| - | <code bash> | ||
| - | tar -tzf / | ||
| - | </ | ||
| - | |||
| - | Auch hier bedeutet keine Fehlermeldung einen erfolgreichen Test. | ||
| - | |||
| - | |||
| - | ===== Inhalt ansehen ===== | ||
| - | |||
| - | <code bash> | ||
| - | tar -tzf / | ||
| - | </ | ||
| - | |||
| - | |||
| - | ===== Backup in das Home-Verzeichnis wiederherstellen ===== | ||
| - | |||
| - | Als normaler Pi-Benutzer: | ||
| - | |||
| - | <code bash> | ||
| - | cd ~ | ||
| - | </ | ||
| - | |||
| - | Falls bereits ein MagicMirror-Ordner vorhanden ist, diesen vorher umbenennen: | ||
| - | |||
| - | <code bash> | ||
| - | mv ~/ | ||
| - | </ | ||
| - | |||
| - | Danach Backup entpacken: | ||
| - | |||
| - | <code bash> | ||
| - | tar -xzf / | ||
| - | </ | ||
| - | |||
| - | Danach sollte wieder vorhanden sein: | ||
| - | |||
| - | < | ||
| - | / | ||
| - | </ | ||
| - | |||
| - | |||
| - | ====== Besonderheit beim Umzug auf einen neuen Pi / neues Betriebssystem ====== | ||
| - | |||
| - | Das Backup enthält bewusst auch: | ||
| - | |||
| - | < | ||
| - | MagicMirror/ | ||
| - | </ | ||
| - | |||
| - | Für eine Wiederherstellung auf demselben oder einem sehr ähnlichen System kann das praktisch sein. | ||
| - | |||
| - | Bei einem Wechsel auf: | ||
| - | |||
| - | * einen Raspberry Pi 5 | ||
| - | * eine deutlich neuere Raspberry-Pi-OS-Version | ||
| - | * eine andere Node.js-Version | ||
| - | * eine andere CPU-/ | ||
| - | |||
| - | sollten vorhandene '' | ||
| - | |||
| - | Einzelne Node-Module können native Binärbestandteile enthalten. | ||
| - | |||
| - | Für eine saubere Migration auf einen neuen Pi sollte daher zunächst der komplette MagicMirror-Ordner wiederhergestellt werden, damit alle Konfigurationen, | ||
| - | |||
| - | Anschließend sollte die Node.js-/ | ||
| - | |||
| - | Das Backup dient damit sowohl als vollständige Sicherung als auch als Grundlage für eine spätere Migration. | ||
| - | |||
| - | |||
| - | ====== Nützliche Kontrollbefehle ====== | ||
| - | |||
| - | ===== Automount ===== | ||
| - | |||
| - | <code bash> | ||
| - | systemctl status mnt-nasbackup.automount --no-pager -l | ||
| - | </ | ||
| - | |||
| - | |||
| - | ===== Tatsächlichen NAS-Mount anzeigen ===== | ||
| - | |||
| - | <code bash> | ||
| - | findmnt / | ||
| - | </ | ||
| - | |||
| - | |||
| - | ===== Freien NAS-Speicher anzeigen ===== | ||
| - | |||
| - | <code bash> | ||
| - | df -h / | ||
| - | </ | ||
| - | |||
| - | |||
| - | ===== Laufendes Backup suchen ===== | ||
| - | |||
| - | <code bash> | ||
| - | pgrep -af ' | ||
| - | </ | ||
| - | |||
| - | |||
| - | ===== Neuestes Backup-Log anzeigen ===== | ||
| - | |||
| - | <code bash> | ||
| - | tail -f "$(ls -t ~/ | ||
| - | </ | ||
| - | |||
| - | |||
| - | ===== Alle Backup-Logs anzeigen ===== | ||
| - | |||
| - | <code bash> | ||
| - | ls -lah ~/ | ||
| - | </ | ||
| - | |||
| - | |||
| - | ===== Alle manuellen Backups auf dem NAS anzeigen ===== | ||
| - | |||
| - | <code bash> | ||
| - | ls -lah / | ||
| - | </ | ||
| - | |||
| - | |||
| - | ====== Wichtige Dateien ====== | ||
| - | |||
| - | ^ Datei / Pfad ^ Funktion ^ | ||
| - | | '' | ||
| - | | '' | ||
| - | | '' | ||
| - | | ''/ | ||
| - | | ''/ | ||
| - | | ''/ | ||
| - | | ''/ | ||
| - | | ''/ | ||
| - | |||
| - | |||
| - | ====== Kurzfassung für den Alltag ====== | ||
| - | |||
| - | Normalerweise wird nur dieser eine Befehl benötigt: | ||
| - | |||
| - | <code bash> | ||
| - | ~/ | ||
| - | </ | ||
| - | |||
| - | Status ansehen: | ||
| - | |||
| - | <code bash> | ||
| - | tail -f "$(ls -t ~/ | ||
| - | </ | ||
| - | |||
| - | Ein Backup ist erst dann gültig, wenn im Log | ||
| - | |||
| - | < | ||
| - | BACKUP ERFOLGREICH | ||
| - | </ | ||
| - | |||
| - | steht und der Backup-Ordner keinen Zusatz | ||
| - | |||
| - | < | ||
| - | _INCOMPLETE | ||
| - | </ | ||
| - | |||
| - | mehr besitzt. | ||