据我了解,SMB 上的 rsync 每次都会尝试在源/目标上构建文件列表,以检查在进行复制之前是否已修改任何更改。
我试图了解在 OSX 上通过 SMB 安装网络存储时使用 rsync 与在 OSX 上通过 SSH 向 Linux 上的 NFS 安装存储使用 rsync 的区别。在测试 rsync 到 Linux 上的安装存储时,它会立即识别新文件/已删除文件!在通过 SMB 进行 rsync 时,会在进行任何复制之前构建完整的文件列表并创建每个文件夹的列表。
在用户看来,构建文件列表(假设他们有数百/数千个文件夹)需要花费一些时间来遍历每个目录。一旦 rsync 完成初始复制,在第二次运行时它会非常快速地向我提供发送和大小信息。
当我们卸载 SMB 共享时,就会出现问题。如果我们再次运行 rsync,它会构建文件列表并遍历每个文件夹,即使没有任何内容可复制。通过 ssh 同步到存储不会显示构建文件列表,并且会立即通知我们文件是否正在复制等。
我们已经玩过的命令是;-
通过 smb rsync -uvaz --delete /source /destination rsync -aHEXAx -v --delete --progress --stats --timeout=999 /source /destination
通过 ssh/nfs rsync -nuvaz --delete /source/[电子邮件保护]:
有任何想法吗?
答案1
同步总是必须建立要同步的文件列表,但是“通过 SSH”是这里的关键区别。
当你将 rsync 指向 SSH 服务器时,它可以询问服务器通过在服务器上运行 rsync 的另一个副本来创建这样的列表。
这样,客户端和服务器都只需要读取/重新扫描自己的本地副本,并且只交换一小段更新列表。
同时,当你指向 rsync直接地在安装的共享中,它不能在服务器上运行任何内容,无论是通过 SMB 还是 NFS,或者其他方式。它甚至无法区分已安装的网络共享和已安装的本地磁盘 - 它看到的只是文件。
这意味着你的rsync 必须重新扫描整个共享,这涉及通过网络发送大量“读取目录”命令(延迟)并下载整个文件以确定更改的部分(带宽)。