Servidor samba de Linux: cifs_mount falló con código de retorno = -12

16

Servidor: RHEL 5.9 / smbd 3.0.33 - Clientes: varios, aunque todos usaban mount.cifs actual (5.2)

Ya resolví este problema, pero fue una pesadilla buscar estos códigos de error. Sentí que necesitaba una documentación universal.

Síntomas : error de montaje impredecible e intermitente de un cliente cifs específico al servidor Linux Samba. Todos mis clientes de Linux pam_mount usuarios de inicio de sesión. Aleatoriamente, y esporádicamente, los montajes del directorio de inicio comenzaron a fallar en una máquina. Los inicios de sesión y las monturas continuaron funcionando perfectamente en todos los demás clientes. Inicialmente, pensé que una cantidad inusual de actividad en el cliente dañado estaba causando que smbd se volviera loco, pero las fallas intermitentes persistieron incluso después de que el uso disminuyó.

Intentar montar a mano falla e informa:

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

Establezca <debug enable="1"/>en /etc/security/pam_mount.conf.xml para obtener más información 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 también informó sobre este evento:

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

'echo 1> / proc / fs / CIFS / cifsFYI' manivelas hasta mount.cifs depuración (escrituras en / var / log / debug). Aquí está la buena parte (¿parece familiar?):

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

En este punto, literalmente, no hay otra información disponible en el lado del cliente. La solicitud de montaje cifs se apaga y el cliente muere casi de inmediato. El error mount.cifs (12) es bastante poco informativo (la página del manual no ayuda, gracias). La búsqueda exhaustiva en Internet revela que este es un código de error común, también lo confirma como poco informativo.

¡Hora de revisar el servidor! Establecido log level = 3para smbd en /etc/samba/smb.conf (del libro Using Samba: "Los niveles superiores a 3 son para uso de los desarrolladores y descargan enormes cantidades de información críptica". ¡Jaja!). Aquí está la línea relevante:

[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

Casi allí ... desde el archivo de la lista de correo smb encontré a alguien que informaba una especie de problema similar, identificado como un límite de compartición vinculado en una conexión smb individual. Enumere los recursos compartidos abiertos en el servidor:

smbstatus -S | grep <serverIP> | wc -lregresó en 2048 . Muy conspicuo.

En realidad, examinando la salida de miles de entradas smbstatus -Sreveladas para 'IPC $'. Los documentos de Samba en IPC $ revelan que está involucrado con la exploración anónima de acciones y el acceso a "algunos otros recursos". Configuré host deny en el servidor en /etc/samba/smb.conf:

[IPC$]
hosts deny = 0.0.0.0/0

Funciona muy bien ahora. Bien, espero que algo aquí ayude a alguna pobre alma en algún momento en el futuro.

Supongo que, en el espíritu del sitio, haré una pregunta: ¿por qué smbd no limpiaría las acciones de IPC $? ¿Por qué establecer una conexión IPC $ por usuario a un recurso compartido en lugar de una por conexión de cliente? ¿Se puede deshabilitar la creación de acciones IPC $ desde el lado del cliente? ¿Hay alguna manera de aumentar el número máximo de conexiones por acción (no es que esto hubiera ayudado en este caso)? No lo vi en los documentos.

zastard
fuente
"Al azar, y esporádicamente", "fallas intermitentes" y los errores de asignación de memoria - ¿las comprobar para errores de memoria (física)?
ckujau
1
Siempre se accede al recurso compartido IPC $ en un contexto por usuario porque es realmente (en el mundo MSFT) una interfaz de llamada a procedimiento remoto (RPC). Es decir, el recurso compartido de IPC $ le da al usuario un canal para autenticarse en el servicio del Servidor de modo que luego pueda realizar llamadas RPC. Es una buena práctica de seguridad deshabilitarlo si no lo necesita (y por cierto, me cuesta creer que alguien lo haga).
Siempre aprendiendo
Gracias por un ejemplo detallado de solución de problemas de samba. Los mensajes de error abstractos son una pesadilla.
mmv-ru

Respuestas:

1

Esto es antiguo, pero teniendo en cuenta que no tiene respuesta y que estaba investigando IPC $ y Samba, lo intentaré por el bien de la documentación.

¿Por qué smbd no limpiaría las acciones de IPC $?

Como se indicó anteriormente en los comentarios a su pregunta, el servicio se usa para la administración remota y la comunicación entre servidores, y particularmente en Samba se usa para algunos propósitos de navegación y tcp / ip. A menos que lo necesite por alguna razón o algo no funcione, es seguro deshabilitarlo. [1]

¿Por qué establecer una conexión IPC $ por usuario a un recurso compartido en lugar de una por conexión de cliente?

Porque un usuario puede tener múltiples conexiones de cliente.

¿Se puede deshabilitar la creación de acciones IPC $ desde el lado del cliente?

Si y no. Realmente no deshabilita la creación del recurso compartido IPC $, pero puede deshabilitar el acceso desde el cliente de Windows. [2]

Para Windows Vista, Windows 7, Windows 8 y Windows 10, puede hacer la siguiente edición del registro:

  1. Haga clic en Inicio, escriba "regedit" en el cuadro Buscar y luego haga clic en regedit.exe en los resultados de búsqueda. Aparece el cuadro de diálogo Control de cuentas de usuario.
  2. Diga "Sí" a la solicitud de UAC y se abrirá el Editor del registro.
  3. Abra la rama HKEY_LOCAL_MACHINE.
  4. Abra la rama del SISTEMA.
  5. Abra la rama CurrentControlSet.
  6. Abra la sucursal de servicios.
  7. Abra la rama LanmanServer.
  8. Seleccione la rama Parámetros.
  9. Seleccione Editar, Nuevo, "Valor DWORD (32 bits)"
  10. Escriba "AutoShareWks" y presione Entrar. (Deje el valor predeterminado de 0.)
  11. Reinicie o reinicie el servicio utilizando un símbolo del sistema (DOS o terminal): "servidor de detención de red" y luego "servidor de inicio de red".

¿Hay alguna manera de aumentar el número máximo de conexiones por acción (no es que esto hubiera ayudado en este caso)? No lo vi en los documentos.

Si: 3]. Debajo del recurso compartido solo ingrese:

[share]
   max connections = ##

Donde XX es el número de conexiones.

Fuentes:

León
fuente