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

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

服务器: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)

在 /etc/security/pam_mount.conf.xml 中设置<debug enable="1"/>以从 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 也报告了此事件:

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

‘回显 1 > /proc/fs/cifs/cifsFYI’曲柄启动 mount.cifs 调试(写入 /var/log/debug)。下面是精彩部分(看起来很熟悉?):

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

此时客户端上几乎没有其他可用信息。cifs 安装请求发出后,客户端几乎立即死机。mount.cifs error(12) 信息量很小(手册页没有帮助,谢谢大家)。广泛的互联网搜索显示这是一个常见的错误代码,也证实它没有信息量。

是时候检查服务器了!log level = 3在 /etc/samba/smb.conf 中为 smbd 设置(来自《使用 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 -l2048.很显眼。

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

[IPC$]
hosts deny = 0.0.0.0/0

现在效果很好。好的,希望将来能帮到一些可怜的人。

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

答案1

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

为什么 smbd 不清理 IPC$ 共享?

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

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

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

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

既是也不是。它实际上并没有禁用 IPC$ 共享的创建,但你可以从 Windows 客户端禁用对它的访问。[2]

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

  1. 单击“开始”,在搜索框中键入“regedit”,然后在搜索结果中单击 regedit.exe。出现“用户帐户控制”对话框。
  2. 对 UAC 提示说“是”,注册表编辑器就会打开。
  3. 打开 HKEY_LOCAL_MACHINE 分支。
  4. 打开 SYSTEM 分支。
  5. 打开 CurrentControlSet 分支。
  6. 打开服务分支。
  7. 打开 LanmanServer 分支。
  8. 选择参数分支。
  9. 选择编辑、新建、“DWORD(32 位)值”
  10. 输入“AutoShareWks”并按 Enter。(保留默认值 0。)
  11. 使用命令提示符(DOS 或终端)重新启动或重启服务:“net stop server”然后“net start server”。

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

是的[3]。下面输入刚刚分享的内容:

[share]
   max connections = ##

其中 XX 是连接数。

资料来源:

相关内容