NFS-Client ohne Neustart neu starten

10

Ich habe an meinem Server gearbeitet, von dem ich ein Verzeichnis mit NFS exportiere. Natürlich habe ich im Laufe der Woche nach umountdem Neustart des Servers mehrmals das Export-Dateisystem auf meiner Workstation vergessen (das /etc/fstabbeim Booten bereitgestellt wird ). Zwischendurch konnte ich umountnachträglich und wieder einsteigen (ich benutze nichtautofs ):

umount -fl /data0
mount /data0

Das funktioniert aber nicht mehr.

Ich kann das exportierte Verzeichnis vom Server nicht in einem anderen Verzeichnis mounten (Mount hängt), aber ich kann dieses exportierte Verzeichnis auf einer virtuellen Maschine, die auf meiner Workstation ausgeführt wird, nfs mounten.

Was ich versucht habe, ist ( rmmod) das nfsund nfsv3Modul zu entfernen ( was nicht funktionieren würde :) Resource temporarily unavailable. lsofhängt. mountzeigt nichts an, was über gemountet wurde nfs. Dies alles ist wahrscheinlich ein Ergebnis der mehrfachen Verwendung von 'umount -l', aber die ersten beiden Male funktionierte dies ohne Probleme.

Ich habe den Server in der Zwischenzeit neu gestartet, nachdem ich nicht mounten konnte, ohne dass dies einen Unterschied machte. Ich habe auch verwendet service nfs-kernel-server restart. Ich vermute, dass alles wieder normal ist, wenn ich die Client-Workstation neu starte.

Gibt es eine Möglichkeit, dies zu beheben und die nfs-Clientseite auf meiner Workstation ohne Neustart neu zu initialisieren?
Wenn ich dies nicht ohne Neustart beheben kann, würde dies nicht erneut auftreten, wenn ich mit der Verwendung beginne autofs?

lsof -b hängt mit als letzte Zeile:

lsof: avoiding readlink(/run/user/1001/gvfs): -b was specified.
lsof: avoiding stat(/run/user/1001/gvfs): -b was specified.
lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1001/gvfs
      Output information may be incomplete.

in den Zeilen davor gibt es keine /data0.

Der Eintrag in /etc/fstab:

192.168.0.2:/data0 /data0  nfs  defaults,auto,nolock,user 0 2
Anthon
quelle
"aber die ersten beiden Male hat das problemlos funktioniert" ... erinnert mich an russisches Roulette. Hängt lsof -b?
Muru
@muru Ja, es hängt, ich habe das Q mit der Ausgabe aktualisiert. Übrigens, ich habe noch nie jemanden darüber beschweren hören, dass er beim russischen Roulette verloren hat, also muss es ein Win-Win-Spiel sein. Normalerweise erwarte ich, dass die Dinge nie, einmal oder immer funktionieren, nicht einige Male X-mal, aber vielleicht waren die Umstände anders.
Anthon
Welche Distribution benutzt du? Der Prozess ist sehr unterschiedlich.
Graeme
@ Graeme Dies ist Linix Mint 17.1 (Rebecca)
Anthon
Ich bin mir nicht sicher, wie es in Ubuntu mit upstartund allen funktioniert . Sie möchten wahrscheinlich alle Dienste im nfs-commonPaket neu starten , anscheinend gibt es einige. Die Reihenfolge spielt wahrscheinlich ebenfalls eine Rolle. Versuchen Sie also, anzuhalten und dann in der Reihenfolge der Abhängigkeit zu beginnen. Sie möchten wahrscheinlich auch rpcbindals letzten Stopp / ersten Start tun . Ich habe das schon auf Debian gemacht, aber es hat nur einen netten nfs-commonService.
Graeme

Antworten:

5

Wie @PaperMonkey in den Kommentaren vorgeschlagen hat, sind Sie möglicherweise geschraubt, weil Sie die Standard-Mount-Optionen verwendet haben, zu denen das wiederholte Wiederholen gehört.

intrFrüher war es eine Möglichkeit, das Unterbrechen von Dingen, die an der E / A hängen geblieben waren, auf einem defekten NFS-Mount zu vereinfachen, aber jetzt ist es ein No-Op. SIGKILLkann immer noch Prozesse unterbrechen, die auf NFS hängen bleiben, zumindest nfs(5)behauptet dies. In dieser Manpage finden Sie Mount-Optionen.

Verwenden Sie softanstelle der Standardeinstellung, hardwenn NFS nicht für immer wiederholt werden soll.

Ich empfehle auch die Verwendung des Automounter. Machen Sie irgendwo Symlinks zu / net / host / foo / bar, wenn Sie möchten.

Oft ist es einfacher, einfach neu zu starten, aber ich denke, theoretisch sollten Sie in der Lage sein kill -9(dh kill -KILL) alle Prozesse, die auf NFS hängen bleiben. DANN könnte umount -f funktionieren. Achten Sie nur darauf, dass durch die Tab-Vervollständigung nicht mehr Prozesse auf dem NFS-Mount hängen bleiben.

Peter Cordes
quelle
Theoretisch ist es jedoch schwierig, diese Prozesse zu finden, wenn lsof hängt.
kmarsh
@kmarsh: Jeder Prozess im Status D(Disk-Sleep) in ps / top steckt wahrscheinlich in NFS fest.
Peter Cordes
1
Bitte beachten Sie, dass bei Verwendung von "weich" anstelle von "hart" jedes Mal Daten verloren gehen können, wenn der NFS-Server vorübergehend nicht verfügbar ist.
Marki555
4

Unten finden Sie eine Liste der Befehle, die ausgeführt werden müssen, um dieses Problem in einer RPM-basierten Distribution zu beheben.

service rpcbind stop
service nfslock stop
rm -rf /var/lib/nfs/statd/sm/*
rm -rf /var/lib/nfs/statd/sm.bak/*

Danach:

umount -f /share
zombi_man
quelle
1

Durch autofsdie Verwendung wird dieses Problem in Zukunft vermieden. Der größte Vorteil autofsbesteht darin, dass nicht versucht wird, das Verzeichnis bereitzustellen, bis Sie versuchen, es zu verwenden. Dies bedeutet, dass Sie fehlerhafte Bereitstellungspunkte vermeiden und nicht auf unbestimmte Zeit bereitgestellt werden. Sie können eine Zeitüberschreitung für das Aufheben der Bereitstellung festlegen (was normalerweise der Fall ist) kurz). Ich bin mir nicht sicher, ob Automount während dieser Vorlaufzeit überhaupt erneut versucht wird, aber so oder so habe ich das Automount-Timeout normalerweise auf wenige Sekunden festgelegt.

Um das Problem zu beheben, ohne neu zu starten, können Sie möglicherweise mit umount -a(alle in / etc / fstab genannten) aushängen mount -a(alle in / etc / fstab bereitstellen), aber ich habe, es sei denn, das Verzeichnis, das Sie verloren haben, enthält das Ausgangsverzeichnis, das Sie ' Speichern Sie am besten Arbeit an anderer Stelle und starten Sie sie einfach neu.

Centimane
quelle
0

Verwenden Sie die Ergebnisse des Befehls lsof, um die Prozesse auf dem Client zu finden, die Verweise auf das veraltete Dateisystem enthalten, und beenden Sie diese Prozesse.

umount -f / data0

Stellen Sie sicher, dass Sie den Server anpingen und das Laufwerk erneut bereitstellen können. Starten Sie alle gewünschten Prozesse neu.

Cluster

Hinweis: Wenn Sie ein Cluster-Server-Setup ausführen, erhalten Sie bei jedem Failover des Servers ein veraltetes NFS-Dateihandle. Um dies zu vermeiden, sollten Sie Ihre Dateisysteme mit der Option fsid exportieren. Die Nummer für die fsid sollte für das jeweilige Dateisystem auf den beiden Servern gleich sein. Es liegt an Ihnen, sicherzustellen, dass die Dateien repliziert werden. Siehe den Ausschnitt aus der Manpage unten:

fsid = num | root | uuid NFS muss in der Lage sein, jedes exportierte Dateisystem zu identifizieren. Normalerweise wird eine UUID für das Dateisystem (wenn das Dateisystem so etwas hat) oder die Gerätenummer des Geräts verwendet, auf dem sich das Dateisystem befindet (wenn das Dateisystem auf dem Gerät gespeichert ist). Da nicht alle Dateisysteme auf Geräten gespeichert sind und nicht alle Dateisysteme UUIDs haben, ist es manchmal erforderlich, NFS explizit mitzuteilen, wie ein Dateisystem identifiziert werden soll. Dies erfolgt mit der Option fsid =.

Für NFSv4 gibt es ein unterschiedliches Dateisystem, das das Stammverzeichnis aller exportierten Dateisysteme ist. Dies wird mit fsid = root oder fsid = 0 angegeben, die beide genau dasselbe bedeuten.

Andere Dateisysteme können mit einer kleinen Ganzzahl oder einer UUID identifiziert werden, die 32 hexadezimale Ziffern und beliebige Interpunktion enthalten sollte.

Linux-Kernel Version 2.6.20 und früher verstehen die UUID-Einstellung nicht, daher muss eine kleine Ganzzahl verwendet werden, wenn für solche Kernel eine fsid-Option festgelegt werden muss. Das Festlegen einer kleinen Zahl und einer UUID wird unterstützt, sodass dieselbe Konfiguration für alte und neue Kernel gleichermaßen vorgenommen werden kann.

UDude
quelle
Er sagte bereits, lsof hängt.
kmarsh