Linux-Samba-Server: cifs_mount mit Rückkehrcode = -12 fehlgeschlagen


16

Server: RHEL 5.9 / smbd 3.0.33 - Clients: verschiedene, obwohl alle aktuelle mount.cifs (5.2) verwendeten

Ich habe dieses Problem bereits gelöst, aber es war ein Albtraum, diese Fehlercodes aufzuspüren. Ich hatte das Gefühl, dass eine universelle Dokumentation erforderlich ist.

Symptome : Unvorhersehbarer, zeitweise auftretender Mount-Fehler von einem bestimmten cifs-Client auf einen Linux-Samba-Server. Alle meine Linux-Clients pam_mount Benutzerheime bei der Anmeldung. Zufällig und sporadisch versagten die Home-Dir-Reittiere auf einer Maschine. Logins und Mounts funktionierten auf allen anderen Clients weiterhin einwandfrei. Anfangs dachte ich, dass eine ungewöhnliche Menge an Aktivitäten auf dem kaputten Client dazu führte, dass smbd ausfiel, aber zeitweise auftretende Fehler blieben auch nach dem Erlöschen der Nutzung bestehen.

Der Versuch, von Hand zu mounten, schlägt fehl und meldet Folgendes:

Errors from underlying mount program
mount error(12): Cannot allocate memory
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)

<debug enable="1"/>Stellen Sie in /etc/security/pam_mount.conf.xml ein, um weitere Informationen von pam_mount zu erhalten:

command: 'mount' '-t' 'cifs' '//my_server/watdo' '/home/watdo' '-o' 'user=watdo,uid=666,gid=666'
pam_mount(misc.c:38): set_myuid<pre>: (ruid/rgid=0/0, e=0/0)
pam_mount(misc.c:38): set_myuid<post>: (ruid/rgid=0/0, e=0/0)
pam_mount(mount.c:64): Errors from underlying mount program:
pam_mount(mount.c:68): mount error(12): Cannot allocate memory
pam_mount(mount.c:68): Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)`

/var/log/kern.log hat auch über dieses Ereignis berichtet:

kernel: [4316790.256149] CIFS VFS: cifs_mount failed w/return code = -12

'echo 1> / proc / fs / CIFS / cifsFYI' Kurbeln bis mount.cifs debug (Schreiben in / var / log / debug). Hier ist der gute Teil (kommt mir bekannt vor?):

CIFS Session Established successfully
For smb_command 117
Sending smb:  total_len 88
cifs_sync_mid_result: cmd=117 mid=54307 state=4
Mapping smb error code 0xc0000205 to POSIX err -12

Zu diesem Zeitpunkt sind buchstäblich keine weiteren Informationen auf der Client-Seite verfügbar. cifs mount request erlischt und der Client stirbt fast sofort. Der mount.cifs-Fehler (12) ist ziemlich uninformativ (Manpage hilft nicht, Jungs). Ausgiebige Internetrecherchen haben ergeben, dass dies ein häufiger Fehlercode ist, und bestätigen, dass er nicht aussagekräftig ist.

Zeit, auf dem Server zu überprüfen! Set log level = 3für smbd in /etc/samba/smb.conf (aus dem Buch Mit Samba: „Level über 3 sind für die Verwendung durch die Entwickler und Dump enorme Mengen an kryptischen Informationen.“ Lol!). Hier ist die relevante Zeile:

[2013/02/08 10:18:03, 3] smbd/error.c:error_packet_set(106) error packet at smbd/reply.c(514) cmd=117 (SMBtconX) NT_STATUS_INSUFF_SERVER_RESOURCES

Fast da ... aus dem SMB-Mailinglistenarchiv habe ich jemanden gefunden, der ein ähnliches Problem gemeldet hat, das als gebundenes Freigabelimit für eine einzelne SMB-Verbindung identifiziert wurde. Liste offener Freigaben auf dem Server:

smbstatus -S | grep <serverIP> | wc -lkehrte 2048 . Sehr auffällig.

Die Ausgabe von smbstatus -Sergab tatsächlich Tausende von Einträgen für "IPC $". Samba-Dokumente auf IPC $ offenbaren, dass es sich um das anonyme Durchsuchen von Freigaben und den Zugriff auf "einige andere Ressourcen" handelt. Ich habe host deny auf dem Server in /etc/samba/smb.conf eingestellt:

[IPC$]
hosts deny = 0.0.0.0/0

Funktioniert jetzt super. OK, hoffentlich hilft hier etwas einer armen Seele irgendwann in der Zukunft.

Ich schätze, im Geiste der Site werde ich eine Frage stellen: Warum sollte smbd IPC $ -Anteile nicht bereinigen? Warum sollte ein IPC $ pro Benutzerverbindung zu einer Freigabe eingerichtet werden, anstatt einer pro Clientverbindung? Können Sie die Erstellung von IPC $ -Freigaben auf der Clientseite deaktivieren? Gibt es eine Möglichkeit, die maximale Anzahl von Verbindungen pro Aktie zu erhöhen (nicht, dass dies in diesem Fall geholfen hätte)? Ich habe es nicht in den Dokumenten gesehen.


„Zufällig, und sporadisch“, „intermittierende Ausfälle“ und Speicherzuordnungsfehler - haben Sie überprüfen für (physischen) Speicherfehler?
ckujau

1
Auf die IPC $ -Freigabe wird immer im Benutzerkontext zugegriffen, da es sich in der MSFT-Welt tatsächlich um eine RPC-Schnittstelle (Remote Procedure Call) handelt. Das heißt, die IPC $ -Freigabe gibt einem Benutzer einen Kanal, über den er sich beim Serverdienst authentifizieren kann, damit er RPC-Aufrufe an ihn senden kann. Es ist eine gute Sicherheitspraxis, es zu deaktivieren, wenn Sie es nicht benötigen (und es fällt mir schwer, zu glauben, dass dies jemand tut).
AlwaysLearning

Vielen Dank für ein detailliertes Beispiel zur Fehlerbehebung bei Samba. Abstrakte Fehlermeldungen sind Alptraum.
mmv-ru

Antworten:


1

Dies ist ein Oldie, aber da es unbeantwortet ist und ich IPC $ und Samba untersucht habe, werde ich es versuchen, um die Dokumentation zu verbessern.

Warum sollte smbd IPC $ Shares nicht bereinigen?

Wie bereits in den Kommentaren zu Ihrer Frage erwähnt, wird der Dienst für die Remoteverwaltung und die Kommunikation zwischen Servern verwendet. Insbesondere in Samba wird er für einige Browsing- und TCP / IP-Zwecke verwendet. Wenn Sie es aus irgendeinem Grund brauchen oder etwas nicht funktioniert, können Sie es sicher deaktivieren. [1]

Warum sollte ein IPC $ pro Benutzerverbindung zu einer Freigabe eingerichtet werden, anstatt einer pro Clientverbindung?

Weil ein Benutzer mehrere Clientverbindungen haben kann.

Können Sie die Erstellung von IPC $ -Freigaben auf der Clientseite deaktivieren?

Ja und nein. Die Erstellung der IPC $ -Freigabe wird nicht wirklich deaktiviert, aber Sie können den Zugriff vom Windows-Client aus deaktivieren. [2]

Für Windows Vista, Windows 7, Windows 8 und Windows 10 können Sie folgende Registrierungsänderungen vornehmen:

  1. Klicken Sie auf Start, geben Sie "regedit" in das Suchfeld ein und klicken Sie dann in den Suchergebnissen auf regedit.exe. Das Dialogfeld Benutzerkontensteuerung wird angezeigt.
  2. Sagen Sie der UAC-Eingabeaufforderung "Ja", und der Registrierungseditor sollte geöffnet werden.
  3. Öffnen Sie den Zweig HKEY_LOCAL_MACHINE.
  4. Öffnen Sie den Zweig SYSTEM.
  5. Öffnen Sie den Zweig CurrentControlSet.
  6. Öffnen Sie den Zweig Dienste.
  7. Öffnen Sie den LanmanServer-Zweig.
  8. Wählen Sie den Zweig Parameter.
  9. Wählen Sie "Bearbeiten", "Neu", "DWORD-Wert (32-Bit)".
  10. Geben Sie "AutoShareWks" ein und drücken Sie die Eingabetaste. (Behalten Sie den Standardwert von 0 bei.)
  11. Starten Sie den Dienst über eine Eingabeaufforderung (DOS oder Terminal) neu oder starten Sie ihn neu: "net stop server", dann "net start server".

Gibt es eine Möglichkeit, die maximale Anzahl von Verbindungen pro Aktie zu erhöhen (nicht, dass dies in diesem Fall geholfen hätte)? Ich habe es nicht in den Dokumenten gesehen.

Ja: 3]. Unterhalb der gerade eingegebenen Freigabe:

[share]
   max connections = ##

Wobei XX die Anzahl der Verbindungen ist.

Quellen:

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.