Macs与SMB共享断开连接:"STATUS_NETWORK_SESSION_EXPIRED (0xc000035c)"

我有一些运行Samba和Winbind的Ubuntu服务器。一切都很好,但是Mac电脑会在夜间或者某个不规律的时间间隔内随机断开连接。 在服务器上,Samba记录了两个事件。
1: ../source3/smbd/service.c:1050(close_cnum)
2: closed connection to service data
通过匹配Mac上的时间戳,我可以看到它们将丢弃记录为:
kcm DEPRECATED USE in libdispatch client: Setting timer interval to 0 requests a 1ns timer, did you mean FOREVER (a one-shot timer)?; set a breakpoint on _dispatch_bug_deprecated to debug

通过分析时间戳,我已确定这是仅在Mac客户端一侧记录的事件。以下是一个示例客户端,它具有一个Shell脚本,每十秒写入一个共享文件夹中的文本文件: Logging Example 您可以看到连接在左侧的文本文件中的08:59:46是活动的,并且在/var/log/system.log中只有一条相关消息。

我在Samba邮件列表上询问了此问题,被告知Mac只是关闭了连接。


更新:

Wireshark分析显示了一些附加信息:

Wireshark关于SMB错误:STATUS_NETWORK_SESSION_EXPIRED的对话 上述错误(第4行):

  • STATUS_NETWORK_SESSION_EXPIRED
  • SATATUS_INVALID_PARAMETER
  • STATUS_NETWORK_NAME_DELETED

这是最终的SMB2消息(从底部数第二个):Negotiate Protocol ResponseNegotiate Protocol Response

更令人困惑的是,其中有一个NT Status: STATUS_SUCCESS的消息(请参见批注)。

这是微软关于此错误的解释

如果SMB2头中的状态字段为STATUS_NETWORK_SESSION_EXPIRED,则客户端必须尝试重新验证由SMB2头中的SessionId标识的会话,如3.2.4.2.3节所述。如果重新验证尝试成功,客户端必须重试使用STATUS_NETWORK_SESSION_EXPIRED失败的请求。如果重新验证尝试失败,客户端必须失败操作并终止会话,如3.2.4.23节所述。 有没有一个脚本可以在cron作业中运行来仅仅更新会话?
其他类型的客户端将永远保持连接,所以似乎只有Mac才会这样。操作系统版本从OS X 10.12到macOS Catalina不等,使用各种SMB2到SMB3的变体。 有没有办法让我开始理解为什么Mac会这样做,或者有没有什么提示可以让它们保持连接? Mac客户端正在运行依赖于持久连接的作业。
非常重要的信息,但最初被忽略了,因为我一直在寻找解决办法: 过去几年里,我有大约十几台这样的服务器(主要是Ubuntu 18.04;Samba 4.7.6)运行得很好。其中三台安装了自动更新,而这三台出现了Mac断开连接的问题。我暂时不让其他服务器重新启动进行更新,而且Mac不会断开与未更新的服务器的连接。 为了测试,我设置了一个16.04版本的服务器,看看旧版本的Ubuntu Server是否会出现同样的问题。令人惊讶的是,它使用了不同版本的Samba(4.3.11),却有相同的问题。为了确认我的怀疑,我将不让16.04安装最新的安全更新,再次进行测试。 虽然我怀疑Ubuntu核心发生了变化,但我在这里提问,因为只有Mac受到影响。
在多台安装了从10.12到Catalina的Mac上,我尝试使用它们的默认设置以及对/etc/nsmb.conf进行的所有可能的更改组合进行测试。
[default]
signing_required=no
protocol_vers_map=[see manpage for nsmb.conf (linked below)]

nsmb.conf的man页面

我还尝试了禁用所有睡眠和省电选项,甚至使用一个很好的cafffinate包装器,KeepingYouAwake,来强制执行这一点。

在服务器上,我尝试了另一位系统管理员在#macosx freenode频道上的建议,kode54,他分享了他们最终获得稳定连接的方法

这些建议对我没有帮助,因为我还没有完全尝试过,需要安装来自Linux for Schools Project维护的Samba版本(链接1:PPA for a version of Samba maintained by the Linux for Schools Project)。不过,它告诉了我关于vfs_fruit和通过额外软件包扩展Samba的开发工作的事实(链接2:developmental effort of extending Samba through an extra package for, in part, dealing with Macs)。它还引导我找到了Samba Wiki上一篇讨论与Mac和服务器端解决方法相关困难的页面:Configure Samba to Work Better with Mac OS X

对我来说,尝试安装建议的Samba PPA很困难,因为这些服务器只是部分地用作文件服务器,并且通常始终被用于可能需要数天才能完成的计算任务(神经影像处理)。它们是为计算任务而构建的,存储只是双插槽、高内存密度服务器选项的副产品,同时也是具有大量驱动器托架(16+)的服务器。

在完全产生负面影响之前,我希望尝试其他选项。

由于服务器端的选项都没有帮助-我已经尝试了各种组合的标志,但都无济于事-我希望苹果社区能够给我提供一些解决方法。

无论问题的起源在哪里,保持持久连接的任何方式都将非常有价值。


这是你正在建立的新项目吗?如果不是,能否澄清一下,这是一个新的问题还是一直存在的问题?如果是一个新问题,是否有其他与问题开始同时发生的事情?此外,所有的Mac电脑是如何连接到Ubuntu服务器的?它们共享一个连接还是...?它们断开连接的时间是不同的,还是都在短时间内同时断开?最后,很好你正在检查日志 - 在Mac端,你是否也能检查一下,在断开连接之前是否存在一种熟悉的模式? - Monomeeth
@Monomeeth 非常感谢您针对我模糊问题提出的出色问题。我故意省略了很多细节以避免复杂性,但是现在填写了这些细节,因为您建议提供更多信息更好。 - Louis Waweru
我想向您请求一份Wireshark的跟踪记录。这将使我能够确认是哪一方出现了问题,并通过对网络事务的逐步分析来查找故障发生时的原因。服务器和客户端的日志,包括故障发生的时间,也可能会有所帮助。您可以猜测一整天,但只有日志和网络跟踪记录才能给出确凿证据。 - Wilfred Smith
抱歉,我没有一个快速的答案,但是Wireshark的跟踪和日志应该能指出问题所在。如果你能把它们放在某个地方,我甚至可以帮你看一下。 - Wilfred Smith
@WilfredSmith 我添加了一段样本Wireshark对话。所有服务器在这些交换次数中都有相同的对话。 - Louis Waweru
@Louis,你能在苹果开发者论坛上发布这个问题吗?至少我们知道问题指向了苹果的SMB客户端。 - Wilfred Smith
@WilfredSmith 对,我没想到在那里发布。几天前我提了一个错误报告,但还没有收到回复。实际上,你的Wireshark建议非常有见地,SMB消息最终将我的注意力从Ubuntu和Apple转向了域控制器。我登录了它们,发现主要域控制器的CPU使用率异常高并且持续不断。它也是所有域控制器中运行时间最长的,远远超过其他。我将PDC角色转移到另一个域控制器并重启了它。自从10月31日上午7点左右这样做以来,问题似乎已经解决了。希望一切顺利! - Louis Waweru
1可能说得太早了。用户在Samba日志中出现../source3/smbd/service.c:1050(close_cnum)的错误,导致连接中断。不知何故,我的连接仍然保持着(使用原始设置的Mac)。 - Louis Waweru
有问题的DC已恢复到其原始状态。其中两个DC无法成功从WSUS服务器获取更新。我已将所有FSMO角色转移到可以获取更新的DC,并停用了有问题的DC。我将开始对WSUS服务器进行故障排除。我的普通Mac、Linux和Windows客户端仍然保持连接,但其他Mac仍然会像上述描述的那样断开连接。 - Louis Waweru
你的smbd.conf是什么样的?你有开启时间机器支持吗? - Ray Foss
2个回答

我建议你试一下后面这个链接:https://support.apple.com/zh-cn/HT202528 虽然这个用法是为了在Mac上作为文件服务器使用,但它仍然应该为客户端的网络I/O提供更高的优先级。 读取NVRAM设置:
nvram boot-args
如果将nvram设置为默认值,将会抛出以下错误: nvram:获取变量时出错 - 'boot-args':(iokit/common) 数据未找到 打开服务器性能模式(MacOS 10.11 El Capitan及更高版本):
sudo nvram boot-args="serverperfmode=1 $(nvram boot-args 2>/dev/null | cut -f 2-)"
关闭电源,要么重置PRAM或:
sudo nvram boot-args="$(nvram boot-args 2>/dev/null | sed -e $'s/boot-args\t//;s/serverperfmode=1//')"

你可能已经解决了这个问题,我再次快速阅读了你的问题后,唯一想到的解决办法是创建一个虚拟文件,并使用Mac上的rsync工具,定期将该虚拟文件传输到网络的某个地方。这样可以保持网络的活跃状态。

谢谢你的建议。但是鉴于WannaCry类似的漏洞,我已经在所有系统上禁用了SMB1。不过你说得对,我设置了一个带有SMB1/CIFS的测试虚拟机服务器,它没有断开连接。就个人而言,我认为苹果从来没有费心跟上SMB的步伐,而是倾向于使用AFP。但最近他们一直在更新实施,尽管我仍然认为他们做得还不够正确。 - Louis Waweru
自从Maverick(MacOS 10.9)之后,苹果宣布停止AFP的开发(已废弃)。因此,应使用SMB2或更高版本的本机协议。所以说"Mac不支持原生的SMB"是错误的! - llange