Wie verwende ich inotify oder Named Pipes über SSHFS?

12

Dank sshfsMagie kann ich mein Home-Verzeichnis von einem Remote-Server mit mounten

sshfs user@server:/home/user ~/remote

Optimistisch, ich dachte , dass ich eine lokal gesetzt würde inotify-hook auf ~/remote/logFile(in der sshfsHalterung) so ein lokales Programm auf Remote - Log - Änderungen reagieren kann.

cd ~/remote
touch logFile                                # create remote file
inotifywait logFile &                        # set up local inotify-hook
ssh user@server -x touch /home/user/logFile  # touch file from remote

Nichts passiert . inotifywaitist still, es sei denn, ich touchdie Datei lokal. Das Schreiben in eine Named Pipe schlägt ebenfalls fehl.

Warum ist das?
Wie kann ich diese Lücke schließen?

Ich könnteinotifywait auf der Fernbedienung laufen , eine Serialisierungsstrategie für Dateisystemänderungen hacken und eine Verbindung zum lokalen Netzwerk aufrechterhalten, aber dann implementiere ich SSHFS im Grunde genommen neu . Und es tötet die Abstraktion vollständig ab.

Anko
quelle
2
Ich glaube nicht, dass es inotifyauf dem lokalen System eine Möglichkeit gibt, Änderungen auf einem entfernten Dateisystem zu erkennen. Der lokale Kernel ist bei diesen Änderungen nicht in der Schleife. Sie müssen inotifywaitauf dem Server ausgeführt werden, nicht auf dem Client.
Barmar
@Barmar Aber dann weiß der Client (lokaler Computer) nichts über Änderungen. Ich habe bearbeitet, um ein bisschen darüber hinzuzufügen.
Anko
Im Allgemeinen können Netzwerkdateisysteme keine vollständige Transparenz bieten, sondern brechen häufig die Abstraktion. Was benötigt wird, ist eine Erweiterung von SSHFS. Wenn Sie inotify lokal ausführen, muss es die Anforderung an den Server senden, der dort inotify ausführt, und Benachrichtigungen an den Client zurückgeben.
Barmar
Hast du dir Gamin angesehen?
Janus Troelsen
@ JanusTroelsen Ich habe noch nichts von Gamin gehört. Laut Übersichtsseite wird auch inotify verwendet. Ist es nützlich, solche Updates über ein Netzwerk zu verteilen?
Anko

Antworten:

10

Das SSHFS-Dateisystem basiert auf dem SFTP- Protokoll. SFTP bietet nur die Möglichkeit, Dateien auf "klassische" Weise zu bearbeiten. Der Client sendet eine Anfrage an den Server (Liste eines Verzeichnisses, Hochladen einer Datei usw.), und der Server antwortet. In diesem Protokoll gibt es keine Möglichkeit für den Server, den Client spontan zu benachrichtigen, dass etwas passiert ist.

Dies macht es unmöglich, eine Funktion wie inotify innerhalb von SSHFS bereitzustellen. Es wäre möglich, SSHFS mit proprietären Erweiterungen zu erweitern oder durch eine vollwertige SSH-Verbindung zu ergänzen. Ich kenne jedoch keine solche Erweiterung für SSHFS.

Named Pipes können aus demselben Grund nicht über SSHFS implementiert werden. NFS, das klassische vernetzte Dateisystem, bietet auch keine Möglichkeit, maschinenübergreifende Pipes zu unterstützen. In einem vernetzten Dateisystem erstellt eine Named Pipe einen unabhängigen Kommunikationspunkt auf jedem der Computer, auf denen sie bereitgestellt ist (zusätzlich zum Server).

FAM (das inotify-Analogon in SGI IRIX, das auf Linux portiert wurde) bietet einen Daemon, mit dem Benachrichtigungen über das Netzwerk gesendet werden können. Linux hat FAM seit Inotify eher veraltet, daher weiß ich nicht, ob es einfacher wäre, FAM zum Laufen zu bringen, als ein eigenes anwendungsspezifisches Benachrichtigungssystem zu entwickeln. Sie müssen eine Portweiterleitung über SSH einrichten oder ein VPN einrichten, um die Netzwerkverbindung für FAM und NFS zu sichern.

Wenn Sie sich für eine eigene Version entscheiden und davon ausgehen, dass Sie dem Client Shell-Zugriff gewähren können, ist es ziemlich einfach, einen Inotify-Monitor im Auftrag eines Clients auszuführen: Lassen Sie den Client eine SSH-Verbindung öffnen und führen Sie den inotifywaitBefehl auf dem Server aus , analysiert seine Ausgabe auf dem Client. Sie können eine Master-Verbindung einrichten , um das Öffnen vieler Verbindungen vom selben Client zum selben Server zu beschleunigen.

Gilles 'SO - hör auf böse zu sein'
quelle
1
Zumindest Qemu unterstützt eine Art maschinenübergreifende Pipe: eine Pipe an den virtuellen Gast
Janus Troelsen