重启smbd daemon不中断Windows客户端SMB文件传输的方案咨询
结论
可以实现SMB传输中断后的断点续传,有两种实现方案,可根据场景选择:
- 调整Samba服务端配置,利用SMB3的持久句柄特性,支持Windows资源管理器默认拷贝操作的断点续传,无需修改客户端配置(仅要求客户端为Win8/Server2012及以上版本,支持SMB3.0+)
- 不改服务端配置,客户端使用
robocopy命令进行拷贝,自带断点续传能力
方案1:服务端配置SMB3持久句柄
核心原理
SMB3.0及以上版本自带持久句柄特性,smbd进程重启时会将当前打开的文件句柄持久化存储到本地磁盘,重启完成后自动恢复句柄,客户端连接断开后会自动重连并复用原有句柄,拷贝任务可直接从断点继续。
配置修改
1. 修改smb.conf的[global]段,新增以下参数
[global] # 最低支持SMB3协议,确保客户端走SMB3连接 server min protocol = SMB3 # 启用耐用句柄、持久句柄 durable handles = yes persistent handles = yes # 关闭内核 oplock,与持久句柄特性冲突 kernel oplocks = no # 断开虚拟连接时不重置会话,允许重连恢复 reset on zero vc = no # 调大最大句柄数,适配集群场景的并发连接 handle count maximum = 65535
2. 修改共享配置(smb-res.conf对应共享段),新增以下参数
[test109_smb] # 共享级别开启句柄特性 durable handles = yes persistent handles = yes # 关闭客户端离线缓存,避免与持久句柄冲突 csc policy = disable
验证生效
- 执行
testparm检查配置无报错后,执行systemctl restart smbd nmbd重启服务 - 客户端PowerShell执行
Get-SmbConnection,确认对应共享的Dialect列显示为3.0.x以上 - 测试:客户端通过资源管理器拷贝大文件,中途重启smbd服务,等待连接恢复后点击重试,可观察到拷贝进度从断点继续而非从头开始
方案2:客户端侧实现(无需改服务端)
如果不方便调整服务端配置,Windows自带的robocopy命令原生支持断点续传,在客户端CMD/PowerShell执行以下命令即可:
# /Z 启用断点续传模式,/R:10 重试10次,/W:5 每次重试间隔5秒 robocopy 源路径 目标路径 文件名 /Z /R:10 /W:5
比如要从\\SERVER\test109_smb\test.iso拷贝到本地D盘,命令为:
robocopy \\SERVER\test109_smb D:\ test.iso /Z /R:10 /W:5
该方案兼容性更强,支持SMB2协议的客户端也可以使用。
注意事项
- 方案1要求客户端系统版本不低于Win8/Server2012,Win7最高仅支持SMB2.1,不支持持久句柄特性,无法实现资源管理器默认拷贝的断点续传
- smbd服务重启时长不要超过60秒(Windows默认SMB会话超时时间),否则会话失效无法恢复句柄
- 现有配置中的
auth methods、syslog参数告警属于废弃提示,不影响本功能使用,可直接删除对应参数消除告警
内容的提问来源于stack exchange,提问作者lignumq
相关产品推荐
相关产品推荐

