Lazy loaded image
学习参考
Rsync:强大的同步、备份工具
字数 4764阅读时长 12 分钟
2024-12-21
2024-12-28
type
status
date
slug
summary
tags
category
icon
password
网址
😀
非原创,仅记录学习。内容大量参考了骏马金龙大佬的文章,在此特别感谢!!!
👉
Rsync是Unix下的一款应用软件,它能同步更新两处计算机的文件与目录,并适当利用差分编码以减少数据传输量。rsync中的一项同类软件不常见的重要特性是每个目标的镜像只需发送一次。rsync可以拷贝/显示目录内容,以及拷贝文件,并可选压缩以及递归拷贝。
在常驻模式(daemon mode)下,rsync默认监听TCP端口873,以原生rsync传输协议或者透过远程shell如RSH或者SSH提供文件。SSH模式下,rsync客户端执行程序必须同时在本地和远程机器上安装。
 
——摘自Wikipedia

一、Rsync基本知识

Rsync的作用
Rsync针对的对象是文件系统的数据,是一款可以实现增量备份的工具。配合crontab,Rsync能实现定时或间隔同步,配合inotify或sersync,可以实现触发式的实时同步。
Rsync的备份原理
Rsync同步的条件,是看两个指标是否满足,文件的大小mtime(修改时间)。默认情况下,rsync使用"quick check"算法快速检查源文件和目标文件的大小mtime(修改时间)是否一致,如果不一致则需要传输。当然,也可以通过在rsync命令行中指定某些选项来改变quick check的同步条件。
Rsync的工作模式
本地文件系统上的同步备份
源地址SRC和目标地址DEST都是本地的文件系统,一般很少用,如果都在本地上的备份,直接cp就可以实现了,而rsync也可以实现本地到本地的,但是和cp实现的原理不一样。
本地和远程的同步备份(远程shell方式)
这种方式的原理是,利用远程shell技术,本地和远程主机建立起数据传输通道,然后可以实现本地到远程或者远程到本地的文件数据同步备份功能,跟scp的传输方式应该是一样的,只是同步和算法不一样。
本地和远程的同步备份(远程daemon方式)
这种也是本地和远程间的一种同步备份方式,但是实现原理和第二种不一样。这是在服务端启动一个rsync服务,监听一个端口,由客户端和服务端利用socket建立起数据传输的通道。
注意:rsycn不支持远程到远程的同步备份,而scp可以实现。
daemon模式的优势
既然rsync通过远程shell就能实现两端主机上的文件同步,还要使用rsync的服务干啥?试想下,你有的机器上有一堆文件需要时不时地同步到众多机器上去,比如目录a、b、c是专门传输到web服务器上的,d/e、f、g/h是专门传输到ftp服务器上的,还要对这些目录中的某些文件进行排除,如果通过远程shell连接方式,无论是使用排除规则还是包含规则,甚至一条一条rsync命令地传输,这都没问题,但太过繁琐且每次都要输入同样的命令显得太死板。使用rsync daemon就可以解决这种死板问题。而且,rsync daemon是向外提供服务的,这样只要告诉了别人rsync的url路径,外人就能向ftp服务器一样获取文件列表并进行选择性地下载,所以,你所制定的列表,你的同事也可以获取到并使用。

二、Rsync的选项说明

rsync的常用选项
其实,最常用的就是 -avz参数,即压缩和显示部分信息,并以归档模式传输。
rsync的其他选项

三、本地文件系统上的同步方式

这种方式用的很少,就是本地到本地的一个同步备份作用。
rsync语法如下
举例说明:作用就是将/etc/cron.d目录拷贝到/tmp下
另外,使用rsync一定要注意的一点是,源路径SRC如果是一个目录的话,带上尾随斜线和不带尾随斜线是不一样的,不带尾随斜线表示的是整个目录包括目录本身,带上尾随斜线表示的是目录中的文件,不包括目录本身。

四、Rsync远程shell的同步方式

这种同步方式非常简单,不需要多余的配置,因为就是利用现有的shell进行数据传输的,而且用法跟scp有点类似。
rsync语法如下
参数说明:
1.第一个路径参数一定是源文件路径,可以同时指定多个源文件路径最后一个路径参数是目标文件路径
2.利用远程shell通信的时候,远程路径的主机和path路径之间使用单个冒号隔开
举例说明:
这是把本地目录‘wordpress’利用远程shell,传输到远程主机‘data’目录下,我们的远程主机是改了远程ssh端口的,这里需要用-e选项,然后再用-p指定远程shell端口。

五、Rsync Daemon的同步方式

rsync daemon是"rsync --daemon"或再加上其他一些选项启动的,它会读取配置文件,默认是/etc/rsyncd.conf,并默认监听在873端口上,当外界有客户端对此端口发起连接请求,通过这个网络套接字就可以完成连接,以后与该客户端通信的所有数据都通过该网络套接字传输。
rsync daemon的通信方式和传输通道与远程shell不同。远程shell连接的两端是通过管道完成通信和数据传输的,即使连接的一端是远程主机,当连接到目标端时,将在目标端上根据远程shell进程fork出rsync进程使其成为rsync server。而rsync daemon是事先在server端上运行好的rsync后台进程(根据启动选项,也可以设置为非后台进程),它监听套接字等待client端的连接,连接建立后所有通信方式都是通过套接字完成的。
注意,rsync中的server的概念从来就不代表是rsync daemon,server在rsync中只是一种通用称呼,只要不是发起rsync请求的client端,就是server端,你可以认为rsync daemon是一种特殊的server,其实daemon更应该称之为service。
服务端:配置rsync
参数说明:
  1. [backup]:rsync模块的定义,backup就是模块名称,必须保证唯一性,后面客户端引用的就是这个模块名称
  1. path:模块对应的文件路径,每个模块中必须定义一项"path"。因为我们用rsync同步的时候,不是直接指定文件系统路径的,而是引用的模块名,比如你如果请求的是backup模块,则代表你连的是“/vol1/1002/Photos”目录,如果要访问/vol1/1002/Photos目录下的子目录aaa,则"rsync user@host::backup/aaa"。
配置示例
注意:
  1. 客户端上传文件到服务端时,文件的属主和属组是配置文件中指定的uid和gid。但是客户端从服务端下载文件的时候,文件的属主和属组是客户端正在操作rsync的用户身份,因为执行rsync程序的用户为当前用户。
  1. auth users和secrets file这两行不是一定需要的,省略它们时将默认使用匿名连接。但是如果使用了它们,则secrets file的权限必须是600。客户端的密码文件也必须是600。
  1. 关于secrets file的权限,如果设置了“strict mode=false”,则无需关注文件的权限,满足rsync的用户可读即可。但默认是yes,即需要设置权限,则secrets file客户端的密码文件的权限必须是600。
配置完后,再就是提供模块相关目录、身份验证文件等。
服务端:创建rsync同步的用户名和目录
创建的用户名和目录,需要和上面配置文件中指定的一致。
服务端:创建rysnc同步的用户密码文件,并设置权限
每行对应一个账号,而账号和密码之间用冒号分割
服务端:重启rsyncd
启动好rysnc daemon后,它就监听在指定的端口上,等待客户端的连接。
客户端:创建密码文件
客户端连接服务端需要的密码文件:在上面示例中的模块backup配置了身份验证功能,所以客户端连接时会询问密码。如果不想手动输入密码,则可以使用"–password-file"选项提供密码文件,密码文件中只有第一行才是传递的密码,其余所有的行都会被自动忽略。
rsync语法如下
分两种模式pull(从远程daemon服务路径拉取到本地)和push(从本地推送到远程daemon服务路径)
参数说明:
  1. 第一个路径参数一定是源文件路径,可以同时指定多个源文件路径最后一个路径参数是目标文件路径
  1. 这种方式有两种连接命令:一种是用rsync风格,用双冒号进行分割,如"user@host::src dest",还有一种是用url风格,如“rsync://user@host:port/src dest”。
  1. 上述语法中,如“user@host::src”,‘src’代表的是模块名,而不是真的文件系统中的路径。
用法举例

六、Rsync 特殊参数说明 

rsync的强大功能还体现在,提供了非常多有趣的选项,使得同步模式变得更具弹性。
下面介绍几个常用的同步选项:
–backup:对远程目录下已存在文件做一个备份。备份文件默认使用"~"做后缀,可以使用"–suffix"指定备份后缀。
–backup-dir:默认是备份到原来目录,用这个参数可以指定备份的地址,但要求保存路径必须存在。
–existing:只更新目标端已存在的文件
–ignore-existing:更新目标端不存在的文件
–exclude:指定排除规则,排除那些不需要传输的文件
–include:指定包含规则,筛选出要进行传输的文件
–delete:接收端的rsync会先删除目标目录下已经存在,但源端目录不存在的文件。也就是说如果源目录没有的文件,你目标目录也不能有,多出的文件会被删除掉。
另外:如果将"–delete"选项和"–exlcude"选项一起使用,则被排除的文件不会被删除

📎 参考文章

     
    上一篇
    自定义CNAME解析:vercel或netlify项目连接优化
    下一篇
    使用acme.sh自动签发证书