Linux samba 服务器:cifs_mount 失败,返回代码 = -12

zas*_*ard 16 mount server-message-block cifs pam smb-conf

服务器:RHEL 5.9 / smbd 3.0.33 - 客户端:各种,但都使用当前的 mount.cifs (5.2)

我已经解决了这个问题,但是追查这些错误代码真是一场噩梦,我觉得它需要通用文档。

症状:从一个特定的 cifs 客户端到 linux samba 服务器的不可预测的间歇性安装失败。我所有的 linux 客户端 pam_mount 用户都在登录时回家。随机地,偶尔地,家庭目录安装开始在台机器上失败。登录和挂载继续在所有其他客户端上完美运行。最初我认为损坏的客户端上异常数量的活动导致 smbd 异常,但即使在使用停止后间歇性故障仍然存在。

尝试手动挂载失败并报告:

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

<debug enable="1"/>在 /etc/security/pam_mount.conf.xml 中设置以从 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)`
Run Code Online (Sandbox Code Playgroud)

/var/log/kern.log 也报告了这个事件:

kernel: [4316790.256149] CIFS VFS: cifs_mount failed w/return code = -12
Run Code Online (Sandbox Code Playgroud)

'回声1>的/ proc / FS / CIFS / cifsFYI'曲柄向上mount.cifs调试(写入到/ var /日志/调试)。这是好的部分(看起来很熟悉?):

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
Run Code Online (Sandbox Code Playgroud)

此时,客户端实际上没有其他可用信息。cifs 挂载请求消失,客户端几乎立即死亡。mount.cifs 错误(12) 的信息非常少(手册页没有帮助,谢谢伙计们)。广泛的互联网搜索表明这是一个常见的错误代码,也证实它没有提供信息。

是时候检查服务器了!log level = 3在 /etc/samba/smb.conf 中为 smbd设置(来自 Using Samba 一书:“级别高于 3 供开发人员使用并转储大量神秘信息。”哈哈!)。这是相关的行:

[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

差不多了……从smb 邮件列表存档中,我发现有人报告了一种类似的问题,确定为单个 smb 连接的固定共享限制。列出服务器上的打开共享:

smbstatus -S | grep <serverIP> | wc -l返回2048。很显眼。

实际检查的输出smbstatus -S显示了 'IPC$' 的数千个条目。IPC$ 上的 Samba 文档显示它涉及匿名共享浏览和对“一些其他资源”的访问。我在 /etc/samba/smb.conf 中的服务器上设置主机拒绝:

[IPC$]
hosts deny = 0.0.0.0/0
Run Code Online (Sandbox Code Playgroud)

现在效果很好。好的,希望这里的一些东西在未来的某个时候能帮助一些可怜的灵魂。

我想本着网站的精神我会问一个问题:为什么 smbd 不清理 IPC$ 共享?为什么要为每个用户连接建立一个到共享的 IPC$ 而不是每个客户端连接一个?您可以从客户端禁用 IPC$ 共享创建吗?有没有办法增加每个共享的最大连接数(在这种情况下这不会有帮助)?我没有在文档中看到它。

Leo*_*Leo 1

这是一个老问题,但考虑到它没有得到解答,而且我正在研究 IPC$ 和 Samba,为了文档的目的,我会尝试一下。

\n\n
\n

为什么 smbd 不清理 IPC$ 份额?

\n
\n\n

正如上面对您的问题的评论中所述,该服务用于服务器之间的远程管理和通信,特别是在 Samba 中,它用于某些浏览和 tcp/ip 目的。除非您出于某种原因需要它或某些东西不起作用,否则禁用它是安全的。[1]

\n\n
\n

为什么为每个用户连接建立一个 IPC$ 到共享而不是为每个客户端连接建立一个 IPC$?

\n
\n\n

因为一个用户可以有多个客户端连接。

\n\n
\n

您可以从客户端禁用 IPC$ 共享创建吗?

\n
\n\n

是和不是。它并没有真正禁用 IPC$ 共享的创建,但您可以禁用从 Windows 客户端对其的访问。[2]

\n\n

对于 Windows Vista、Windows 7、Windows 8 和 Windows 10,您可以执行以下注册表编辑:

\n\n
    \n
  1. 单击“开始”,在搜索框中键入 \xe2\x80\x9cregedit\xe2\x80\x9d,然后单击搜索结果中的 regedit.exe。将出现“用户帐户控制”对话框。
  2. \n
  3. 在 UAC 提示符下输入 \xe2\x80\x9cYes\xe2\x80\x9d,注册表编辑器就会打开。
  4. \n
  5. 打开 HKEY_LOCAL_MACHINE 分支。
  6. \n
  7. 打开系统分支。
  8. \n
  9. 打开 CurrentControlSet 分支。
  10. \n
  11. 打开服务分支。
  12. \n
  13. 打开 LanmanServer 分支。
  14. \n
  15. 选择参数分支。
  16. \n
  17. 选择编辑、新建、\xe2\x80\x9cDWORD(32 位)值\xe2\x80\x9d
  18. \n
  19. 输入 \xe2\x80\x9cAutoShareWks\xe2\x80\x9d 并按 Enter。(保留默认值 0。)
  20. \n
  21. 使用命令提示符(DOS 或终端)重新引导或重新启动服务: \xe2\x80\x9cnet stop server\xe2\x80\x9d 然后 \xe2\x80\x9cnet start server\xe2\x80\x9d。
  22. \n
\n\n
\n

有没有办法增加每个共享的最大连接数(在这种情况下这不会有帮助)?我在文档中没有看到它。

\n
\n\n

是的[3]。在分享下方只需输入:

\n\n
[share]\n   max connections = ##\n
Run Code Online (Sandbox Code Playgroud)\n\n

其中 XX 是连接数。

\n\n

资料来源:

\n\n\n