几个月来,我已经从 Debian Jessie 远程安装了几个目录到 Windows 共享中。
在过去的几周里,我一直抱怨与挂载点的随机断开连接,并且不得不做一个
sudo mount -a
重新获得挂载连接,需要几次(服务器每周使用一到两次)。
例如,在不使用一段时间后,安装座通常不会恢复。
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)
目录是/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)
该怎么办?
答案1
我在这里发现了一个有趣的相关帖子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 中找到了这个帖子装载 CIFS 主机已关闭
这也可能是由于协议不匹配造成的。 2017 年,微软修补了 Windows 服务器并建议禁用 SMB1 协议。
从现在开始,mount.cifs 可能会出现协议协商问题。
显示的错误是“主机已关闭”。但是当你调试时:
smbclient -L <server_ip> -U <username> -d 256
你会得到错误:
protocol negotiation failed: NT_STATUS_CONNECTION_RESET
该帖子提到,Windows 对协议/Wannacry 等的补丁正在搞乱/或者更准确地说,有些人禁用了 v1 CIFS 请求功能;类似的问题也发生在 Windows 上,并且考虑到时间,这让我怀疑该问题一定是相关的。
我们尚未在此特定服务器中禁用 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
从手册中可以看出,在 Windows 8 之后的最近 Windows 版本中至少使用
vers=2.0
可能更有意义;命令行中的替代语法以及--verbose
提到的选项对于进一步调试可能出现的任何复杂情况也很有用。
因此,由于我在这个问题上安装的 Windows 服务器是 Windows Server 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
现在我们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 Developer Network - [MS-SMB2]:版本控制和功能协商 - 1.7 版本控制和功能协商
还应该指出的是,与新版本的协议相比,CIFS v1.0 除了过时之外,效率极低且不安全。
SMB1 既不现代也不高效
当您使用 SMB1 时,您将失去最终用户的关键性能和生产力优化。
- 更大的读取和写入 (2.02+) – 更有效地使用更快的网络或更高延迟的 WAN。大 MTU 支持。
- 文件夹和文件属性的对等缓存 (2.02+) – 客户端通过 BranchCache 保留文件夹和文件的本地副本
- 耐用句柄 (2.02、2.1) – 如果暂时断开连接,允许连接透明地重新连接到服务器
- 客户端 oplock 租赁模型 (2.02+) – 限制客户端和服务器之间传输的数据,提高高延迟网络的性能并提高 SMB 服务器可扩展性
- 多通道和 SMB Direct (3.0+) – 如果客户端和服务器之间有多个路径可用,则网络带宽和容错的聚合,再加上现代超高吞吐量 RDMA 基础设施的使用
- 目录租赁 (3.0+) – 通过缓存提高分支机构的应用程序响应时间
有趣的是,最后一篇文章表明,如果使用 >= 2.01 的协议,则在断开连接(持久句柄)后不太可能出现断开连接问题,因此我再次强调,不要继续使用 CIFS v1.0。 (例如,在 1.0 中,echo_interval=60
确实保持连接,如果出现网络故障或其他服务器中断,则在使用 CIFS v1.0 时,如果没有手动干预,挂载将无法自行恢复)
作为最后一条建议,避免这样做sudo mount -a
,并开始这样做:
sudo mount -o remount -a
另请参阅我的问题CIFS 在同一装载点上装载同一共享的多个副本