月下博客

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

rsync介绍

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

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

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

安装rsync

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

yum install -y rsync

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

rsync常用参数

rsync 的基本语法是:

rsync [option] src dest

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

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

绝大多数情形下,-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. 同2,将src中的文件同步到dest文件夹内

总结便是:

此外还需要注意的是,加斜杆就可以了,不要加*,否则会导致--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同步和备份文件到本地