rsync(本地、远程)文件同步

rsync介绍

sync同步:刷新文件系统缓存,强制将修改过的数据块写入磁盘,并且更新超级快。一般重启系统前执行sync命令
async:将数据先缓存在缓冲区,再周期性(一般是30s)的去同步到磁盘 。性能好,但是不能保证数据的安全性
rsync:远程同步,remote synchronous。用于在本地或与远程主机间进行文件或目录备份。相比较scp等工具,rsync有以下优点:

  1. 速度:除首次全拷贝外,其他时候实现增量拷贝,加快传输速度
  2. 安全:传输数据时可用ssh加密传输
  3. 带宽占用:rsync可对数据进行分块压缩传输,相比其他文件传输工具占用更少带宽
  4. 权限限制:非root用户也可安装和执行rsync命令

与其他文件传输工具(如 FTP 或 scp)不同,rsync 的最大特点是会检查发送方和接收方已有的文件,仅传输有变动的部分(默认规则是文件大小或修改时间有变动)

rsync特点

1.可以镜像保存整个目录树和文件系统
2.可以保留原有的权限,owner,group,时间,软硬链接,文件属性等信息
3.传输效率高,只比较变化的
4.支持匿名传输,也可以做验证,加强安全

rsync作用

它可以在本地计算机与远程计算机之间,或者两个本地目录之间同步文件(但不支持两台远程计算机之间的同步)。它也可以当作文件复制工具,替代cp和mv命令。

rsync语法

#将源目录同步到目标目录
rsync options source destination

#将多个源目录同步到目标目录
rsync options source1 source2 destination

source 和 destination 既可以指示本地,也可以是远程机器。
注意,-r是必须的,否则 rsync 运行不会成功。
目标目录destination如果不存在,rsync 会自动创建。执行上面的命令后,源目录source被完整地复制到了目标目录destination下面,即形成了destination/source的目录结构。
如果只想同步源目录source里面的内容到目标目录destination,则需要在源目录后面加上斜杠。

#将源目录同步到目标目录
rsync options source/ destination

#将多个源目录同步到目标目录
rsync options source1/ source2/ destination

上面命令执行后,source目录里面的内容,就都被复制到了destination目录里面,并不会在destination下面创建一个source子目录。

rsync安装

如果本机或者远程计算机没有安装 rsync,可以用下面的命令安装。

# Debian
$ sudo apt-get install rsync

# Red Hat
$ sudo yum install rsync

# Arch Linux
$ sudo pacman -S rsync

注意,传输的双方都必须安装 rsync。

rsync 协议

除了使用 SSH,如果另一台服务器安装并运行了 rsync 守护程序,则也可以用rsync://协议(默认端口873)进行传输。具体写法是服务器与目标目录之间使用双冒号分隔::。

 rsync -av source/ 192.168.122.32::module/destination

注意,上面地址中的module并不是实际路径名,而是 rsync 守护程序指定的一个资源名,由管理员分配。
如果想知道 rsync 守护程序分配的所有 module 列表,可以执行下面命令。

rsync rsync://192.168.122.32

rsync 协议除了使用双冒号,也可以直接用rsync://协议指定地址。

rsync 协议除了使用双冒号,也可以直接用rsync://协议指定地址。

rsync命令

-v:表示输出详细的信息。-vv表示输出更详细的信息,-vvv表示输出最详细的信息
–version:返回 rsync 的版本
-P:显示文件传输的进度信息。(实际上"-P"=“–partial --progress”,其中的"–progress"才是显示进度信息的)。
-n --dry-run :仅测试传输,而不实际传输。模拟命令执行的结果,并不真的执行命令。-v参数则是将结果输出到终端,这样就可以看到哪些内容会被同步。

$ rsync -anv source/ destination

-a --archive :归档模式,表示递归传输并保持文件属性。可以同步元信息(比如修改时间、权限等),比-r更有用
-r --recursive:表示递归,即包含子目录。注意,-r是必须的,否则 rsync 运行不会成功
-t --times:保持mtime属性。强烈建议任何时候都加上"-t",否则目标文件mtime会设置为系统时间,导致下次更新
:检查出mtime不同从而导致增量传输无效。
-o --owner:保持owner属性(属主)。
-g --group:保持group属性(属组)。
-p --perms:保持perms属性(权限,不包括特殊权限)。
-D :是"–device --specials"选项的组合,即也拷贝设备文件和特殊文件。
-l --links:如果文件是软链接文件,则拷贝软链接本身而非软链接所指向的对象。
-z :传输时进行压缩提高效率。
-R --relative:使用相对路径。意味着将命令行中指定的全路径而非路径最尾部的文件名发送给服务端,包括它们的属性。用法见下文示例。
-u --update :仅在源mtime比目标已存在文件的mtime新时才拷贝。注意,该选项是接收端判断的,不会影响删除行为。
-d --dirs :以不递归的方式拷贝目录本身。默认递归时,如果源为"dir1/file1",则不会拷贝dir1目录,使用该选项将拷贝dir1但不拷贝file1。
–max-size :限制rsync传输的最大文件大小。可以使用单位后缀,还可以是一个小数值(例如:“–max-size=1.5m”)
–min-size :限制rsync传输的最小文件大小。这可以用于禁止传输小文件或那些垃圾文件。
–exclude :指定排除规则来排除不需要传输的文件。

$ rsync -av --exclude='*.txt' source/ destination
# 或者
$ rsync -av --exclude '*.txt' source/ destination

#rsync 会同步以"点"开头的隐藏文件,如果要排除隐藏文件,可以这样写--exclude=".*"。

–delete :以SRC为主,对DEST进行同步。多则删之,少则补之。注意"–delete"是在接收端执行的,所以它是在:exclude/include规则生效之后才执行的。
默认情况下,rsync 只确保源目录的所有内容(明确排除的文件除外)都复制到目标目录。它不会使两个目录保持相同,并且不会删除文件。如果要使得目标目录成为源目录的镜像副本,则必须使用–delete参数,这将删除只存在于目标目录、不存在于源目录的文件。

#排除某个目录里面的所有文件,但不希望排除目录本身
rsync -av --exclude 'dir1/*' source/ destination

#多个排除模式
rsync -av --exclude 'file1.txt' --exclude 'dir1/*' source/ destination
或
rsync -av --exclude={'file1.txt','dir1/*'} source/ destination

#排除模式很多,可以将它们写入一个文件,每个模式一行,然后用--exclude-from参数指定这个文件
rsync -av --exclude-from='exclude-file.txt' source/ destination
 rsync -av --delete source/ destination

#--delete参数会使得destination成为source的一个镜像。

-b --backup :对目标上已存在的文件做一个备份,备份的文件名后默认使用"~“做后缀。
–backup-dir:指定备份文件的保存路径。不指定时默认和待备份文件保存在同一目录下。
-e :指定所要使用的远程shell程序,默认为ssh。
–port :连接daemon时使用的端口号,默认为873端口。
–password-file:daemon模式时的密码文件,可以从中读取密码实现非交互式。注意,这不是远程shell认证的密码,而是rsync模块认证的密码。
-u、–update参数表示同步时跳过目标目录中修改时间更新的文件,即不同步这些有更新的时间戳的文件
-W --whole-file:rsync将不再使用增量传输,而是全量传输。在网络带宽高于磁盘带宽时,该选项比增量传输更高效。
–existing :要求只更新目标端已存在的文件,目标端还不存在的文件不传输。注意,使用相对路径时如果上层目录不存在也不会传输。
–ignore-existing:要求只更新目标端不存在的文件。和”–existing"结合使用有特殊功能,见下文示例。
–remove-source-files:表示传输成功后,要求删除源端已经成功传输的文件。
–suffix参数指定文件名备份时,对文件名添加的后缀,默认是~
–size-only参数表示只同步大小有变化的文件,不考虑文件修改时间的差异。默认算法是检查文件大小和mtime不同的文件,使用此选项将只检查文件大小。
–append参数指定文件接着上次中断的地方,继续传输。
–append-verify参数跟–append参数类似,但会对传输完成后的文件进行一次校验。如果校验失败,将重新发送整个文件。
-b、–backup参数指定在删除或更新目标目录已经存在的文件时,将该文件更名后进行备份,默认行为是删除。更名规则是添加由–suffix参数指定的文件后缀名,默认是~。
–backup-dir参数指定文件备份时存放的目录,比如–backup-dir=/path/to/backups。
–bwlimit参数指定带宽限制,默认单位是 KB/s,比如–bwlimit=100。
-c、–checksum参数改变rsync的校验方式。默认情况下,rsync 只检查文件的大小和最后修改日期是否发生变化,如果发生变化,就重新传输;使用这个参数以后,则通过判断文件内容的校验和,决定是否重新传输。
–delete参数删除只存在于目标目录、不存在于源目标的文件,即保证目标目录是源目标的镜像。
-e参数指定使用 SSH 协议传输数据。
–exclude参数指定排除不进行同步的文件,比如–exclude=“*.iso”。
–exclude-from参数指定一个本地文件,里面是需要排除的文件模式,每个模式一行。
–existing、–ignore-non-existing参数表示不同步目标目录中不存在的文件和目录。
-h参数表示以人类可读的格式输出。
-h、–help参数返回帮助信息。
-i参数表示输出源目录与目标目录之间文件差异的详细情况。
–ignore-existing参数表示只要该文件在目标目录中已经存在,就跳过去,不再同步这些文件。
–include参数指定同步时要包括的文件,一般与–exclude结合使用。
–link-dest参数指定增量备份的基准目录。
-m参数指定不同步空目录。
–max-size参数设置传输的最大文件的大小限制,比如不超过200KB(–max-size=‘200k’)。
–min-size参数设置传输的最小文件的大小限制,比如不小于10KB(–min-size=10k)。
-n参数或–dry-run参数模拟将要执行的操作,而并不真的执行。配合-v参数使用,可以看到哪些内容会被同步过去。
-P参数是–progress和–partial这两个参数的结合。
–partial参数允许恢复中断的传输。不使用该参数时,rsync会删除传输到一半被打断的文件;使用该参数后,传输到一半的文件也会同步到目标目录,下次同步时再恢复中断的传输。一般需要与–append或–append-verify配合使用。
–partial-dir参数指定将传输到一半的文件保存到一个临时目录,比如–partial-dir=.rsync-partial。一般需要与–append或–append-verify配合使用。
–progress参数表示显示进展。

rsync案例

在本地两个目录间进行数据同步

以下命令用于在两个目录间完成文件拷贝

案例

通常用场景3

#场景1:不保留原文件时间戳、属主/属组、权限属性
$ rsync -zvr /var/opt/lx/ /root/temp/

-z :传输时进行压缩提高效率
-v:显示rsync过程中详细信息
-r --recursive:递归到目录中去

#场景2:若要保留原文件时间戳、属主/属组、权限属性,使用 -a 选项:
rsync -azv /var/opt/lx/ /root/temp/
-a归档模式,表示递归传输并保持文件属性。选项亦包含递归的作用,因而可以替代-r选项。

#场景3:若保留原文件时间戳、属主/属组、权限属性,同时删除不存在于源目录的目的地文件
rsync -azv --delete /var/opt/lx/ /root/temp/
-delete 删除只存在于目标目录、不存在于源目标的文件,即保证目标目录是源目标的镜像

注意事项:如果只是目录下内容同步,源/目标目录需加/。不然目标目录下会创建1个源端同名目录

测试环境实验过程

source direcoty:/data/elasticsearch
destination direcoty:/data/elsbak

#查看源目录文件属性
[root@top132:/data]$ ls -l /data/elasticsearch/   #source direcoty
total 1220252
drwxr-xr-x. 12 elasticsearch elasticsearch      4096 Sep 13 23:23 elasticsearch
-rw-r--r--.  1 root          root          349477091 Sep 13 03:22 elasticsearch-7.0.1-20211217.tar
-rw-rw-r--.  1 elasticsearch elasticsearch  15276320 Sep 13 05:49 elasticsearch-code-conversion-7.0.1.zip
-rw-rw-r--.  1 elasticsearch elasticsearch  19199613 Sep 14 01:53 filebeat-7.0.1-linux-x86_64.tar.gz
-rw-rw-r--.  1 elasticsearch elasticsearch        73 Sep 14 02:02 filebeat.log
-rwxrwxr-x.  1 elasticsearch elasticsearch      1610 Sep 14 02:02 install.sh
drwxr-xr-x. 13 elasticsearch elasticsearch      4096 Oct 17  2019 kibana
-rw-r--r--.  1 root          root          652103680 Sep 13 04:40 kibana-7.0.1-20200724.tar
-rw-rw-r--.  1 elasticsearch elasticsearch 172062554 Sep 13 23:08 logstash-7.0.1-20211217.tar
-rw-r--r--.  1 root          root           27531705 Sep 14 02:11 metricbeat-7.0.1.tar.gz
-rw-------.  1 elasticsearch elasticsearch         0 Sep 13 04:06 nohup.out
-rw-r--r--.  1 root          root           13844882 Sep 14 02:25 packetbeat-7.0.1.tar.gz
-rwxrwxr-x.  1 elasticsearch elasticsearch       207 Sep 14 01:52 start-filebeat.sh
-rwxrwxr-x.  1 elasticsearch elasticsearch       103 Sep 14 01:52 stop-filebeat.sh

#创建目标目录
[root@top132:/data]$ mkdir -p elsbak   #destination direcoty

#开始同步
[root@top132:/data]$ rsync -zvr /data/elasticsearch/  /data/elsbak/
#查看目标目录文件属性,发现和源目录文件时间戳、属主/属组、权限属性不同
[root@top132:/data]$ ls -l /data/elsbak/
total 1220252
drwxr-xr-x 12 root root      4096 Oct 13 22:33 elasticsearch
-rw-r--r--  1 root root 349477091 Oct 13 22:31 elasticsearch-7.0.1-20211217.tar
-rw-r--r--  1 root root  15276320 Oct 13 22:31 elasticsearch-code-conversion-7.0.1.zip
-rw-r--r--  1 root root  19199613 Oct 13 22:31 filebeat-7.0.1-linux-x86_64.tar.gz
-rw-r--r--  1 root root        73 Oct 13 22:31 filebeat.log
-rwxr-xr-x  1 root root      1610 Oct 13 22:31 install.sh
drwxr-xr-x 13 root root      4096 Oct 13 22:47 kibana
-rw-r--r--  1 root root 652103680 Oct 13 22:31 kibana-7.0.1-20200724.tar
-rw-r--r--  1 root root 172062554 Oct 13 22:31 logstash-7.0.1-20211217.tar
-rw-r--r--  1 root root  27531705 Oct 13 22:31 metricbeat-7.0.1.tar.gz
-rw-------  1 root root         0 Oct 13 22:31 nohup.out
-rw-r--r--  1 root root  13844882 Oct 13 22:32 packetbeat-7.0.1.tar.gz
-rwxr-xr-x  1 root root       207 Oct 13 22:32 start-filebeat.sh
-rwxr-xr-x  1 root root       103 Oct 13 22:32 stop-filebeat.sh

#若要保留原文件时间戳、属主/属组、权限属性,使用 -a 选项:
rsync -azv /data/elasticsearch/  /data/elsbak/
-a归档模式,表示递归传输并保持文件属性。选项亦包含递归的作用,因而可以替代-r选项。

将本地多个目录数据同步到目标1个目录中

#不保留原文件时间戳、属主/属组、权限属性
$ rsync -zvr source1 source2 destination

-z :传输时进行压缩提高效率
-v:显示rsync过程中详细信息
-r --recursive:递归到目录中去

#若要保留原文件时间戳、属主/属组、权限属性,使用 -a 选项:
rsync -azv source1 source2 destination
-a归档模式,表示递归传输并保持文件属性。选项亦包含递归的作用,因而可以替代-r选项。

#若保留原文件时间戳、属主/属组、权限属性,同时删除不存在于源目录的目的地文件
rsync -azv --delete  source1 source2 destination
-delete 删除只存在于目标目录、不存在于源目标的文件,即保证目标目录是源目标的镜像

注意事项:如果只是目录下内容同步,源/目标目录需加/。不然目标目录下会创建1个源端同名目录

本地与远程主机间完成数据同步

用rsync将本地的文件,同步到远程机器
场景2居多

#场景1:若保留原文件时间戳、属主/属组、权限属性
语法:rsync -avz  source/ username@remote_host:destination
rsync -avz  /root/temp/ [email protected]:/home/lx/tmp/   

#场景2:若保留原文件时间戳、属主/属组、权限属性,同时删除不存在于源目录的目的地文件
语法:rsync -avz  --delete source/ username@remote_host:destination
rsync -azv --delete /var/opt/lx/ [email protected]:/root/temp/
-delete 删除只存在于目标目录、不存在于源目标的文件,即保证目标目录是源目标的镜像

-a归档模式,表示递归传输并保持文件属性。选项亦包含递归的作用,因而可以替代-r选项。
-z :传输时进行压缩提高效率
-v:显示rsync过程中详细信息

注意事项:源、目标目录均含有/,若不包含/会创建目录

指明了目的机器ip、登录用户以及所路径,并且需要输入相应用户的登录密码。以上命令完成本地到远程机器的同步,调换source和destination的位置,亦可完成远程机器到本地的数据同步。

远程内容同步到本地

rsync -av username@remote_host:source/ destination

rsync -av -e ssh source/ user@remote_host:/destination

rsync -av -e 'ssh -p 2234' source/ user@remote_host:/destination

使用ssh通道进行数据同步

rsync 默认使用 SSH 进行远程登录和数据传输
由于早期 rsync 不使用 SSH 协议,需要用-e参数指定协议,后来才改的。所以,下面-e ssh可以省略。
在源端进行数据同步时,一般采用ssh通道,使用 -e ssh 选项可以完成该功能:

rsync -avz -e ssh /root/temp/ [email protected]:/home/lx/tmp/

-a归档模式,表示递归传输并保持文件属性。选项亦包含递归的作用,因而可以替代-r选项。
-z :传输时进行压缩提高效率
-v:显示rsync过程中详细信息
-e:指定所要使用的远程shell程序,默认为ssh  -e 'ssh -p 2234'或-e ssh  端口

不覆盖目的地对文件已作的修改

经常出现这样的场景,对源文件和目的地文件均作了修改,同时想将源文件作的修改同步到目的地,但又保留对目的地文件的更改,此时可以使用 -u 选项:

$ ls -l /root/temp/b.c 
-rw-r--r-- 1 root root 12 04-06 22:19 /root/temp/b.c
$ ls -l /var/opt/lx/b.c 
-rw-r--r-- 1 root root 8 04-06 21:06 /var/opt/lx/b.c
$ rsync -avzu /var/opt/lx/ /root/temp/
sending incremental file list
./
a.c

sent 172 bytes  received 34 bytes  412.00 bytes/sec
total size is 101  speedup is 0.49

以上目的地 b.c 文件经过修改,与源文件不相同,此时使用 -u 选项,可以看到对 b.c 并不进行同步,目的地 b.c 的修改得以保存。

删除不存在于源目录的目的地文件

对于不存在于源目录,但存在于目的地的文件,有时想在做文件同步时删除它们,–delete 选项可以满足要求

$ rsync -avz --delete /var/opt/lx/ /root/temp/
sending incremental file list
./
deleting c.c
b.c

sent 101 bytes  received 34 bytes  270.00 bytes/sec
total size is 101  speedup is 0.75

-a归档模式,表示递归传输并保持文件属性。选项亦包含递归的作用,因而可以替代-r选项。
-z :传输时进行压缩提高效率
-v:显示rsync过程中详细信息
-delete 删除只存在于目标目录、不存在于源目标的文件,即保证目标目录是源目标的镜像

在同步时不在目的地创建新文件

有时只想对目的地已经有的文件进行同步,而不理会源目录新增的文件,此时可以使用 --existing 选项

rsync -avz --existing /var/opt/lx/ /root/temp/

-a归档模式,表示递归传输并保持文件属性。选项亦包含递归的作用,因而可以替代-r选项。
-z :传输时进行压缩提高效率
-v:显示rsync过程中详细信息

显示执行进度

使用 --progress 选项可以显示同步的进度,包括文件传输完成进度、传输速率信息

$ rsync -avz --progress /var/opt/lx/ /root/temp/
sending incremental file list
./
a.c
          93 100%    0.00kB/s    0:00:00 (xfer#1, to-check=1/3)
b.c
           8 100%    7.81kB/s    0:00:00 (xfer#2, to-check=0/3)

sent 220 bytes  received 53 bytes  546.00 bytes/sec
total size is 101  speedup is 0.37

查看 source 和 destination 间的区别

rsync完成源目录到目的地的拷贝,若能查看到源目录与目的地间的差异,这对同步十分有帮助,-i 选项可以显示源目录与目的地间的差异,示例如下。
source:

$ ls -l /var/opt/lx/
总计 8
-rw-r--r-- 1 root root 145 04-06 23:11 a.c
-rw-r--r-- 1 root root   8 04-06 21:06 b.c

destination:

$ ls -l /root/temp/
总计 8
-rw-r--r-- 1 root root 93 04-06 22:20 a.c
-rw-r--r-- 1 lx   root  8 04-06 21:06 b.c

可以看到 source 与 destination 有两处不同,一处为 a.c 的文件大小,第二处为 b.c 的属主,此时添加 -i 选项进行数据同步,有以下输出:

$ rsync -avzi /var/opt/lx/ /root/temp/
sending incremental file list
.d..t...... ./
>f.st...... a.c
.f....o.... b.c

sent 175 bytes  received 37 bytes  424.00 bytes/sec
total size is 153  speedup is 0.72


-a归档模式,表示递归传输并保持文件属性。选项亦包含递归的作用,因而可以替代-r选项。
-z :传输时进行压缩提高效率
-v:显示rsync过程中详细信息
-i:输出源目录与目标目录之间文件差异的详细情况

对于同步的每个文件,均对应有一条输出,有11个标志位指示源文件与目的地文件的区别,在以上例子中,各标志位意义如下:

  • 指示传输到本地

  • f 指示所传为文件
  • s 指示文件大小不一致
  • t 指示时间戳不一致
  • o 指示属主不一致

按指定模式进行同步

使用 --include 和 --exclude 选项,可以帮助完成只同步特定文件的目的,例如以下只同步以 ‘a’ 开头的文件:

$ rsync -avz --include 'a*' --exclude '*' /var/opt/lx/ /root/temp/
sending incremental file list
./
a.c
aa.c

sent 220 bytes  received 53 bytes  546.00 bytes/sec
total size is 148  speedup is 0.54


-a归档模式,表示递归传输并保持文件属性。选项亦包含递归的作用,因而可以替代-r选项。
-z :传输时进行压缩提高效率
-v:显示rsync过程中详细信息
--include:指定同步时要包括的文件,一般与--exclude结合使用
--exclude:指定排除不进行同步的文件,比如--exclude="*.iso"

限制传输文件的大小

使用 --max-size 选项,我们可以限制传输文件的最大大小:

rsync -avz --max-size='100K' /var/opt/lx/ /root/temp/

-a归档模式,表示递归传输并保持文件属性。选项亦包含递归的作用,因而可以替代-r选项。
-z :传输时进行压缩提高效率
-v:显示rsync过程中详细信息

以上命令限制传输的文件大小只能小于或等于100K,另可以使用 M 和 G 作为大小单位。

全拷贝

默认情况下 rsync 采用增量拷贝,这样能节省带宽,在所同步文件不大的情况下,可以通过 -W 选项实现全拷贝:

rsync -avzW /var/opt/lx/ /root/temp/

-a归档模式,表示递归传输并保持文件属性。选项亦包含递归的作用,因而可以替代-r选项。
-z :传输时进行压缩提高效率
-v:显示rsync过程中详细信息
-W:

参考链接:https://www.ruanyifeng.com/blog/2020/08/rsync.html
https://blog.csdn.net/u014270566/article/details/107299120

你可能感兴趣的:(Linux,rsync文件同步)