"Veraltete NFS-Dateizugriffsnummer" nach dem Neustart


16

Auf dem Serverknoten kann auf einen exportierten Ordner zugegriffen werden. Nach einem Neustart (sowohl auf dem Server als auch auf dem Client) können die Clients nicht mehr auf den Ordner zugreifen.

Auf dem Server

# ls /data
Folder1
Forlder2

und die Datei / etc / exports enthält

/data 192.168.1.0/24(rw,no_subtree_check,async,no_root_squash)

Auf dem Client

# ls /data
ls: cannot access /data: Stale NFS file handle

Ich muss sagen, dass es kein Problem mit dem freigegebenen Ordner von Client-Seite gab, aber nach Neustarts (Server und Client) sehe ich diese Meldung.

Irgendeine Möglichkeit, das zu beheben?

Antworten:


22

Die Reihenfolge der Neustarts ist wichtig. Ein Neustart des Servers nach dem Ausführen der Clients kann zu dieser Situation führen. Das veraltete NFS-Handle zeigt an, dass auf dem Client eine Datei geöffnet ist, der Server das Dateihandle jedoch nicht mehr erkennt. In einigen Fällen bereinigt NFS seine Datenstrukturen nach einer Zeitüberschreitung. In anderen Fällen müssen Sie die NFS-Datenstrukturen selbst bereinigen und NFS anschließend neu starten. Wo sich diese Strukturen befinden, hängt in gewissem Maße vom Betriebssystem ab.

Versuchen Sie, NFS zuerst auf dem Server und dann auf den Clients neu zu starten. Das kann die Dateizugriffsnummern löschen.

Das Neustarten von NFS-Servern mit Dateien, die von anderen Servern geöffnet wurden, wird nicht empfohlen. Dies ist besonders problematisch, wenn die geöffnete Datei auf dem Server gelöscht wurde. Der Server kann die Datei geöffnet lassen, bis er neu gestartet wird. Durch den Neustart wird jedoch das In-Memory-Datei-Handle auf der Serverseite entfernt. Dann kann der Client die Datei nicht mehr öffnen.

Es ist schwierig und unzuverlässig, festzustellen, welche Bereitstellungen vom Server verwendet wurden. Die showmount -aOption zeigt möglicherweise einige aktive Reittiere an, meldet jedoch möglicherweise nicht alle. Gesperrte Dateien sind leichter zu identifizieren, erfordern jedoch die Aktivierung der Sperre und hängen von der Client-Software ab, um die Dateien zu sperren.

Sie können lsofauf den Clients die Prozesse identifizieren, bei denen Dateien auf den Bereitstellungen geöffnet sind.

Ich verwende die Optionen hardund intrmount auf meinen NFS-Mounts. Die hardOption bewirkt, dass die E / A auf unbestimmte Zeit wiederholt wird. Mit dieser intrOption können Prozesse abgebrochen werden, wenn sie auf den Abschluss von NFS IO warten.


Verwenden hard, intrist ein guter Rat. Beachten Sie jedoch, dass NFS die Zeitüberschreitungen bei jedem Versuch verdoppelt. Also am besten einstellen timeo=1und retrans=5oder so. Beachten Sie, dass dies wird nach NFS Neustart schwere Belastung für den NFS - Server setzen. Versuche nicht so oft deinen NFS-Dienst neu zu starten;)
bjanssen

Deine Antwort ist richtig. Ich habe auch eine andere einfache Lösung gefunden. Hängen Sie den Ordner auf dem Knoten mit dem Status "Veralteter NFS-Handler" um und stellen Sie ihn erneut bereit.
Mahmood

4

Probieren Sie dieses Skript aus, das ich geschrieben habe:

#!/bin/bash
# Purpose:
# Detect Stale File handle and remove it
# Script created: July 29, 2015 by Birgit Ducarroz
# Last modification: --
#

# Detect Stale file handle and write output into a variable and then into a file
mounts=`df 2>&1 | grep 'Stale file handle' |awk '{print ""$2"" }' > NFS_stales.txt`
# Remove : ‘ and ’ characters from the output
sed -r -i 's/://' NFS_stales.txt && sed -r -i 's/‘//' NFS_stales.txt && sed -r -i 's/’//' NFS_stales.txt

# Not used: replace space by a new line
# stales=`cat NFS_stales.txt && sed -r -i ':a;N;$!ba;s/ /\n /g' NFS_stales.txt`

# read NFS_stales.txt output file line by line then unmount stale by stale.
#    IFS='' (or IFS=) prevents leading/trailing whitespace from being trimmed.
#    -r prevents backslash escapes from being interpreted.
#    || [[ -n $line ]] prevents the last line from being ignored if it doesn't end with a \n (since read returns a non-zero exit code when it encounters EOF).

while IFS='' read -r line || [[ -n "$line" ]]; do
    echo "Unmounting due to NFS Stale file handle: $line"
    umount -fl $line
done < "NFS_stales.txt"
#EOF

2

Auf dem NFS-Server können Sie das Dateisystem UN-exportieren und erneut exportieren:

exportfs -u nfs-server: / dateisystem exportfs nfs-server: / dateisystem

Hängen Sie auf dem Client das Dateisystem ein

mount -t nfs nfs-server: / filesystem / mount_point


0

Überprüfen Sie die lsof des spezifischen Pfades und töten Sie die entsprechende pid. Hängen Sie dann die Partition aus und stellen Sie sie wieder her.


Dies ist eher eine Problemumgehung als eine Lösung für das in der Frage angegebene Problem.
Samstag,
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.