Linux: CIFS / Samba-Mount bleibt einige Minuten lang hängen

26

Ich habe ein kleines lokales Netzwerk, das eine Gentoo-Box und eine Windows-Box hat. Ich mounte eine Freigabe von der Windows-Box auf die Gentoo-Box mit einem Befehl wie:

mount -t cifs -o username=WindowsUsername,password=thepassword,uid=pistos //192.168.0.103/Users /mnt/windowsbox

Meistens funktioniert einfach alles und ich kann problemlos lesen und schreiben. Alle paar Wochen oder so scheint die Verbindung oder der Bereitstellungspunkt nicht mehr zu funktionieren oder zu hängen, sodass jeder Prozess, der versucht, auf den Bereitstellungspunkt zuzugreifen, im Status D hängen bleibt (Datenträger oder E / A-Wartezeit). Diese Prozesse werden für TERM- und KILL-Signale undurchlässig. Trennen und erneutes Verbinden der Windows-Box vom Netzwerk hilft nicht. Der gefrorene Zustand dauert 5+ Minuten. Es ist sehr frustrierend und stört die normale Arbeit, da es Dialoge, lsBefehle usw. zum Speichern unter einfriert . Wenn ich umountam Mount-Punkt ein ausstelle , hängt es entweder auch oder meldet, dass der Mount-Punkt verwendet wird. Schließlich löst sich der tote Zustand von selbst auf, und der Mount-Punkt wird nicht gemountet, oder es wird möglich, umountohne Verzögerung.

Ich vermute, dass dies passiert, wenn die Verbindung / Bereitstellung inaktiv war oder wenn der Windows-Computer inaktiv war. Ich bin mir nicht ganz sicher.

Warum passiert das und was kann ich tun, um es zu verhindern? Oder wie kann ich diese D-State-Prozesse nach Belieben erfolgreich beenden?

Möglicherweise verwandt: CIFS-Halterungen hängen beim Lesen

Pistos
quelle
1
Werden zwischen den beiden Computern Firewalls verwendet?
Schrute
@Schrute: Ich gehe davon aus, dass die Standardeinstellungen unter Linux (iptables?) Und Windows ausgeführt werden. Sie denken, die Firewalls überschreiten das Zeitlimit für Verbindungen? Ich hatte noch nie so etwas gehört.
Pistos
Ich denke, das könnte ein Problem der Linux-Box sein. Ich habe ein ähnliches Problem festgestellt - nicht bei CIFS und Windows - sondern bei einer gemounteten NFS-Freigabe. Speichern war nicht möglich - ich denke, weil ein Prozess beim Zugriff auf den nicht vorhandenen NFS-Server hängen bleibt. Dies geschah normalerweise, wenn der Server abstürzte.
Cornelinux
1
Mein Rat ist, eine Ringpuffer-Netzwerkerfassung auf dem Linux-Computer einzurichten (dh tcpdump -i eth0 -C 5 -W 10 -s 0 -v -w /tmp/cifs.pcap host 192.168.0.103 - ich würde auch ausführen es unter dem Bildschirm, um zu verhindern, dass der Prozess beendet wird, wenn Sie die Verbindung trennen). Wenn das Problem auftritt, stoppen Sie die Ablaufverfolgung nach einigen Sekunden und Sie sollten zumindest feststellen können, welche Seite das Problem verursacht, wenn Sie die Paketablaufverfolgung überprüfen (dh der Server reagiert nicht mehr, die Sitzung wird getrennt usw.).
GeekyDeaks
1
@Pistos - Wireshark ist dein Freund! Die Spuren können verwirrend aussehen, aber wireshark decodiert die Frames, um zu helfen. Sie wollen zunächst die Grundlagen zu beseitigen, wie der Server oder Client die Sitzung (FIN - Pakete) fällt, dann auf andere Fortschritte wie reagierten Server nicht mehr etc. Wenn Sie Zeit haben , ein sharkfest Video im Jahr 2013 auf CIFS war ( youtube.com/watch v = XbvFXSPig-w ) aber es ist ziemlich lang :)
GeekyDeaks

Antworten:

11

Sie sind sich nicht sicher, warum das Problem auftritt, haben Sie jedoch als Workaround versucht, jede Minute so etwas wie " Cron" touch /mnt/windowsbox/keepalive.txtoder " echo "I am still alive." >/mnt/windowsbox/keepalive.txtCron" auszuführen? Auf diese Weise sollte die Verbindung aktiv bleiben.

Janne Pikkarainen
quelle
Gute Idee. Ich habe dies eingerichtet und werde sehen, was passiert.
Pistos
2
Dies scheint das Problem gelöst zu haben, sollte ich erwähnen.
Pistos
Schön das zu hören!
Janne Pikkarainen
1
Laut der Antwort von @ Pat könnte man dies von einem Herzschlag pro Minute auf einen Herzschlag alle 5 Minuten (300 Sekunden) */5 * * * *
verkürzen
Ich benutze das jetzt. Innerhalb von 3 Tagen mussten drei separate Ubuntu Server 16 LTS-Maschinen (zwei physische und eine VM) nach einigen Stunden Neustart ihre SMB-Verbindungen trennen. Beim Start wird die SMB-Verbindung problemlos bereitgestellt, reagiert jedoch schließlich nicht mehr.
user38537
0

Eine weitere mögliche Antwort war das regelmäßige Schreiben in eine Datei auf dem Mount über cron. Ich würde stattdessen vorschlagen, das smbclient-Programm zu verwenden, um eine Verbindung zur Freigabe herzustellen und die Verbindung zu trennen.

Ich habe ein solches Bash-Skript geschrieben, um dies zu erreichen:

#!/bin/bash

su usernamehere -c "smbclient \\\\\\\\\\\\\\\\servernamehere\\\\\\\\sharenamehere passwordhere -c exit" >/dev/null 2>&1

Dieser Befehl stellt eine neue Verbindung zur Freigabe her und führt dann den Befehl exit aus, wodurch die soeben in der Befehlszeile hergestellte Verbindung sofort beendet wird. Es sollten 8 Schrägstriche vor dem Servernamen und 4 vor dem Freigabenamen stehen, da umgekehrte Schrägstriche maskiert werden müssen und die Maskierungen maskiert werden müssen, wenn sie sich in einer Zeichenfolge in doppelten Anführungszeichen befinden. Vielleicht gibt es eine intelligentere Möglichkeit, dies zu tun, aber dies scheint zu funktionieren.

Vielleicht gibt es eine Möglichkeit, dies noch zuverlässiger zu machen, indem die Verbindung mehrere Minuten lang offen gehalten wird, aber das ist etwas außerhalb meiner Liga.

RedScourge
quelle
Interessanter Vorschlag. Ich hätte es ausprobiert, wenn ich mit der anderen Lösung noch keinen Erfolg gehabt hätte.
Pistos
Ich verstehe nicht, wie das hilfreich wäre? Jannes Lösung wäre, die vom cifs-Client hergestellte Verbindung am Leben zu erhalten, während dies eine neue, nicht verwandte Verbindung zum smbclient schaffen würde - wie würde es also helfen?
Flungo
1
Zu Ihrer Information, smbclient unterstützt Schrägstriche, wenn Sie sie anstelle von Backslashes verwenden möchten. Dies //servername/sharnameist viel einfacher an Orten, an denen Sie viel Flucht benötigen.
Steve Friedl