Serveur Samba Linux: échec de cifs_mount avec code retour = -12

16

Serveur: RHEL 5.9 / smbd 3.0.33 - Clients: divers, bien que tous utilisent le fichier mount.cifs actuel (5.2)

J'ai déjà résolu ce problème, mais c'était un tel cauchemar de traquer ces codes d'erreur que j'avais l'impression qu'il fallait une documentation universelle.

Symptômes : échec de montage imprévisible et intermittent d'un client cifs spécifique au serveur Linux Samba. Tous mes clients linux pam_mount résident à la connexion. De façon aléatoire et sporadique, les montages du répertoire d'origine ont commencé à échouer sur une machine. Les connexions et les montages ont continué de fonctionner parfaitement sur tous les autres clients. Au début, je pensais qu'une quantité inhabituelle d'activité sur le client cassé faisait flipper smbd, mais des échecs intermittents persistaient même après la fin de l'utilisation.

La tentative de montage manuel échoue et signale:

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

Définissez <debug enable="1"/>dans /etc/security/pam_mount.conf.xml pour obtenir plus d'informations de pam_mount:

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 a également rendu compte de cet événement:

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

'echo 1> / proc / fs / CIFS / cifsFYI' pédaliers jusqu'à mount.cifs debug (écrit / var / log / debug). Voici la bonne partie (regardez familier?):

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

À ce stade, il n'y a littéralement aucune autre information disponible du côté client. la demande de montage cifs s'éteint et le client meurt presque immédiatement. L'erreur de mount.cifs (12) est assez peu informative (la page de manuel n'aide pas, les gars). Des recherches approfondies sur Internet révèlent qu'il s'agit d'un code d'erreur courant, ce qui confirme également qu'il n'est pas informatif.

Il est temps de vérifier sur le serveur! Définissez log level = 3pour smbd dans /etc/samba/smb.conf ( à partir du manuel Utilisation de Samba: « Les niveaux supérieurs 3 sont pour une utilisation par les développeurs et déversent d' énormes quantités d'informations cryptique. » Lol!). Voici la ligne pertinente:

[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

Presque là ... à partir des archives de la liste de diffusion smb, j'ai trouvé quelqu'un signalant une sorte de problème similaire, identifié comme une limite de partage liée à une connexion smb individuelle. Liste des partages ouverts sur le serveur:

smbstatus -S | grep <serverIP> | wc -lretourné 2048 . Très visible.

Examine actuellement la sortie de milliers d'entrées smbstatus -Srévélées pour «IPC $». Les documents de Samba sur IPC $ révèlent qu'il est impliqué dans la navigation de partage anonyme et l'accès à "d'autres ressources". J'ai défini le refus d'hôte sur le serveur dans /etc/samba/smb.conf:

[IPC$]
hosts deny = 0.0.0.0/0

Fonctionne très bien maintenant. OK, j'espère que quelque chose ici aidera une pauvre âme dans le futur.

Je suppose que dans l'esprit du site, je vais poser une question: pourquoi smbd ne nettoierait-il pas les actions IPC $? Pourquoi établir un IPC $ par connexion utilisateur à un partage plutôt qu'un par connexion client? Pouvez-vous désactiver la création de partage IPC $ du côté client? Existe-t-il un moyen d'augmenter le nombre maximal de connexions par partage (pas que cela aurait aidé dans ce cas)? Je ne l'ai pas vu dans les documents.

zastard
la source
"Aléatoire et sporadique", "échecs intermittents" et erreurs d'allocation de mémoire - avez-vous vérifié les erreurs de mémoire (physiques)?
ckujau
1
Le partage IPC $ est toujours accessible dans un contexte par utilisateur car il s'agit vraiment (dans le monde MSFT) d'une interface d'appel de procédure à distance (RPC). C'est-à-dire que le partage IPC $ donne à un utilisateur un canal pour s'authentifier auprès du service Serveur afin qu'il puisse ensuite lui faire des appels RPC. C'est une bonne pratique de sécurité de le désactiver si vous n'en avez pas besoin (et j'ai du mal à croire que quelqu'un le fasse).
AlwaysLearning
Merci pour l'exemple détaillé de dépannage de samba. Les messages d'erreur abstraits sont un cauchemar.
mmv-ru

Réponses:

1

Ceci est un ancien, mais étant donné qu'il est sans réponse et que je cherchais dans IPC $ et Samba, je vais essayer pour la documentation.

Pourquoi smbd ne nettoierait-il pas les actions IPC $?

Comme indiqué ci-dessus dans les commentaires de votre question, le service est utilisé pour l'administration et la communication à distance entre les serveurs, et en particulier dans Samba, il est utilisé à des fins de navigation et de tcp / ip. Sauf si vous en avez besoin pour une raison quelconque ou si quelque chose ne fonctionne pas, vous pouvez le désactiver en toute sécurité. [1]

Pourquoi établir un IPC $ par connexion utilisateur à un partage plutôt qu'un par connexion client?

Parce qu'un utilisateur peut avoir plusieurs connexions client.

Pouvez-vous désactiver la création de partage IPC $ du côté client?

Oui et non. Il ne désactive pas vraiment la création du partage IPC $, mais vous pouvez désactiver l'accès à celui-ci à partir du client Windows. [2]

Pour Windows Vista, Windows 7, Windows 8 et Windows 10, vous pouvez effectuer la modification de registre suivante:

  1. Cliquez sur Démarrer, tapez «regedit» dans la zone de recherche, puis cliquez sur regedit.exe dans les résultats de la recherche. La boîte de dialogue Contrôle de compte d'utilisateur apparaît.
  2. Dites «Oui» à l'invite UAC et l'éditeur de registre devrait s'ouvrir.
  3. Ouvrez la branche HKEY_LOCAL_MACHINE.
  4. Ouvrez la branche SYSTEM.
  5. Ouvrez la branche CurrentControlSet.
  6. Ouvrez la branche Services.
  7. Ouvrez la branche LanmanServer.
  8. Sélectionnez la branche Paramètres.
  9. Sélectionnez Modifier, Nouveau, «Valeur DWORD (32 bits)»
  10. Tapez "AutoShareWks" et appuyez sur Entrée. (Laissez la valeur par défaut de 0.)
  11. Redémarrez ou redémarrez le service à l'aide d'une invite de commande (DOS ou terminal): «net stop server» puis «net start server».

Existe-t-il un moyen d'augmenter le nombre maximal de connexions par partage (pas que cela aurait aidé dans ce cas)? Je ne l'ai pas vu dans les documents.

Oui [3]. En dessous du partage, entrez simplement:

[share]
   max connections = ##

Où XX est le nombre de connexions.

Sources:

Leo
la source