服务器: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 -l
回2048.很显眼。
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,您可以执行以下注册表编辑:
- 单击“开始”,在搜索框中键入“regedit”,然后在搜索结果中单击 regedit.exe。出现“用户帐户控制”对话框。
- 对 UAC 提示说“是”,注册表编辑器就会打开。
- 打开 HKEY_LOCAL_MACHINE 分支。
- 打开 SYSTEM 分支。
- 打开 CurrentControlSet 分支。
- 打开服务分支。
- 打开 LanmanServer 分支。
- 选择参数分支。
- 选择编辑、新建、“DWORD(32 位)值”
- 输入“AutoShareWks”并按 Enter。(保留默认值 0。)
- 使用命令提示符(DOS 或终端)重新启动或重启服务:“net stop server”然后“net start server”。
有没有办法增加每个共享的最大连接数(在这种情况下这不会有帮助)?我在文档中没有看到它。
是的[3]。下面输入刚刚分享的内容:
[share]
max connections = ##
其中 XX 是连接数。
资料来源:
- [1]https://www.samba.org/samba/docs/old/Samba3-HOWTO/securing-samba.html
- [2]https://www.petri.com/disable_administrative_shares
- [2]https://www.weavweb.net/2015/08/27/disabling-hidden-shares-in-windows-10-windows-vista-windows-7-and-windows-8-1/
- [2]https://support.microsoft.com/en-us/help/954422/how-to-remove-administrative-shares-in-windows-server-2008
- [3]https://www.samba.org/samba/docs/using_samba/ch09.html