rsync介绍

rsync 是 Andrew Tridgell 和 Paul Mackerras 开发的远程同步文件工具,可以通过 LAN/WAN 快速在多台主机之间同步文件。rsync 使用智能算法有效计算源文件和目标文件的不同,实际传输时只传输差异部分,此外还可以使用压缩算法压缩数据,因此同步速度相当快。本站之前的文章 WordPress备份方案和备份脚本 便是使用 rsync 跨机器备份程序文件和数据库,此外本站提供高速下载的 ssr客户端V2ray客户端trojan客户端 同样使用 rsync 在多个下载节点间同步数据。

尽管 rsyncftpscp 等工具更强大,传输效果更高,实际使用中仍有一些注意事项,本文分别做介绍。

rsync复制文件的一些注意事项

安装rsync

某些精简版的系统没有默认安装rsync,则需要手动安装:

yum install -y rsync

需要注意的是,同步的两台主机必须都安装rsync才能正常工作,而不是常规思维认为的只在执行命令的主机上安装就好了。

rsync常用参数

rsync 的基本语法是:

rsync [option] src dest

其中 srcdest 既可以是本机的文件或目录,也可以是远程主机的资源。

网络同步(备份)本来就是一个复杂的事情,因此rsync的选项参数非常多,新手通过man命令看到几页参数可能一脸懵逼,不知如何下手好。其实平常使用的参数主要是以下几个:

  • -a:归档模式,几乎是必用的参数,等同于-rlptgoD
  • -v:详细输出模式,比较常用,与之相反的参数是-q,表示不输出信息
  • -P:保持传输时的文件部分,以便增量同步,同时输出传输进度,等同于--partial --progress。这个参数能看到每个文件的传输进度,推荐使用
  • -z:压缩数据后再传输,在 1mbps带宽 等小水管情形下比较有用
  • --exclude:排除同步的文件,例如 --exclude=.svn。如果需要排除的文件比较多,可以写成文件然后用–exclude-from参数
  • --delete:删除dest中有而src没有的文件,其变种是--delete-before--delete-after,指定同步前删除还是同步完成后删除
  • --bwlimit:限制最大同步带宽,单位是KB/s,1mbps是128KB/s。一些vps商家整理 介绍的个别国内商家,如果给的带宽是20m,超过这个带宽时间稍长就会中断数据传输一段时间,此时可以用这个参数避免断流。这个参数实际中很少用。

绝大多数情形下,-avP 参数就足够,其他参数尽在需要时才指定。

更多参数请使用 man rsync 查看官方文档获取。

rsync尾部斜杆

rsync 让许多人搞混,也是容易感到困惑的一个事情是:srcdest 结尾加斜杆有什么影响?例如以下几种情形,分别有什么不同?

rsync -avP src dest
rsync -avP src/ dest
rsync -avP src dest/
rsync -avP src/ dest/

rsync来说,有无尾部斜杆说起来区别挺大,其决定了目标文件的目录结构。如果你只在乎数据同步好,不在乎多一层文件夹,也不用太关心这个事。

具体来说,上面四种写法区别是:

  1. 第一种写法:如果src是文件,则同步到名为dest的文件;如果src是目录(文件夹),同步结束后src出现在dest文件夹内
  2. 第二种写法:将src中的文件同步到dest文件夹内
  3. 第三种写法:不管src是文件还是目录,同步到dest文件夹内
  4. 第四种写法:同第二种写法,将src中的文件同步到dest文件夹内

总结便是:

  • dest后的斜杆仅在src为文件才有影响,有斜杆表示dest是目录
  • src有无斜杆决定是将整个文件(夹)复制到dest中,还是将src中的文件复制到dest中。例如有文件夹a,rsync -avP a b,同步结束后a出现在文件夹b中(b不存在则创建);如果是 rsync -avP a/ b,那么a中的文件会出现在文件夹b中,但b中没有a文件夹。

此外还需要注意的是,加斜杆就可以了,不要加*,否则会导致--delete等参数不起作用。例如 rsync -avP --delete a/* b能将a中的文件同步到b中,但a中删除文件后,再运行这个命令不会删除b中的文件。

远程主机使用非标准端口

rsync 默认通过 ssh 协议与远程主机进行通讯。如果远程主机ssh不是监听默认的22端口,那么需要额外设置。

尽管rsync有-p和-P两个选项,但都不是用来指示远程主机的ssh端口

一种方式是配置~/.ssh/config文件,指定远程ssh端口:

Host 远程IP
    Port 远程ssh端口

另一种方法是使用-e选项:rsync -avP -e"ssh -p 远程ssh端口" src dest

对于经常使用的主机。建议使用第一种方式,方便平时ssh登录。

参考

  1. rsync 的核心算法
  2. rsync同步和备份文件到本地