根据官方网站https://www.samba.org/ftp/rsync/rsync.html的定义:
rsync - a fast, versatile, remote (and local) file-copying tool
Rsync是一款快速的、多功能的远程文件复制工具
Rsync is a fast and extraordinarily versatile file copying tool. It can copy locally, to/from another host over any remote shell, or to/from a remote rsync daemon. It offers a large number of options that control every aspect of its behavior and permit very flexible specification of the set of files to be copied. It is famous for its delta-transfer algorithm, which reduces the amount of data sent over the network by sending only the differences between the source files and the existing files in the destination. Rsync is widely used for backups and mirroring and as an improved copy command for everyday use.
它的复制又不是简单粗暴的复制,而是增量复制。举个例子,A机器上有10000个文件,你第一次用Rsync同步到你的B机器,就会同步10000个文件,以后你改动A机器上的1个文件,下次同步到B机器Rsync就只复制改动的那个文件,而不是又无脑地复制10000个文件下来。所以Rsync被广泛用于文件备份和文件同步。我猜市面上很多云备份软件都是基于Rsync来实现的。
它默认会检查文件大小以及修改时间,如果发现不一致就说明这个文件被改动过,则认为需要同步。当然,你也可以自定义哪些文件需要同步。例如你如果只希望当文件大小变化才同步,也是可以通过配置Rsync来实现的。
任何复杂的应用场景,对于Rsync来说可能一个配置项或者一个参数就搞定。所以只要涉及文件备份和文件同步,你就应该首先想到Rsync。Rsync提供了非常多的参数和配置:
-v:显示rsync过程中详细信息。可以使用"-vvvv"获取更详细信息。
-P:显示文件传输的进度信息。(实际上"-P"="--partial --progress",其中的"--progress"才是显示进度信息的)。
-n --dry-run :仅测试传输,而不实际传输。常和"-vvvv"配合使用来查看rsync是如何工作的。
-a --archive :归档模式,表示递归传输并保持文件属性。等同于"-rtopgDl"。
-r --recursive:递归到目录中去。
-t --times:保持mtime属性。强烈建议任何时候都加上"-t",否则目标文件mtime会设置为系统时间,导致下次更新
:检查出mtime不同从而导致增量传输无效。
-o --owner:保持owner属性(属主)。
-g --group:保持group属性(属组)。
-p --perms:保持perms属性(权限,不包括特殊权限)。
-D :是"--device --specials"选项的组合,即也拷贝设备文件和特殊文件。
-l --links:如果文件是软链接文件,则拷贝软链接本身而非软链接所指向的对象。
-z :传输时进行压缩提高效率。
-R --relative:使用相对路径。意味着将命令行中指定的全路径而非路径最尾部的文件名发送给服务端,包括它们的属性。用法见下文示例。
--size-only :默认算法是检查文件大小和mtime不同的文件,使用此选项将只检查文件大小。
-u --update :仅在源mtime比目标已存在文件的mtime新时才拷贝。注意,该选项是接收端判断的,不会影响删除行为。
-d --dirs :以不递归的方式拷贝目录本身。默认递归时,如果源为"dir1/file1",则不会拷贝dir1目录,使用该选项将拷贝dir1但不拷贝file1。
--max-size :限制rsync传输的最大文件大小。可以使用单位后缀,还可以是一个小数值(例如:"--max-size=1.5m")
--min-size :限制rsync传输的最小文件大小。这可以用于禁止传输小文件或那些垃圾文件。
--exclude :指定排除规则来排除不需要传输的文件。
--delete :以SRC为主,对DEST进行同步。多则删之,少则补之。注意"--delete"是在接收端执行的,所以它是在
:exclude/include规则生效之后才执行的。
-b --backup :对目标上已存在的文件做一个备份,备份的文件名后默认使用"~"做后缀。
--backup-dir:指定备份文件的保存路径。不指定时默认和待备份文件保存在同一目录下。
-e :指定所要使用的远程shell程序,默认为ssh。
--port :连接daemon时使用的端口号,默认为873端口。
--password-file:daemon模式时的密码文件,可以从中读取密码实现非交互式。注意,这不是远程shell认证的密码,而是rsync模块认证的密码。
-W --whole-file:rsync将不再使用增量传输,而是全量传输。在网络带宽高于磁盘带宽时,该选项比增量传输更高效。
--existing :要求只更新目标端已存在的文件,目标端还不存在的文件不传输。注意,使用相对路径时如果上层目录不存在也不会传输。
--ignore-existing:要求只更新目标端不存在的文件。和"--existing"结合使用有特殊功能,见下文示例。
--remove-source-files:要求删除源端已经成功传输的文件。
配置文件/etc/rsyncd.conf里,如下所示:
注意:注释最好另起一行,不然可能会出错。
配置文件里增加了一个[test]模块,只允许用户linchang1使用密码连接。
如果是首次搭建Rsync,/etc目录应该没有这个文件,新建一个就好。
文件内容非常简单,就是以“账号:密码”的形式来存储,例如:
zhangsan:123456
lisi:123456
/etc/rsyncd.conf的auth users里写了linchang1,我们在rsyncd.passwd里加多一行linchang1:123456即可。
这样,当Rsync服务器监听到有用户请求时,就会去检查是不是auth users里的用户,如果是,再去看rsync.passwd里校对一下这个用户的密码是不是正确。
注意:修改保存好后,需要修改rsyncd.passwd的权限为600
chmod 600 rsyncd.passwd
rsync --daemon
如果是CentOS 7,则自带启动脚本,直接systemctl start rsyncd启动
使用ps aux看下是不是启动成功了:
完成前面的步骤,Rsync的服务器就搭建完成了,接下来就是安装Window电脑上的Rsync。
Rsync的Window版本叫cwRsync,官网提供的好像要钱,直接去百度搜索下载
无脑解压后,新建一个linchang1_secret.txt来存放密码
新建一个linchang目录,用来存放待从服务器同步下来的文件,新建一个test.bat来请求同步:
运行test.bat,如果有报错,可以复制报错内容自行百度,Rsync的常见报错百度上都已经提供了排查步骤,这里就不多说了。
正常情况下可以看到linchang目录下已经成功同步下服务器的文件。
Linux服务器上的文件:
本地电脑上的文件:
注意:使用rsync,源路径如果是一个目录的话,带上尾随斜线和不带尾随斜线是不一样的,不带尾随斜线表示的是整个目录包括目录本身,带上尾随斜线表示的是目录中的文件,不包括目录本身。
rsync -a /etc /tmp
rsync -a /etc/ /tmp
第一个命令会在/tmp目录下创建etc目录,而第二个命令不会在/tmp目录下创建etc目录,源路径/etc/中的所有文件都直接放在/tmp目录下。