我正在使用 smbclient 每晚将一组大文件 (80 GB) 从 Linux 系统传输到 Windows 共享。最近,无论出于什么原因,我一直遇到 I/O 超时:
cli_push returned NT_STATUS_IO_TIMEOUT
这会导致活动文件传输中止并从 Windows 共享中删除。
这可能是由于未解决桑巴错误 8498(或者可能不是)。 Windows系统不在我的控制之下,所以我无法安装SSH服务器(以使用SCP或SFTP),并且我不想依赖微软的NFS实现。
是否有另一种简单、标准的替代方案可以让我定期通过网络可靠地将 80 GB 数据从 Linux 移动到 Windows(网络是 GB 以太网,因此带宽不是问题)?
答案1
尝试在 smbclient 上使用这些套接字选项
smbclient --socket-options='TCP_NODELAY IPTOS_LOWDELAY SO_KEEPALIVE SO_RCVBUF=131072 SO_SNDBUF=131072'
我经常将 40+GB 文件从 Windows 复制到 Linux 媒体服务器,没有错误,通过千兆位交换机连接的机器的典型传输速率为 85MB/s。
答案2
使用curl
我正在运行 smbclient 版本 4.9.4 尝试将 97 MiB 文件从 Arch Linux 传输到 Windows。继bsd用户推荐,我使用 smbclient 调用
--socket-options='TCP_NODELAY IPTOS_LOWDELAY SO_KEEPALIVE SO_RCVBUF=131072 SO_SNDBUF=131072'
但这仍然失败了cli_push returned NT_STATUS_IO_TIMEOUT
。
幸运的是,自从7.40版本,curl 支持中小企业协议版本 1。
因此,我使用它从 Linux 上传到Windows 计算机上的moderately_sized_file
服务:OurRemoteDirectory
172.16.17.52
curl --upload-file /home/me/moderately_sized_file --user "OurWindowsDomain/MyUserName:MyPassword" smb://172.16.17.52/OurRemoteDirectory/Path/To/Dir/
对我来说,curl 每次都可靠地上传文件,并且还显示上传进度,这很好。
创建远程目录
注意卷曲尚不支持在远程主机上创建目录。
因此,您可能需要/Path/To/Dir/
使用以下smbclient
命令进行创建:
smbclient //172.16.17.52/OurRemoteDirectory/ -U MyUserName%MyPassword -W OurWindowsDomain -c 'mkdir Path/To/Dir/'
与使用 smbclient 上传文件相比,smbclient mkdir
到目前为止没有出现任何问题。
答案3
我遇到了同样的问题,下载总是失败,我能够使用以下选项解决“parallel_read returned NT_STATUS_IO_TIMEOUT”问题:
smbclient -m SMB2 ... -c 'timeout 120; iosize 16384; ...'
示例:来自文件路径“//server/share/My Files/More Files/version_1/file.txt”
smbclient -m SMB2 -N '//server/share' -c 'timeout 120; iosize 16384; get \"My Files\More Files\"\version_1\file.txt' -U <username>
如果没有这些设置,下载 100% 会失败,而使用这些设置则 100% 有效。
答案4
也许你可以安装一个文件传输协议服务器上的 Linux 服务器,并要求 Windows 管理员每晚向其发送文件?
FTP 有一些用于传输大文件的有用功能和暂停/恢复机制。对于这么大的文件,你应该注意不是网络硬件过早关闭不活动的连接。它可以关闭你的控制连接在转移结束之前。