RHCE系列之备份工具

Wesley13
• 阅读 692

我一哥们最近在搞备份,需要用到rsync。因此,鄙人就简单总结了下rsync,也就有了这篇博文,希望对51的博友们有所帮助!

RSYNC简介:

Rsync (remote sync)是一款开源、快速,多功能、可实现增量的本地或远程数据镜像同步备份优秀工具。它可通过 LAN/WAN 快速同步多台主机间的文件。Rsync 本来是用以取代rcp 的一个工具,它当前由 Rsync.samba.org 维护。Rsync 使用所谓的“Rsync演算法”来使本地和远程主机之间的文件达到同步,该算法只传送两个文件中的不同部分,而不是每次都整份传送,因此速度相当快。

Rsync支持大多数的类 Unix 系统,无论是 Linux、Solaris 还是 BSD 上都经过了良好的测试。此外,它在windows 平台下也有相应的版本,比较知名的有 cwRsync 和 Sync2NAS。

RSYNC的特性:

1、支持拷贝特殊文件如链接、设备等。

2、可以有排除制定文件或目录同步的功能,相当于打包命令tar。

3、可以做到保持原来文件或目录的权限、时间、软硬连接等所有属性均不改变。

4、可实现增量同步,既只同步发生变化的数据,因此数据传输效率很高。

5、可以使用rcp,rsh,ssh等方式配合传输文件,也可以通过直接的socket连接。

6、支持匿名的或认证的进程模式传输,方便进行数据备份及镜像

7、优化的流程,文件传输效率高

RSYNC工作模式:

Rsync有四种工作模式,具体如下:

1、列表模式

和ls -l相似,负责列出源的内容。不仅可以看本地还可以看远端。

2、shell模式,也称为本地模式

和cp相似,本地拷贝文件

3、远程shell模式,可以通过通过rcp,ssh等通道传输

和rcp相似,不过可以实现增量备份,并且能够通过安全的ssh方式进行数据传输。

4、服务器模式

在这种模式下,rsync 守护进程在一台机器上永久运行,接收文件传输请求。可以把文件发送给守护进程,也可以向它请求文件。服务器模式非常适合创建中心备份服务器或项目存储库。

以上是对rsync做的一个简单介绍,下面来安装一下rsync,然后再详细介绍我们rsync的四种工作模式!

环境
CentOS6.5 x86_64位 采用最小化安装,系统经过了基本优化
selinux为关闭状态,iptables为无限制模式
源码包存放位置:/root

在安装之前,首先让我们看下系统上是否已经安装了rsync。

[root@rsync-server ~]# rpm -qa|grep rsync
rsync-3.0.6-9.el6_4.1.x86_64

如果出现如上的情况,说明我们的系统已经安装了rsync。如果没有出现,就说明没有安装。

如果系统没有安装,我们就需要自己安装了。安装rsync的方式一共有2种,一种是基于包管理器安装,比如rpm包之类,另外一种是基于源码安装。

1、基于包管理器安装

[root@rsync-server ~]# yum install rsync -y

2、基于源码安装

a、安装缺少的gcc和库文件等

[root@rsync-server ~]# yum install -y kernel-headers glibc-headers glibc-devel libgomp gcc  gcc-c++

b、安装rsync

[root@rsync-server ~]# wget  http://rsync.samba.org/ftp/rsync/rsync-3.1.1.tar.gz
[root@rsync-server ~]# tar zxvf rsync-3.1.1.tar.gz
[root@rsync-server ~]# cd rsync-3.1.1
[root@rsync-server rsync-3.1.1]# ./configure --prefix=/usr/local/rsync[root@rsync-server rsync-3.1.1]# make && make install

这样子rsync就安装完成了。

我们需要注意的是,源码安装的rsync默认是没有加入xinetd的,因此你会发现,在/etc/xinetd.d目录下找不到rsync文件。

下面,我就开始带着大家一起来了解下rsync的四种模式!

1、列表模式(list mode)

Rsync的列表模式,即等同于在实现 ls -l 的功能。我们可以通过分别执行rsync和ls命令来观察区别。

[root@rsync-server /]# rsync /rsync
drwxr-xr-x        4096 2014/06/04 00:45:06 rsync
[root@rsync-server /]# rsync /rsync/
drwxr-xr-x        4096 2014/06/04 00:45:06 .
-rw-r--r--           0 2014/06/04 00:45:01 a
-rw-r--r--           0 2014/06/04 00:45:03 b
-rw-r--r--           0 2014/06/04 00:45:05 c
-rw-r--r--           0 2014/06/04 00:45:06 d
[root@rsync-server /]# ls -dl /rsync
drwxr-xr-x. 2 root root 4096 Jun  4 00:45 /rsync
[root@rsync-server /]# ls -l /rsync
total 0
-rw-r--r--. 1 root root 0 Jun  4 00:45 a
-rw-r--r--. 1 root root 0 Jun  4 00:45 b
-rw-r--r--. 1 root root 0 Jun  4 00:45 c
-rw-r--r--. 1 root root 0 Jun  4 00:45 d

通过上面的输出,可以看出来,rsync后跟文件或目录和ls -l后跟文件和目录的效果大体相同(不一样的细节,这里不多描述)。需要注意的是,如果你身处某个目录,你ll能查看到所在目录下文件列表的详细信息。但是你执行rsync会报错,因此rsync必须后跟文件或目录才能查看相关的详细信息。

另外,rsync的列表模式是支持对远端的目录进行查看的,而ls -l是不具备这个功能的。

[root@rsync-server /]#

2、Shell模式(shell mode)

在 RSYNC 的 shell 模式(本地模式)中,我会列举rsync命令的用法和常规选项信息。

首先来看下 RSYNC 的命令语法:

 rsync [OPTION]... SRC [SRC]... DEST

执行rsync --help可得到上面输出,当然输出不仅仅只有上面这一条,我仅仅将shell模式的语句摘了出来。下面对该条语句进行拆解。

 rsync  [OPTION]...  SRC  [SRC]...  DEST
1)rsync为同步的命令
2)[OPTION]... 为同步时的参数选项
3)SRC为源,即需要拷贝的分区,文件或目录等
4)[DEST]为目地分区,文件或目录等

rsync 常用的参数选项有如下:

-n : 如果担心命令执行不正确,一同步复制,可能这个复制的后果是致命的,那后果可就严重了,这里我们可以加-n先测试一下    
-v :  --verbose,详细输出模式,显示详细过程    
-q : --quiet,静默模式,尽可能输出少的信息    
-c : --checksum,可以对传输的文件进行较验的,强制对文件传输进行校验    
-r  : --recursive,递归复制    
-p : --perms,保存文件的权限    
-t  : --times,保留文件的时间戳    
-l  : --links,保留文件的符号链接    
-g : --group,保留文件的属组    
-o : --owner,保留文件的属主    
-D : --devices,保留设备文件
-A : --acls,保留acl访问控制列表
-a : --archives归档,复制时可以保存原有的属主属主等属性信息,甚至包括一点额外的属性。等同于-rlptgoD    
-e SSH : 远程复制时,表示使用ssh协议作承载。如果ssh端口不是22,可以用-e ‘ssh -p 22’    
-z : 基于网络时使用,对文件压缩后传输   
--progress : 显示压缩进度条的,简写-P   
--stats : 显示如何执行压缩和传输的,也就是显示传输状态的
--

更多的详细信息,请通过man rsync来进行查看。

需要注意的是:rsync命令在使用中,如果源参数的末尾有斜线,就会复制指定目录内的内容,而不复制目录本身;如果没有斜线,则会复制目录本身。目标参数的末尾有没有斜线都不影响。

接下来,请看下面两个例子:

[root@rsync-server /]# rsync -a /rsync /backup  #会把目录rsync直接同步至/backup目录中去
[root@rsync-server /]# rsync -a /rsync/ /backup #会把目录中的data/中的内容同步至/backups目录中

现在,我们在shell模式下,进行rsync的同步。

实例1:测试本地rsync同步

[root@rsync-server ~]# mkdir /rsync     #创建rsync测试目录
[root@rsync-server ~]# touch /rsync/test    #在rsync测试目录下建立test.txt文件
[root@rsync-server ~]# chmod -R 700 /rsync     #授权一下以查看同步后是不是保持了权限属性
[root@rsync-server rsync]# ll -a /rsync/
total 8
drwx------.  2 root root 4096 Jun  4 01:01 .
dr-xr-xr-x. 26 root root 4096 Jun  4 01:01 ..
-rwx------.  1 root root    0 Jun  4 01:01 test
[root@rsync-server ~]# rsync -avz /rsync/ /tmp
sending incremental file list
./
test
 
sent 78 bytes  received 34 bytes  224.00 bytes/sec
total size is 0  speedup is 0.00
[root@rsync-server ~]# ls -l /tmp/test 
-rwx------. 1 root root 0 Jun  4 01:01 /tmp/test

上面的例子,演示了将本地/rsync目录下的文件,同步到/tmp目录下。其中使用的参数,-avz上面讲过。如果不明白,可以去上面看每个参数的详细介绍。

3、远程shell模式(remote shell mode)

远程shell模式的话,和shell模式是异曲同工。只不过,因为是要通过远程,因此我们需要指定远程主机的IP,如果采用ssh我们还需要指定ssh的端口等等。

远程shell模式,常规分为如下两种情况,其语法分别为:

拉取pull :rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST
推送push:rsync [OPTION]... [USER@]HOST:SRC [DEST]

下面为大家拆解一下命令:

1)Rsync为同步的命令
2)[OPTION]... 为同步时的参数选项
3)[USER@]HOST... 为Rsync同步的远程的连接用户和主机地址
4)SRC为源,即需要拷贝的分区、文件或目录等,和HOST之间用一个冒号连接
5)[DEST]为目地分区、文件或目录等

大家可以发现,拉取和推送,不一样的地方就是源和目标换了位置。其中拉取,表示从远端主机把数据同步到执行命令的本地主机相应目录。(需要注意,拉取的话,远端主机上一定要安装rsync,不然会拉取失败)。推送,表示从本地主机执行命令把本地的数据同步到远端主机指定目录下

下面我们来看一个案例:

拉取实例:

老大要求拉取172.16.100.1这台服务器上的etc目录到我们的备份服务器172.16.100.2上的/backup目录下。

操作:

通过ssh连接到172.16.100.1这台服务器上,然后执行如下命令:

[root@rsync-server ~]# rsync -vzrtopg --progress -e ‘ssh -p 22’ root@172.16.100.1:/etc /backup
语法说明:
1)-vzrtopg 相当于上文的-avz,表示同步时文件和目录属性不变。
2)--progress 显示同步的过程,可以用-p替换
3)-e ‘ssh -p 22’,表示通过ssh的通道传输数据。如果ssh是默认的22号端口,此处的-p 22可省略。
4)root@192.168.1.111:/etc 远程的主机用户,地址,路径
5)/backup本地(172.16.100.2)的路径

推送实例:

公司内部有一台svn服务器(172.16.100.2),公司站点的更新代码通过后台的测试服务器测试之后,经过svn同步到svn服务器。老大要求你将svn服务器上的代码,推送到前台的服务器(172.16.100.1)上。

操作:通过ssh连接到svn服务器(172.16.100.2)上,然后执行如下命令

[root@rsync-server ~]# rsync -avz --progress -e ‘shh -p 22’ /webrepo root@172.16.100.1:/data/web/html

特别说明:

1)上面两个例子中的数据同步都是加密传输的,因为是通过ssh通道进行数据传输的。

2)在传输前需要进行连接用户(一般为系统用户)密码验证,需要手工输入。这里我们可以通过配置ssh互信来实现免验证方式同步。

3)rsync软件必须安装在本地及远程服务器上

4、服务模式(daemon mode)

RSYNC的服务模式,部署时分为rsync的服务端和rsync的客户端。需要注意的是,rsync 的服务端和客户端都是一个软件包,如果你启用了 rsync 的服务模式,则该主机就变成 rsync 服务器。因此我们需要将 rsync 分别安装于服务端和客户端,服务端和客户端使用同一个 rsync 软件包来实现远程镜像和定期同步更新。

rsync 服务端可同时备份多个客户端的数据,多个服务端备份一个客户端的数据。 rsync 默认端口为 873,服务器在该端口接收客户的匿名或者认证方式的备份请求。

rsync 服务端在使用之前需要进行必要的配置,其配置文件为 /etc/rsyncd.conf,该文件默认没有,需要自己手动创建。Rsync服务端通过/etc/rsyncd.conf进行认证、访问、日志记录等控制,该配置文件包括全局参数、模块参数等设置。

rsyncd.conf 文件中 [module] 之前的所有参数为全局参数,也可以在全局参数部分定义模块参数。在这种情况下该参数的值就是所有模块的默认值。全局参数设置程序使用的端口号,指定消息文件、日志文件 pid 文件以及发送日志消息的级别。模块参数主要定义服务端哪个目录需要被同步。用户可根据不同的需要指定多个模块,每个模块对应需要备份的一个目录树,即若有 N 个需要备份的目录树,则需要 N 个模块与之对应。模块中可以定义许多参数。下面,我们拿出来一个rsyncd.conf文件,来给大家做详解:

uid = rsync    # 指定的模块传输文件时所用的用户身份
gid = rsync    # 指定的site模块传输文件时所用的用户组身份
port=873       # 默认端口
use chroot = no # 默认为true,修改为no,增加对目录文件软连接的备份
max connections = 200  # 指定最大并发连接数以保护服务器,超过限制的连接请求将被告知随后再试。默认值为 0,即没有限制。
timeout = 300          # 服务器会话的超时时间
pid file = /var/run/rsyncd.pid   # 进程启动后,进程号存放路径
lock file = /var/run/rsyncd.lock # 服务启动、停止会用到锁文件
log file = /var/log/rsyncd.log   # 指定日志文件的路径
Log fromat = %h %o %f %l %b      # 指定日志记录的格式
motd file = /etc/rsyncd.motd     # 登陆消息提示文件,可以不配置。默认为空。
[test]         # 模块名称,名称可以任意写,不过一般是以路径命名,最好见名意
Comment = test # 模块信息描述,该描述连同模块名在客户连接得到模块列表时显示给客户。默认没有描述定义
path=/test/    # 指定供备份的目录路径,必须指定该参数。该目录路径是rsync服务端的一个路径,提供给客户端上传或下载
ignore erros   # 忽略错误
read only = false  # 设定是否允许客户上载文件。若为 true 任何上载请求均会失败,若为 false 且客户端拥有服务器目录读写权限则可以上载。默认值为 true 。
write only 设定是否允许客户下载文件。若为 true 任何下载请求均会失败,默认值为 false 。
list = false       # 设定当客户请求可以使用的模块列表时,是否列出该模块。若为 false,则创建隐藏的模块。默认值为 true
hosts allow=192.168.137.0/24  # 指定允许客户连接的 IP 地址。可以为单个 IP 地址或整个网段。多个 IP 或网段需要以空格隔开。默认是允许所有主机连接。
hosts deny=*   # 指定拒绝连接的客户IP地址,设置方式和hosts allow相同。
Dont commpress # 指定不进行压缩处理即可传输的文件,默认值是 *.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz
auth users = rsync_backup  # 该选项指定由空格或逗号分隔的用户名列表,只有这些用户才允许连接该模块。这里的用户不一定是客户端存在的用户。如果"auth users"被设置,那么客户端发出对该模块的连接请求时,需要对用户身份进行验证。用户的名和密码以明文方式存放在"secrets file"选项指定的文件中。默认情况下无需密码就可以连接模块 ( 也就是匿名方式 )。
secrets file = /etc/rsync.password # 虚拟用户的密码文件
exclude = common/   # 用来指定多个由空格隔开的多个文件或目录 ( 相对路径 ),并将其添加到 exclude 列表中。这等同于在客户端命令中使用 --exclude 参数。一个模块只能指定一个 exclude 选项。但是需要注意的一点是该选项有一定的安全性问题,客户端很有可能绕过 exclude 列表,如果希望确保特定的文件不能被访问,那就最好结合 uid/gid 选项一起使用。
pre-xfer exec, post-xfer exec  # 设置可在文件传输前/后执行的命令。若在文件传输前执行的命令失败,则取消本次传输操作。

以上就是,rsyncd.conf的详细配置信息了。我将很多的默认不显示的参数也列举了出来,大家使用的时候可以灵活掌握。

下面,我就带大家来一起配置一个 rsync的服务端和rsync的客户端!

环境
CentOS6.5 x86_64位 采用最小化安装,系统经过了基本优化
selinux为关闭状态,iptables为无限制模式
源码包存放位置:/root
服务器架构:
rsync-server:172.16.100.1
rsync-client:172.16.100.2

RSYNC 服务端部署:

1、安装rsync,并且配置服务端主配置文件

[root@rsync-server ~]# yum install rsync -y
[root@rsync-server ~]# vim /etc/rsyncd.conf
uid = root
gid = root
use chroot = no
max connections = 200
timeout = 300
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
ignore errors
read only = false
list = false
hosts allow = 172.16.100.0/24
hosts deny = *
auth users = rsync_backup
secrets file = /etc/rsync.password
[sunsky]
path = /test

2、创建 rsync.password 作为用户密码文件

[root@rsync-server ~]# touch /etc/rsync.passord
[root@rsync-server ~]# chmod 600 /etc/rsyncd.password
[root@rsync-server ~]# vim rsyncd.password  #里面记录条目的格式为“用户 : 密码”
    rsync_backup:redhat

3、(可选)创建 rsync.motd 作为登录消息文件。该文件为选择性配置文件,生产环境不推荐使用。

[root@rsync-server ~]# touch /etc/rsyncd.motd
[root@rsync-server ~]# vim rsyncd.conf
============================
This is Critical Data Server
=============================

4、创建模块中指定的文件

[root@rsync-server ~]# mkdir /test
[root@rsync-server ~]# chown root.root /test   #更改目录的权限为rsyncd.conf中uid和gid指定属主和属�

5、以守护进程方式启动 rsync

Rsync服务端的启动分2种,一种是交给 xinetd 去管理,另外就是自己手动配置守护进程。

A、手动配置rsync守护进程

[root@rsync-server ~]# /usr/bin/rsync --daemon  --config=/etc/rsyncd.conf  #注意如果你的rsyncd.conf文件在/etc/目录下,就不需要再用--config去指定了。--daemon是以守护进程的方式启动

我们可以将上面的命令写入 /etc/rc.local 中,这样当系统启动时,就会自动以守护进程的方式去运行 rsync。

补充:

重启rsync的组合命令

[root@rsync-server ~]# pkill rsync  #关闭rsync服务
[root@rsync-server ~]# rsync --daemon #启动rsync服务
[root@rsync-server ~]# ps -ef | grep rsync   #检查是否启动

B、交由xinetd管理

[root@rsync-server ~]# yum install xinetd  #安装xinetd
[root@rsync-server ~]# vim /etc/xinetd.d/rsync 
     disable= no  # 默认为yes,需要将他设置为no,让xinetd接管rsync服务。注意,如果你使用手动的方式,这里就修改为no,即拒绝xinetd接管rsync服务。
[root@rsync-server ~]# /etc/init.d/xinetd  start # 启动xinetd服务,则默认会以守护进程方式启动rsync 服务

6、检查服务状态

[root@rsync-server ~]# netstat -lntup |grep 873
[root@rsync-server test]# netstat -lntup |grep 873
tcp        0      0 0.0.0.0:873                 0.0.0.0:*                   LISTEN      10234/rsync         
tcp        0      0 :::873                      :::*                        LISTEN      10234/rsync

或者

[root@rsync-server ~]# lsof -i tcp:873 
[root@a test]# lsof -i tcp:873
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
rsync   10234 root    3u  IPv4  93239      0t0  TCP *:rsync (LISTEN)
rsync   10234 root    5u  IPv6  93240      0t0  TCP *:rsync (LISTEN)

补充:

手动启动rsync的常见参数:

[root@rsync-server ~]# rsync --daemon   # daemon 表示以守护进程的方式启动rsync服务
常用启动参数:
--daemon   # 表示以守护进程的方式启动rsync服务
--address  # 绑定指定ip地址提供服务,即服务器是多网卡模式或多虚拟IP模式,需要指定某个固定ip提供服务
--config=FILE  # 更改配置文件路径,而不去使用默认的/etc/rsyncd.conf
--port=PORT    # 更改其它端口提供服务,而不去使用模式的873端口。

以上即为rsync服务端的整个配置步骤了!

RSYNC 服务端已经部署完毕,接下来如果要使用的话,肯定还需要搭配 rsync 客户端才行!下面就来看,rsync客户端怎么部署!

RSYNC 客户端部署

RSYNC 客户端部署起来非常简单,我们仅仅需要安装 rsync 软件,然后创建一个本地密码文件。该密码文件为对应rsync 服务端配置文件里面每个模块下面的虚拟用户的密码,以此来实现免密码同步!

操作如下:

1、安装rsync

[root@rsync-server ~]# yum install rsync -y

2、配置本地密码文件

[root@rsync-server ~]# vim /etc/rsync.password   # 该文件里面仅存放密码即可
   redhat
[root@rsync-server ~]# cat /etc/rsync.password   # 配置完毕之后检查
[root@rsync-server ~]# ll /etc/rsync.password    # 配置完毕之后检查

OK!!!

RSYNC的服务端和客户端都配置完毕,现在我们可以进行测试了。

我们需要去rsync客户端,来完成下面的测试操作。需要注意,测试同样分为两种情况,每种情况又有两种语法写法,分别为:

拉取:①rsync [OPTION...] [USER@]HOST::SRC... [DEST]
      ②rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
推送:①rsync [OPTION...] SRC... [USER@]HOST:DEST
      ②rsync [OPTION...] SRC...  rsync://[USER@]HOST[:PORT]/DEST

特别值得注意的是,与远程shell模式命令不同的是,第①种语法格式, [USER@]HOST::SRC和 [USER@]HOST::DEST结尾处,均为双冒号连接SRC或DEST。另外,这个SRC或DEST已经不再是路径了,而是守护进程中配置的模块的名称了。

下面列举我们在rsync客户端上,对rsync服务端进行拉取或推送的操作范例:

第一种格式:

拉取:

rsync -avzP rsync_backup@172.16.100.1::sunsky /test/ --password-file=/etc/rsync.password

推送:

rsync -avzP /test rsync_backup@172.16.100.1::sunsky --password-file=/etc/rsync.password

第二种格式:

拉取:

rsync -avzP rsync://rsync_backup@172.16.100.1:/sunsky/ /test/ --password-file=/etc/rsync.password

推送:

rsync -avzP /test/ rsync://resync_backup@192.168.1.111:/sunsky/  --password-file=/etc/rsync.password

以上就是,rsync整个服务端和客户端的配置。

在生产环境中,我们可以专门部署一台rsync服务器,专门负责接收业务服务器的日志归档和配置文件归档。当然,我们也可以部署在svn服务器之前,来作为网站代码推送的服务器,或者说一台web服务器专门用来做分发的时候。

但是我们知道,我们的日志归档都是在凌晨,因此我们不可能天天晚上去做向rsync服务端的推送操作。并且,如果日常web内容做分发的次数频繁的话,我们不可能每时每刻都盯着它去做手动推送。因此我们可以借助crontab计划任务来实现定时推送。

[root@rsync-server ~]# crontab -e
# Automatic synchronization log files at 1 a.m
* 1 * * * /usr/bin/rsync-avzP rsync_nobody@172.16.100.1::weblog /data/log/  --password-file=/etc/rsyncd.passwd > /dev/null 2>&1
# Automatic distribution site file points every second of every day
* * * * * /usr/bin/rsync-avzP --delete rsync_nobody@172.16.100.1::webdata /data/web/  --password-file=/etc/rsyncd.passwd > /dev/null 2>&1

注意:上面用到的weblog和webdata都是模块的名字,我们在rsyncd.conf里面指定模块所对应的目录路径。

但是,我们仍然会发现一个问题,虽然使用计划认为能满足我们的日志归档定时推送到rsync服务端,但是每次都有1分钟的延迟。并且,在某些作为网站发布平台的情况下,rsync每分钟都去检查整体一致性然后做推送,这样子非常耗费资源。因此,我们需要对此种情况进行改良。在后面一篇博文,我会带大家一起了解rsync+inotify,借助rsync+inotify来实现实时同步文件。

在本文最后面,我贴上rsync的--delete和--exclude的操作效果!

--delete操作如下:

[root@rsync-server ~]# ls /test/  #查看rsync服务端,sunsky模块下的/test目录的文件列表
e
[root@rsync-client ~]# ls /test/   #查看rsync客户端本地/test目录的文件列表
a  b  c  d

以上为操作前的环境,请保持这个环境一致,然后做如下操作:(下面的推送和拉取都是基于此环境做的)

在rsync客户端做拉取操作:

[root@rsync-client ~]# rsync -avzP --delete rsync_backup@172.16.100.1::sunsky /test/ --password-file=/etc/rsync.password
receiving incremental file list
deleting d
deleting c
deleting b
deleting a
./
e
           0 100%    0.00kB/s    0:00:00 (xfer#1, to-check=0/2)
 
sent 86 bytes  received 143 bytes  458.00 bytes/sec
total size is 0  speedup is 0.00
[root@rsync-client ~]# ls /test/
e 
[root@rsync-server ~]# ls /test/
e

我们发现,rsync客户端本身的a,b,c,d文件都消失了,取而代之的是e文件,并且我们在rsync的拉取过程中,也能看到删除操作!

在rsync客户端做推送操作:

[root@rsync-client ~]# rsync -avzP --delete /test/ rsync_backup@172.16.100.1::sunsky --password-file=/etc/rsync.password
sending incremental file list
./
deleting e
a
           0 100%    0.00kB/s    0:00:00 (xfer#1, to-check=3/5)
b
           0 100%    0.00kB/s    0:00:00 (xfer#2, to-check=2/5)
c
           0 100%    0.00kB/s    0:00:00 (xfer#3, to-check=1/5)
d
           0 100%    0.00kB/s    0:00:00 (xfer#4, to-check=0/5)
 
sent 201 bytes  received 87 bytes  576.00 bytes/sec
total size is 0  speedup is 0.00
[root@rsync-client ~]# ls /test/
a  b  c  d
[root@rsync-server ~]# ls /test/
a  b  c  d

我们发现,rsync服务端本身的e文件消失了,取而代之的是a,b,c,d文件,并且我们在rsync的推送过程中,也能看到删除操作!

--exclude操作如下:

[root@rsync-server ~]# tree /test/
/test/
0 directories, 0 files
[root@rsync-client ~]# tree /test/
/test/
├── a
├── b
├── c.txt
├── x
│   └── xxx.txt
└── x.txt
2 directories, 4 files

以上为操作前的环境,请保持这个环境一致,然后做如下操作:

在rsync客户端做推送操作:

[root@rsync-client ~]# rsync -avz --exclude=*.txt /test/ root@172.16.100.1:/test/
root@172.16.100.1's password: 
sending incremental file list
./
a
b
x/
sent 154 bytes  received 57 bytes  60.29 bytes/sec
total size is 0  speedup is 0.00

在rsync服务端进行查看同步效果:

[root@rsync-server ~]# tree /test/
/test/
├── a
├── b
└── x
1 directory, 2 files

我们可以发现,只要是能被*.txt匹配到的都没有被推送过去!

如果说,你有很多需要排除的目录或者文件,不希望他们被同步过去,此时你可以使用--exclude-from参数,该参数后面跟一个文件,你可以将需要匹配排除的项写到该文件里面!

例子:

在rsync客户端做推送操作:

[root@rsync-client ~]# cat /tmp/exclude 
x
*.txt
[root@rsync-client ~]# rsync -avz --exclude-from=/tmp/exclude /test/ root@172.16.100.1:/test/
root@172.16.100.1's password: 
sending incremental file list
./
a
b
xx/
sent 151 bytes  received 57 bytes  59.43 bytes/sec
total size is 0  speedup is 0.00

在rsync服务端进行查看同步效果:   

[root@rsync-server ~]# tree /test/
/test/
├── a
├── b
└── xx
1 directory, 2 files

以上就是我们的--exclude和--exclude-from的详细用法!

本文出自 “Not Only Linux” 博客,请务必保留此出处http://nolinux.blog.51cto.com/4824967/1431426

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Easter79 Easter79
3年前
swap空间的增减方法
(1)增大swap空间去激活swap交换区:swapoff v /dev/vg00/lvswap扩展交换lv:lvextend L 10G /dev/vg00/lvswap重新生成swap交换区:mkswap /dev/vg00/lvswap激活新生成的交换区:swapon v /dev/vg00/lvswap
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
Java获得今日零时零分零秒的时间(Date型)
publicDatezeroTime()throwsParseException{    DatetimenewDate();    SimpleDateFormatsimpnewSimpleDateFormat("yyyyMMdd00:00:00");    SimpleDateFormatsimp2newS
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这