CIFS 随机失去与 Windows 共享的连接

Rui*_*iro 7 debian cifs smb

几个月来,我在 Windows 共享中从 Debian Jessie 远程​​安装了几个目录。

在过去的几周里,我一直抱怨从挂载点随机断开连接,并且不得不做一个

sudo mount -a
Run Code Online (Sandbox Code Playgroud)

重新获得安装连接,几次(服务器每周使用一次或两次)。

例如,在一段时间未使用后,坐骑不会经常恢复。

Windows 管理员还告诉我 Windows 服务器有一段时间没有重新启动。

今天,巧合的是,mount -a再次尝试时,它仅在第二次尝试中起作用,而第一次尝试出现以下错误:

sudo mount -a
mount error(104): Connection reset by peer
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)
mount error(112): Host is down
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)
Run Code Online (Sandbox Code Playgroud)

目录是从/etc/fstab这样安装的:

//10.2.1.2/XX/ZZ/YY /mnt/mount_point cifs credentials=/root/.smbcredentials,iocharset=utf8,file_mode=0770,dir_mode=0770,uid=1001,gid=1001 0 0

在执行 mount 命令时,您还可以看到该选项echo_interval默认在 60 分钟激活。

$mount //10.2.1.2/XX/ZZ/YY on /mnt/mount_point type cifs (rw,relatime,vers=1.0,cache=strict,username=someusername,domain=XXX,uid=1001,forceuid,gid=1001,forcegid,addr=10.2.1.2,file_mode=0770,dir_mode=0770,nounix,serverino,mapposix,rsize=61440,wsize=65536,echo_interval=60,actimeo=1)

该怎么办?

Rui*_*iro 17

我在这里发现了一个有趣的相关帖子cifs 安装文件夹保持断开连接 (ubuntu 服务器),谈论类似的问题(相同的错误,Samba 共享)。

这里的相关花絮,对于接下来的答案,是 CIFS 挂载默认使用 SMBv1.0 协议,可以验证发出mount命令,并注意该vers=1.0字段。

$mount //10.2.1.2/XX/ZZ/YY on /mnt/mount_point type cifs (rw,relatime,vers=1.0,cache=strict,username=someusername,domain=XXX,uid=1001,forceuid,gid=1001,forcegid,addr=10.2.1.2,file_mode=0770,dir_mode=0770,nounix,serverino,mapposix,rsize=61440,wsize=65536,echo_interval=60,actimeo=1)

我还在 Stack Overflow 中发现,帖子Mount CIFS Host is down

这也可能是因为协议不匹配。2017 年,微软修补了 Windows 服务器并建议禁用 SMB1 协议。

从现在开始,mount.cifs 可能会出现协议协商问题。

显示的错误是“主机已关闭”。但是当您使用以下命令进行调试时:

smbclient -L <server_ip> -U <username> -d 256
Run Code Online (Sandbox Code Playgroud)

你会得到错误:

protocol negotiation failed: NT_STATUS_CONNECTION_RESET
Run Code Online (Sandbox Code Playgroud)

该帖子提到 Windows 对协议/Wannacry 和其他人的补丁正在搞砸/或更确切地说,有些人禁用了 v1 CIFS 请求功能;在 Windows 前端也发生了类似的问题,考虑到时间,这让我怀疑问题一定是相关的。

我们没有在这个特定的服务器 AFAIK 中禁用 v1 CIFS(并且测试证实了这一点),但是 MS 公告表明默认的 SMBv1 行为被(稍微)改变了。

我最终遵循了提到的 Samba 问题中建议的一般想法。从mounts.cifs

vers=

    SMB 协议版本。允许的值为:

    • 1.0 - 经典的 CIFS/SMBv1 协议。这是默认设置。

    • 2.0 - SMBv2.002 协议。这最初是在 Windows Vista Service Pack 1 和 Windows Server 2008 中引入的。请注意,Windows Vista 的初始发行版使用了一种不受支持的略有不同的方言 (2.000)。

    • 2.1 - Microsoft Windows 7 和 Windows Server 2008R2 中引入的 SMBv2.1 协议。

    • 3.0 - 在 Microsoft Windows 8 和 Windows Server 2012 中引入的 SMBv3.0 协议。

    另请注意,虽然此选项控制所使用的协议版本,但并非每个版本的所有功能都可用。

--verbose

    打印挂载的附加调试信息。请注意,此参数必须在-o. 例如:

 mount -t cifs //server/share /mnt --verbose -o user=username
Run Code Online (Sandbox Code Playgroud)

从手册中可以看出,在最近的 Windows 版本中,至少在 Windows 8 之后使用vers=2.0可能更有意义;命令行中带有--verbose提到的选项的替代语法对于进一步调试可能出现的任何复杂情况也很有用。

因此,由于我在此问题上安装内容的 Windows 服务器是 Windows 服务器 2008 R2,因此我输入了/etc/fstab

//10.2.1.2/XX/ZZ/YY /mnt/mount_point cifs credentials=/root/.smbcredentials,iocharset=utf8,file_mode=0770,dir_mode=0770,uid=1001,gid=1001,vers=2.1 0 0

然后重新安装它以使选项生效:

sudo mount -o remount /mnt/mount_point
Run Code Online (Sandbox Code Playgroud)

现在我们mount再次验证以确认协商的协议:

$mount //10.2.1.2/XX/ZZ/YY on /mnt/mount_point type cifs (rw,relatime,vers=2.1,cache=strict,username=someusername,domain=XXX,uid=1001,forceuid,gid=1001,forcegid,addr=10.2.1.2,file_mode=0770,dir_mode=0770,nounix,serverino,mapposix,rsize=61440,wsize=65536,echo_interval=60,actimeo=1)

我们确实可以确认我们成功修改了正在使用的 SMB 协议。

另请参阅MS 开发人员网络 - [MS-SMB2]:版本控制和能力协商 - 1.7 版本控制和能力协商

还应该注意的是,与较新版本的协议相比,CIFS v1.0 除了已经过时之外,效率极低且不安全。

来自MS 博客 - 停止使用 SMB1

SMB1 既不现代也不高效
当您使用 SMB1 时,您将失去对最终用户的关键性能和生产力优化。

  • 更大的读取和写入 (2.02+) – 更有效地使用更快的网络或更高延迟的 WAN。大型 MTU 支持。
  • 文件夹和文件属性的对等缓存 (2.02+) – 客户端通过 BranchCache 保留文件夹和文件的本地副本
  • Durable handles (2.02, 2.1) – 如果暂时断开连接,允许连接透明地重新连接到服务器
  • 客户端 oplock 租用模型 (2.02+) – 限制客户端和服务器之间传输的数据,提高高延迟网络的性能并增加 SMB 服务器的可扩展性
  • 多通道和 SMB 直通 (3.0+) – 如果客户端和服务器之间有多个路径可用,则网络带宽和容错的聚合,以及现代超高 RDMA 基础设施的使用
  • Directory Leasing (3.0+) – 通过缓存提高分支机构的应用程序响应时间

有趣的是,最后一篇文章表明,如果使用 >= 2.01 的协议,在断开连接(持久句柄)后不太可能出现断开连接问题,因此我再次强调,不要继续使用 CIFS v1.0。(例如,在 1.0 中,echo_interval=60确实保持连接,如果出现网络故障或其他一些服务器中断,使用 CIFS v1.0 时,挂载不会在没有人工干预的情况下自行恢复)

作为最后一条建议,避免做sudo mount -a,并开始做:

sudo mount -o remount -a
Run Code Online (Sandbox Code Playgroud)

另请参阅我的问题CIFS 在同一个挂载点上挂载同一共享的多个副本