it-swarm.com.de

"Veraltetes NFS-Dateihandle" nach dem Neustart

Auf dem Serverknoten kann auf einen exportierten Ordner zugegriffen werden. Nach einem Neustart (sowohl Server als auch Client) ist der Ordner für die Clients jedoch nicht mehr zugänglich.

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 auf Clientseite kein Problem mit dem freigegebenen Ordner gab. Nach einem Neustart (Server und Client) wird diese Meldung angezeigt.

Wie kann man das beheben?

16
mahmood

Die Reihenfolge der Neustarts ist wichtig. Ein Neustart des Servers nach den 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 anschließend NFS neu starten. Wo sich diese Strukturen befinden, ist etwas O/S-abhängig.

Versuchen Sie, NFS zuerst auf dem Server und dann auf den Clients neu zu starten. Dadurch werden möglicherweise die Dateihandles gelöscht.

Ein Neustart 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 bis zum Neustart geöffnet lassen, beim Neustart wird jedoch das speicherinterne Dateihandle auf der Serverseite entfernt. Dann kann der Client die Datei nicht mehr öffnen.

Es ist schwierig und unzuverlässig festzustellen, welche Mounts vom Server verwendet wurden. Die Option showmount -a Zeigt möglicherweise einige aktive Bereitstellungen an, meldet jedoch möglicherweise nicht alle. Gesperrte Dateien sind leichter zu identifizieren, erfordern jedoch die Aktivierung der Sperrung und sind zum Sperren der Dateien auf die Client-Software angewiesen.

Sie können lsof auf den Clients verwenden, um die Prozesse zu identifizieren, bei denen Dateien auf den Bereitstellungen geöffnet sind.

Ich verwende die Mount-Optionen hard und intr für meine NFS-Mounts. Die Option hard bewirkt, dass IO auf unbestimmte Zeit wiederholt wird. Mit der Option intr können Prozesse beendet werden, wenn sie auf den Abschluss von NFS IO warten.

22
BillThor

Versuchen Sie dieses Skript, 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
4
Birgit Ducarroz

Auf dem NFS-Server das Dateisystem UN-exportieren und erneut exportieren:

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

Mounten Sie auf dem Client das Dateisystem

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

2
Chin

überprüfen Sie den spezifischen Pfad und töten Sie die entsprechende PID. Hängen Sie dann die Partition aus und mounten Sie sie wieder.

0
sridhar gattu