inotify mit NFS
Habe ich vor kurzem erstellt einen dropbox-system mit inotify, gerade für erstellte Dateien in einem bestimmten Verzeichnis. Das Verzeichnis habe ich gerade bin ist montiert, die von einem NFS-server, und inotify verhält sich anders, als ich es erwarten würde. Betrachten Sie das folgende Szenario, in dem ein inotify-Skript läuft auf Rechner A, der Beobachtung /einige/nfs/dir/auch/sichtbar/zu/B/.
-Mit Maschine Ein, um eine Datei in /einige/nfs/dir/auch/sichtbar/zu/B, das Skript verhält sich wie erwartet. Mit Maschine B, um die Durchführung der gleichen Aktion, das Skript wird nicht benachrichtigt, um eine neue Datei in das Verzeichnis.
-Wenn das Skript ausgeführt wird, auf dem NFS-server wird benachrichtigt, wenn Dateien erstellt werden, sowohl von Maschine A und Maschine B.
Ist das ein bug in der bug in dem Paket, das ich verwende, um den Zugang inotofy, oder ist das erwartete Verhalten?
Grüße,
Andrew
InformationsquelleAutor der Frage ajwood | 2010-11-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
inotify ist eine Unterstützung aus dem kernel zu arbeiten. Wenn eine Anwendung Spuren, die ein Verzeichnis, fragt er den kernel zu informieren, wenn diese änderungen auftreten. Wenn die änderung erfolgt, zusätzlich zum schreiben die änderungen auf disk, der kernel auch informiert der beobachtete Prozess.
Auf einem entfernten NFS-Maschine, die änderung wird nicht sichtbar an den kernel; es geschieht ganz aus der Ferne. NFS älter als inotify und es ist kein Netzwerk-level-support für die es in NFS, oder etwas gleichwertiges.
Wenn Sie möchten, dies zu umgehen, können Sie einen Dienst auf dem Speicher-server (da, der kernel wird immer sehen, änderungen an den Dateisystem), dass die Broker inotify-Anforderungen für remote-Computer, und leiten Sie die Daten an den remote-clients.
Edit: Es scheint mir komisch, dass NFS sollte die Schuld für seine mangelnde Unterstützung für inotify.
Jedoch:
Es ist schwer zu erwarten, dass ein Tragbarer Netzwerk-Protokoll/Anwendung zur Unterstützung einer bestimmten kernel-Funktion entwickelt, die für ein anderes Betriebssystem, und das schien mehr als zwanzig Jahre später. Auch wenn es hat gehören Erweiterungen für Sie, Sie würden nicht verfügbar sein oder nützlich, auf anderen Betriebssystemen.
*Hervorhebung von mir in allen Fällen
Ein weiteres problem mit diesem; nehmen wir an, wir sind nicht mit einem Netzwerk, sondern vielmehr ein lokales Dateisystem mit guter inotify-Unterstützung: ext3 (nehme an, Ihr montiert an
/mnt/foo
). Doch statt einer echten Festplatte, das Dateisystem montiert wird ein loopback-Gerät ; und die zugrunde liegende Datei ist wiederum zugänglich an einer anderen Position in das vfs (sagen wir/var/images/foo.img
).Nun, Sie sind eigentlich nicht zu ändern, montiert ext3-Dateisysteme, Aber es ist immer noch relativ sicher, so zu tun, wenn die änderung der Inhalt der Datei anstelle von Metadaten.
Also, angenommen ein kluger user modifiziert die Datei system image (
/var/images/foo.img
) in einem hex-editor, eine Datei ersetzt den Inhalt mit einigen anderen Daten, während zur gleichen Zeit ein inotify watch ist die Beobachtung der gleichen Datei auf das gemountete Dateisystem.Es gibt keinen vernünftigen Weg, man kann gerne für inotify, um immer informiert der beobachtete Prozess dieser Art von Veränderung. Obwohl, gibt es wahrscheinlich einige Verrenkungen, die könnte man ext3 beachten und Ehren, die sich ändern, nichts davon anwenden würde, um, sagen wir, das xfs-drtiver, die sonst sehr ähnlich.
Noch sollte es. Sie schummeln!. inotify kann nur informieren Sie über änderungen, die aufgetreten sind, durch die vfs auf den eigentlichen mountpoint beobachtet. Wenn die Veränderungen eingetreten sind, die außerhalb der VFS, aufgrund einer änderung der zugrunde liegenden Daten, inotify kann dir nicht helfen und ist nicht entworfen, um dieses problem zu lösen.
Haben Sie sich überlegt über eine message-queue für Netzwerk-Benachrichtigung?
InformationsquelleAutor der Antwort SingleNegationElimination
Fand ich eine SGI FAM mit einem supervisor-daemon zum überwachen von Dateiänderungen. Es unterstützt NFS-und Sie können sehen, einige Beschreibung auf wiki
InformationsquelleAutor der Antwort cmchao
Jeder, der über diese Frage in die Suche nach einer Antwort, warum binden die Montage auf das Andockfenster nicht erkennen, die änderungen einer Datei vom host-Verzeichnis (für heiße Neuladen einer app), es ist, weil die Ausbreitung von änderungen in Dateien zwischen host und container wird nicht mitgeteilt, um der container-kernel.
Nur die änderungen aus dem container selbst ist, kommuniziert der kernel. Lösung dafür ist, Ihre live-reload utility turn on "polling-Modus" anstelle von fsnotify.
InformationsquelleAutor der Antwort Derian Tungka
Ich Stimme mit SingleNegationElimination Erklärung, und möchte hinzufügen, dass der iSCSI-Zielen arbeiten, da Sie alert kernel.
Also Dinge, die auf "echten" Datei-Systemen (bezogen auf das system) wird Inotify trigger zu warnen. Wie Rsync ' Ing, net-catting etwas in eine eingehängte partition.
Wenn Sie haben, um Benachrichtigungen via inotify (oder verwenden inotify) Sie können einen cron, rsync -avz über das Datei-system. Nachteile sind natürlich, dass Sie real system hdd-Speicherplatz.
InformationsquelleAutor der Antwort Richard Tang