Ich versuche, einen Ordnerbaum zwischen mehreren Computern synchron zu halten. Derzeit verwende ich unison
eine Sterntopologie mit einem zentralen Remote-Server. Ich möchte, dass die Daten auf dem Server verschlüsselt werden, sodass der unison
Baum (einschließlich des .unison
Ordners) auf dem Server in einem Baum gespeichert wird encfs
. Um eine Synchronisierung durchzuführen, führt jeder Client Folgendes aus:
- mountet den Serverspeicher mit
sshfs
- mountet den
encfs
Speichersshfs
lokal unison
wird zwischen der lokalen Kopie der Dokumente und der gemounteten Kopie durchgeführt .
Das Setup hat viele Vorteile:
- Open-Source-Werkzeuge
- skriptfähige Befehlszeilenlösung
- sichere Kommunikation über
ssh
- Privatsphäre auf dem Server, da der
encfs
Ordnerbaum dort nie entschlüsselt wird - Möglichkeit, Änderungen während der Synchronisierung zu vergleichen, da dies
unison
über Klartext läuft
Eine Sache, die nicht so gut funktioniert, ist die Geschwindigkeit der Synchronisierung. Da der encfs
Ordner vom Server auf dem Client gemountet ist, stat()
muss jeder Aufruf des Clients ssh
an den Server weitergeleitet werden. Der Dokumentenbaum enthält bereits Tausende von Dateien, und eine unison
Synchronisierung muss mindestens einen stat()
Aufruf für jede Datei durchführen (um Änderungen am im Ordner gespeicherten Status auszuschließen .unison
). Gibt es eine schnellere Alternative, die die oben aufgeführten Vorteile beibehält?
Hinweis: Wenn ich die letzte Bedingung entfernen würde, könnte ich unison
über Cyphertext laufen und den encfs
Baum nur lokal mounten. Dann unison
würde es lokal auf dem Client und auf dem Server laufen, sodass stat()
die Aufrufe schnell wären. Aber es ist schön, die Option zu haben, zumindest zu sehen, welche Dateien synchronisiert werden; mit unison
über encfs
Cyphertext würden die Dateinamen verschlüsselt.
Ich verstehe, dass man zur Lösung dieses Problems während der Synchronisierung Dateimetadaten effizient vom Server zum Client übertragen muss. Ich frage mich, ob es eine Möglichkeit gibt (d. h. eine Kombination vorhandener Tools), um beispielsweise die Metadaten an einem Ort zu speichern, sodass sie alle durch Senden nur eines (oder weniger) Datenblocks übertragen werden, anstatt Tausende von Blöcken zu senden (was bei der Anrufweiterleitung der stat()
Fall ist).
encfs
Was wäre, wenn ich beispielsweise eine ext4
Over- Partition ersetzen würde dm-crypt
, die in einer großen Datei auf dem Server gespeichert und über losetup
Over auf dem Client gemountet ist sshfs
? Würde das ext4
Dateisystem die Dateimetadaten zusammenhalten, sodass sie durch Senden von nur wenigen Blöcken übertragen werden? Würde es sshfs
wissen, dass bei einem Update nur wenige Blöcke gesendet werden müssen, anstatt die gesamte verschlüsselte Datei neu zu schreiben?
Antwort1
Ich hatte Erfolg mit ext4
over luks
over sshfs
. Ich finde, dass das Ausführen unison
auf einem Mount dieses Typs viel, viel schneller ist als over encfs
over sshfs
. Es muss also sein, dass diese Tausenden von stat()
Strukturen irgendwie im ext4
FS gebündelt sind, sodass sie während einer Synchronisierung weniger Netzwerkverkehr erfordern.
Etwas nervig ist, dass das ext4
Dateisystem für jede Datei eine Benutzer-ID benötigt und diese Benutzer-ID wird für die Berechnung der Zugriffsberechtigungen verwendet, wenn das ext4
Dateisystem lokal auf einem Client gemountet ist. In meinem Fall habe ich mich entschieden, meine lokale Benutzer-ID in eine bestimmte Nummer zu ändern.alledie Clients, von denen ich synchronisiere. Die Alternative wäre, die Dateien im ext4
FS mit UID 0 zu speichern und dann bindfs
das ext4
FS mit einer Nicht-Root-UID zu mounten.