Warum unterscheiden sich inotify-Ereignisse auf einem NFS-Mount?

10

Vor einiger Zeit habe ich festgestellt, dass die von inotify gemeldeten Ereignisse unterschiedlich sind, wenn die Datei auf einem NFS-Mount gespeichert wird, im Vergleich zu einem lokalen Dateisystem.

Sollte das zugrunde liegende VFS nicht eine einheitliche Ansicht der Dateivorgänge bieten?

Das Folgende ist die Spur von VIM beim Speichern einer Datei in Debian 7.1 (Linux 3.2).

Auf einem NFS-Mount:

wd=1 mask = 32 (IN_OPEN)
wd=1 mask = 16 (IN_CLOSE_NOWRITE)
wd=1 mask = 2048 (IN_MOVE_SELF)
wd=1 mask = 4 (IN_ATTRIB)
wd=1 mask = 1024 (IN_DELETE_SELF)
wd=1 mask = 32768 )

Auf einem lokalen Dateisystem

wd=1 mask = 32 (IN_OPEN)
wd=1 mask = 16 (IN_CLOSE_NOWRITE)
wd=1 mask = 2 (IN_MODIFY)
wd=1 mask = 32 (IN_OPEN)
wd=1 mask = 8 (IN_CLOSE_WRITE)
wd=1 mask = 4 (IN_ATTRIB)

Das Speichern einer Datei mit EMACS zeigt auch unterschiedliche Verhaltensweisen

Auf einem NFS-Mount:

wd=1 mask = 32 (IN_OPEN)
wd=1 mask = 16 (IN_CLOSE_NOWRITE)
wd=1 mask = 2048 (IN_MOVE_SELF)

Auf einem lokalen Dateisystem:

wd=1 mask = 32 (IN_OPEN)
wd=1 mask = 16 (IN_CLOSE_NOWRITE)
wd=1 mask = 2 (IN_MODIFY)
wd=1 mask = 32 (IN_OPEN)
wd=1 mask = 2 (IN_MODIFY)
wd=1 mask = 8 (IN_CLOSE_WRITE)

Diese Tests wurden mit inotify-touch.c ausgeführt

Eradman
quelle

Antworten:

4

NFS-Unterstützung inotifizieren?

Wenn man sich im Internet umschaut, scheint es, dass inotify NFS unterstützt, jedoch nur in sehr begrenztem Umfang.

Ausstellung 1

Der Grund wird in diesem StackOverflow-Q & A mit dem Titel: Inotify with NFS erläutert .

Auszug aus der akzeptierten Antwort

Inotify benötigt Unterstützung vom Kernel, um zu funktionieren. Wenn eine Anwendung ein Verzeichnis verfolgt, fordert sie den Kernel auf, es zu informieren, wenn diese Änderungen auftreten. Wenn die Änderung auftritt, benachrichtigt der Kernel zusätzlich zum Schreiben dieser Änderungen auf die Festplatte auch den Überwachungsprozess.

Auf einem Remote-NFS-Computer ist die Änderung für den Kernel nicht sichtbar. es passiert ganz aus der Ferne. NFS ist älter als inotify, und es gibt keine Unterstützung auf Netzwerkebene für NFS oder ähnliches.

Exponat Nr. 2

Recherchieren Sie etwas mehr, wenn Sie in den inotify FAQ nachsehen

F: Kann ich sysfs (procfs, nfs ...) sehen?

Einfach gesagt: ja, aber mit einigen Einschränkungen. Diese Einschränkungen variieren zwischen den Kernelversionen und werden tendenziell kleiner. Bitte lesen Sie Informationen zu bestimmten Dateisystemen.

Wird es also unterstützt?

Ich denke, was Sie letztendlich erleben, ist, dass NFS keine Äpfel für Äpfel bereitstellt, die allen Funktionen der lokal gemounteten Dateisysteme entsprechen.

Zum Beispiel aus einem NFS-Linux-Thread :

  • In CIFS sind Benachrichtigungsfunktionen integriert (Oplocks).
  • NFS bietet "Leasingverträge" zur Benachrichtigung an

Der Punkt hier ist, dass alternative Dateisysteme wie CIFS und NFS sehr einfach sind, wenn überhaupt Unterstützung direkt zu inotifizieren.

NFS v4-Status

Auszug aus einem IBM Artikel zum NFS v4-Status

NFS Version 4 bietet dem Client ein Protokoll zum Einrichten oder Wiederherstellen des Status und ordnet den Besitz früherer Statuszustände nachfolgender Serveroperationen zu. Um das Problem mit dem fehlenden Client zu beheben, muss der NFS-Client der Version 4 den Status routinemäßig innerhalb der vom Server angegebenen Lease-Zeit aktualisieren. Nach Ablauf des Lease-Timeouts gibt der Server möglicherweise Ressourcen für den Client frei und stellt sie anderen Anwendungen zur Verfügung.

  • Ein Client erhält das vom Server angegebene Lease-Timeout-Attribut, indem er eine getattr-Operation ausgibt. getattr ist keine zustandsbehaftete Operation, daher muss kein vorheriger Zustand hergestellt werden. Eine getattr-Operation kann einer setclientid- oder setclientid_confirm-Operation vorausgehen.
  • Informationen zum Festlegen und Optimieren von Lease-Zeiträumen finden Sie im Leasetime-Site-Attribut des NFS-Servers. * *
slm
quelle
3
Das OP scheint Ereignisse in NFS zu sehen, sie unterscheiden sich nur von denen, die im lokalen Dateisystem angezeigt werden. Die verknüpfte Frage und Antwort scheint auf ein Fehlen von inotifyEreignissen in NFS hinzuweisen .
iruvar