
Dieses Problem hat mich verrückt gemacht.
Ich habe einen NFS-Server mit NFS-Freigaben, die auf verschiedenen Clients gemountet sind. Wenn ich den NFS-Server jedoch neu starten muss, erhalte ich ausnahmslos eine Reihe von „Stale File Handle“-Fehlern bei den Mounts auf allen meinen Clients, was mich dazu zwingt, meine NFS-Freigaben auf den Clients manuell zu demontieren und erneut zu mounten.
Ich habe meine Exporte auf meinem NFS-Server überprüft cat /etc/exports
und übergebe für jeden NFS-Export über Neustarts hinweg dieselbe FID.
Meine Fragen:
- Wie geht die Industrie mit diesem Problem um? Ich kann mir kaum vorstellen, dass Systemadministratoren jeden Client manuell aushängen/neu einhängen oder einfach alle verbundenen Clients en masse neu starten. Oder wird das wirklich so gehandhabt? (Abgesehen von der Standardangabe „Wir haben nie Ausfallzeiten und müssen NFS-Server nie neu starten.“)
- Warum passiert das? Liegt es daran, dass der NFS-Server Dateihandles neu berechnet, die bei Neustarts möglicherweise nicht gleich sind, obwohl die FSID dieselbe ist?
- Gibt es etwas, das ich in meiner Mount-Konfiguration besser machen sollte, um dies zu verhindern?
/etc/fstab:
[NFSserver]:/mnt/backup /mnt/backup nfs bg,nfsvers=3,tcp 0 0
Prodieser Beitraghard
wurde vorgeschlagen, Mount - Optionen hinzuzufügen intr
, aber das scheint keinen Unterschied gemacht zu haben.
- Wenn alles andere fehlschlägt, sollte ich dann einfach auf die Verwendung eines Bash-Skripts zurückgreifen, um das Mount/Verzeichnis auf einen Fehler aufgrund einer veralteten Datei zu überwachen und einen Umount/Mount-Zyklus ausführen zu lassen?
Dank im Voraus.
-Drehmomentschlüssel
Antwort1
Sie verwenden NFS Version 3, die neben dem NFS-Hauptdienst auf Port 2049 mehrere Hilfsdienste benötigt. Einer davon ist rpc.statd
, der eine Schlüsselrolle beim Erkennen von Neustarts und beim Wiederherstellen/Löschen von NFS-Sperren nach einem Neustart spielt.
Diese Hilfsdienste können sich in zufälligen Ports befinden und werden durch Kontaktaufnahme mit dem RPC-Port-Mapper ( rpcbind
in modernen Linux-Versionen normalerweise ein Prozess mit dem Namen) entdeckt. In modernen Netzwerken mit Firewalls kann ein solches Verhalten die Dinge erschweren: Auch wenn Sie sie nach einem Neustart in deterministisch aussehenden Ports finden, werden sie möglicherweise ganz anderen Portnummern zugewiesen, wenn Sie die NFS-Dienste neu starten.
Glücklicherweise können Sie auf vielen modernen Unix-ähnlichen Systemen die Portnummern des NFS-Sperrmanagers (früher rpc.lockd
, heutzutage normalerweise im Kernel implementiert) sperren rpc.statd
und rpc.mountd
. Dies ist wichtig, wenn Sie NFSv3 einigermaßen zuverlässig durch Firewalls bringen möchten.
Für RHEL und verwandte Distributionen können Sie die NFS-Hilfsportnummern sperren, indem Sie die folgenden Zeilen hinzufügen /etc/sysconfig/network
:
LOCKD_TCPPORT=4045
LOCKD_UDPPORT=4045
STATD_PORT=4046
MOUNTD_PORT=4047
Für Debian und verwandte Distributionen können Sie folgende Zeile hinzufügen /etc/modprobe.d/nfs.conf
:
options lockd nlm_udpport=4045 nlm_tcpport=4045
... und diese Zeile in /etc/default/nfs-common
:
STATDOPTS="-p 4046"
... und diese Zeile in /etc/default/nfs-kernel-server
:
RPCMOUNTDOPTS="-p 4047" # you may want to add a --manage-gids option here
(Sie können bei Bedarf andere Portnummern verwenden, aber 4045 ist der Standardport für den NFSv3-Sperrmanager in Solaris und in HP-UX 11.31 fest codiert.)
Das NFSv3-Protokoll birgt jedoch noch eine weitere Tücke. Obwohl Sie eine NFS-Freigabe erfolgreich nur mit IP-Adressen mounten können, verwendet das NFSv3-Sperrprotokoll intern Hostnamen. Sowohl Client als auch Server müssen sich unter den richtigen Namen kennen, sonst funktionieren die NFS-Dateisperre und die Sperrwiederherstellung nach einem Neustart nicht. Und der „richtige Name“ für jedes System ist der von gemeldete Name uname -n
.
Wenn also auf dem Server bzw. auf dem Client uname -n
zurückgegeben wird , sollten Sie sicherstellen, dass diese genauen Namen in die IP-Adressen aufgelöst werden, die die Hosts für NFS verwenden müssen. Mit anderen Worten: Der Server muss in der Lage sein, den Client über den Namen zu kontaktieren und umgekehrt.server.example
client.example
rpc.statd
client.example
Wenn Sie dies nicht tun, scheint zunächst alles reibungslos zu funktionieren. Beim Neustart an einem der beiden Enden können jedoch diese Stale file handle
Fehler auftreten.
Antwort2
Zusätzlich zu der hervorragenden Antwort von @telcoM möchte ich zwei weitere mögliche Lösungen vorschlagen:
mounten Sie nfs mit der
noac
Option (beachten Sie, dass diesWillekann zu einem Leistungsverlust führen, wenn die Ausgabels
auf einem großen Verzeichnis oderstat
auf vielen Dateien erfolgt)verwenden Sie NFS v4.1 (v4.0 hatte einige Fehler, die zu einer „veralteten Dateibehandlung“ führten; wählen Sie daher unbedingt das v4.1-Protokoll aus).