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


16

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

<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)`

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

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

'回声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

在这一点上,客户端实际上没有其他可用信息。cifs挂载请求消失,客户端几乎立即死亡。mount.cifs错误(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 -l返回2048。很明显。

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

[IPC$]
hosts deny = 0.0.0.0/0

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

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


“随机且偶尔”,“间歇性故障”和内存分配错误-您是否检查(物理)内存错误?
ckujau 2016年

1
始终在每个用户上下文中访问IPC $共享,因为它实际上(在MSFT世界中)是一个远程过程调用(RPC)接口。也就是说,IPC $共享为用户提供了对服务器服务进行身份验证的通道,以便他们随后可以对其进行RPC调用。如果您不需要它,则禁用它是一种很好的安全措施(而且我很难相信有人这样做)。
AlwaysLearning 2015年

感谢您提供有关samba故障排除的详细示例。抽象错误消息是噩梦。
mmv-ru

Answers:


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服务器”,然后“ net start服务器”。

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

是的[3]。在共享下面,只需输入:

[share]
   max connections = ##

其中XX是连接数。

资料来源:

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.