Script-Spielerei (6) – Dateien zwischen Laptop und PC syncronisieren

Hier mal wieder ein neues Script aus meiner Trickkiste.
Die Problemstellung war folgende: Ein Linux-Laptop sollte mit den Daten auf einem NAS automatisch syncronisiert werden. Es sollte vollkommen transparent (aber auch eigentlich unsichtbar) für den Anwender funktionieren.

Ich habe mir darüber lange Gedanken gemacht, aber jetzt eine praktikable Lösung gefunden.

Erstes Problem: Welches Programm zur Syncronisation verwenden? Jeder, der mit Linux zu tun hat wird jetzt gleich reflexartig rsync sagen. Ich sage: Ja, aber eigentlich wird nicht richtig syncronisiert. Was ist mit dem Fall, das auf dem NAS (durch Zugriff von einem anderen PC) eine Datei gelöscht wurde? Ja, OK, dafür gibt es die Option „–delete“ – was passiert aber bei dieser Option, wenn Dateien auf dem Laptop angelegt wurden, tja, die werden dann gelöscht. OK, dafür gibt es ja die Option -b (wie Backup) und die Möglichkeit, ein Backupverzeichnis anzulegen, wegen mir auch einer Option à la –backup-dir=~.local/rsync-trash/`date +%Y-%m-%d` auch mit der Möglichkeit, einen Ordner pro Tag anzulegen. Tja, wenn aber zwei Mal pro Tag eine Datei angelegt wird, dann wird die „alte“ (wahrscheinlich vollere) gelöscht. Es gäbe zwar noch die Möglichkeit, diese Dateien mit Hilfe des Papierkorbs umzuleiten, aber warum soll ich denn eine Datei, die gerade angelegt habe, im Papierkorb suchen- das ist ja Blödsinn und hat nicht nichts mit Benutzerfreundlichkeit zu tun. Wir brauchen also eine echte 2-Wege-Synchronisation.
Nun dafür eignet sich zum Beispiel Unison, gefällt mir aber deshalb nicht, weil ich auf dem NAS ebenfalls unison installieren müsste und die Versionen müssten ebenfalls zusammen passen- fällt auch raus. Und für so einen Zweck Owncloud / Nextcloud auf dem Server installieren fällt flach, das wäre ja mit Kanonen auf Spatzen schießen!
Deshalb habe ich mich für FreeFileSync entschieden, ein kleines, aber durchaus geniales Programm. Es bietet jede Menge Funktionen, gerade die 2 Wege-Synchronisation funktioniert einwandfrei.

Zur Installation: Leider gibt es noch kein fertiges Paket zur Installation, deshalb sind folgende Wege notwendig:

Der Download und die Installation sollte wie in Linuxbabe – Install Freefilesync on Ubuntu 16.04 erfolgen inkl. des Verschiebens des Ordners. Also nach dem Download der Datei von der Seite https://www.freefilesync.org/download.php folgende Befehle ausführen:

cd ~/Downloads
sudo tar -xzf FreeFileSync_9.3_Ubuntu_16.04_64-bit.tar.gz -C /opt
sudo unzip /opt/FreeFileSync/Resources.zip -d /opt/FreeFileSync/Resources/
sudo apt-get install –no-install-recommends gnome-panel
sudo gnome-desktop-item-edit /usr/share/applications/ –create-new

In dem jetzt öffnenden Fenster mit dem Klick auf das Bild oben Links das Symbol auswählen (/opt/FreeFileSync/Resources/FreeFileSync.png)
Als Name FreeFileSync eingeben, der Befehl lautet: /opt/FreeFileSync/FreeFileSync

Das Arbeitsverzeichnis ist entweder home (~) oder leer

Danach auf „schließen“. Das gleiche nochmal für RealtimeSync wiederholen. /opt/FreeFileSync/Resources/RealTimeSync.png

/opt/FreeFileSync/RealTimeSync

Nach dem nächsten Anmelden am System ist das Programm im Startmenü.

Jetzt müssen wir noch sagen, was gesichert werden soll. Dazu müssen wir einmalig einen ssl-Schlüssel anlegen und diesen auf dem NAS importieren:

ssh-keygen -t ed25519
ssh-copy-id -i ~/.ssh/id_ed25519.pub ${USER}@Server

Ups, diesen Schritt habe ich wohl nicht perfekt notiert.
Jetzt müssen noch Mountpunkt(e) angelegt werden:

sudo mkdir -p /media/ssh
sudo chown -R Benutzername:Gruppe /media/ssh

mkdir -p /media/ssh/punkt1
mkdir -p /media/ssh/punkt2

Danach können ohne Eingabe von Benutzername und Passwort die Mountpunkte gemountet werden:

sshfs ${USER}@Server:/home/files/ /media/ssh/punkt1/ -o idmap=user -o uid=$(id -u) -o gid=$(id -g) -p 22

Jetzt kann mit FreefileSync endlich ein Job angelegt werden, dieser sollte auch probiert werden. Einmal durchsyncen lassen!

Jetzt kommt der Kniff. Wird das ganze als Batch-Auftrag gespeichert ( Fehlerbehandlung:Nachfragen, Minimiert ausführen, Nach Abschluss Schließe Verlaufsdialog, Speichern unter „server.ffsync-bash“) kann ein Script angelegt werden:

#!/bin/bash
runs=$(pgrep serversync.bash) # pids der laufenden sicherung(en) herausfinden

if [ $$ == „$runs“ ]; # wenn nur eine pid (diese), dann weiter
then
mkdir -p /media/ssh/files
mkdir -p /media/ssh/$1
sshfs $1@server:/home/files/ /media/ssh/files/ -o idmap=user -o uid=$(id -u) -o gid=$(id -g) -p 22 && \
sshfs $1@server:/home/$1/ /media/ssh/$1/ -o idmap=user -o uid=$(id -u) -o gid=$(id -g) -p 22 && \
DISPLAY=:0 LANG=de_DE.UTF-8 /opt/FreeFileSync/FreeFileSync /home/$1/server.ffs_batch
sleep 2 # gibt noch die Möglichkeit, den Cache zu leeren
fusermount -u /media/ssh/files
fusermount -u /media/ssh/$1

else
echo „Läuft schon!“

fi;

Das Script sollte als /usr/local/bin/serversync.bash gesichert werden. Das Script prüft automatisch, ob noch ein anderer Job gerade läuft und beendet sich, falls dies so ist, ansonsten geht es mit dem Verbinden zum Server los. Falls dies nicht klappt, wird es auch beendet, ansonsten synct FreefileSync.Also, los geht’s mit dem cronjob:

crontab -e

*/15 * * * * /usr/local/bin/serversync.bash benutzername

Das war’s.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Seite verwendet Cookies, um die Nutzerfreundlichkeit zu verbessern. Mit der weiteren Verwendung stimmst du dem zu.

Datenschutzerklärung