1.Rsync介绍

rsyncremote sync,是类UNIX操作系统下的数据镜像备份工具。

rsync是基于C/S模式的,因此分为客户端和服务器端的配置。第一次同步时 rsync 会复制全部内容,但在下一次只传输修改过的文件。rsync 在传输数据的过程中可以实行压缩及解压缩操作,因此可以使用更少的带宽。

运行 Rsync server 的机器也叫backup server ,一个 Rsyncserver 可同时备份多个 client 的数据;也可以多个 Rsync server 备份一个 client 的数据。

Rsync 可以搭配 rsh ssh 甚至使用 daemon 模式。 Rsyncserver 会打开一个 873 的服务通道 (port) ,等待对方 Rsync 连接。连接时,Rsync server 会检查口令是否相符,若通过口令查核,则可以开始进行文件传输。第一次连通完成时,会把整份文件传输一次,下一次就只传送二个文件之间不同的部份。

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

Rsync 的基本特点如下:

1. 可以镜像保存整个目录树和文件系统;

2. 可以很容易做到保持原来文件的权限、时间、软硬链接等;

3. 无须特殊权限即可安装;

4. 优化的流程,文件传输效率高;

5. 可以使用 rcp ssh 等方式来传输文件,当然也可以通过直接的 socket 连接;

6. 支持匿名传输。

2.Rsync的安装

官网:http://rsync.samba.org

默认情况下,在RHEL6.3系统中已经提供了rsync软件,可以直接使用yum进行安装。

yum install  -y rsync-*

通过rpm –qa | grep rsync查看系统中是否已经安装了rsync软件。

[root@server ~]#rpm -qa | grep rsync

rsync-3.0.6-9.el6.x86_64

[root@server ~]#

如果想使用最新版本的rsync软件包的话,可以到官网上下载最新的软件并予以安装。

下载:wget  http://rsync.samba.org/ftp/rsync/rsync-3.1.0.tar.gz

解压:tar –zxvf rsync-3.1.0.tar.gz

[root@server opt]#ll

total 868

drwxrwxr-x. 10 rootroot   4096 Sep 29 04:55 rsync-3.1.0

-rw-r--r--.  1 root root 883901 Feb  8 11:14 rsync-3.1.0.tar.gz

[root@server opt]#

进入到解压目录:cd rsync-3.1.0

在该目录下,可以查看INSTALLREADME文件查看该软件是如何进行安装的,根据提示进行操作。需要先安装gcc

[root@serverrsync-3.1.0]# ./configure

[root@serverrsync-3.1.0]# make

[root@serverrsync-3.1.0]# make install

安装位置在:/usr/local/bin/rsync

如果你的系统中已经安装了rsync的话,可以用which –a rsync来查看系统中有多少个rsync指令。

配置文件:/etc/rsyncd.conf。默认情况下,该文件是不存在的,需要手动创建。

3.Rsync的语法

1Local: rsync [OPTION...] SRC... [DEST]

注释:本地复制

2Access via remote shell:

Pull: rsync [OPTION...] [USER@]HOST:SRC...[DEST]

注释:将远程主机上的文件复制到本地。

Push: rsync [OPTION...] SRC...[USER@]HOST:DEST

注释:将本地的文件复制到远程主机上。

3Access via rsync daemon:

Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]

rsync[OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]

Push: rsync [OPTION...] SRC... [USER@]HOST::DEST

rsync [OPTION...]SRC... rsync://[USER@]HOST[:PORT]/DEST

Usages with just one SRC arg and no DEST arg will listthe source files instead of copying.

注释:如果仅仅有一个SRC参数,没有DEST参数的话,则表示的是列出该目录下的内容。

USER:指定连接rsync服务器指定模块的用户名。


options

rsync参数的具体解释如下:
-v, --verbose
详细模式输出
-q, --quiet
精简输出模式
-c, --checksum
打开校验开关,强制对文件传输进行校验
-a, --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD
-r, --recursive 对子目录以递归模式处理
-R, --relative
使用相对路径信息
-b, --backup 创建备份,也就是对于目的已经存在有同样的文件名时,将老的文件重新命名为~filename。可以使用--suffix选项来指定不同的备份文件前缀。
  --backup-dir=DIR
将备份文件(~filename)存放在在目录下。
  --suffix=SUFFIX
定义备份文件前缀
-u, --update
仅仅进行更新,也就是跳过所有已经存在于DST,并且文件时间晚于要备份的文件。(不覆盖更新的文件)
-l, --links 保留软链结
-L, --copy-links
像对待常规文件一样处理软链结
  --copy-unsafe-links
仅仅拷贝指向SRC路径目录树以外的链结
  --safe-links
忽略指向SRC路径目录树以外的链结
-H, --hard-links 保留硬链结
-p, --perms 保持文件权限
-o, --owner 保持文件属主信息
-g, --group
保持文件属组信息
-D, --devices
保持设备文件信息
-t, --times 保持文件时间信息
-S, --sparse
对稀疏文件进行特殊处理以节省DST的空间
-n, --dry-run
现实哪些文件将被传输
-W, --whole-file
拷贝文件,不进行增量检测
-x, --one-file-system
不要跨越文件系统边界
-B, --block-size=SIZE
检验算法使用的块尺寸,默认是700字节
-e, --rsh=COMMAND
指定使用rshssh方式进行数据同步
   --rsync-path=PATH
指定远程服务器上的rsync命令所在路径信息
-C, --cvs-exclude
使用和CVS一样的方法自动忽略文件,用来排除那些不希望传输的文件
--existing
仅仅更新那些已经存在于DST的文件,而不备份那些新创建的文件
--delete 删除那些DST中有而SRC中没有的文件
--delete-excluded
同样删除接收端那些被该选项指定排除的文件
--delete-after
传输结束以后再删除
--ignore-errors
及时出现IO错误也进行删除
--max-delete=NUM
最多删除NUM个文件
--partial
保留那些因故没有完全传输的文件,以是加快随后的再次传输
--force
强制删除目录,即使不为空
--numeric-ids
不将数字的用户和组ID匹配为用户名和组名
--timeout=TIME IP
超时时间,单位为秒
-I, --ignore-times
不跳过那些有同样的时间和长度的文件
--size-only
当决定是否要备份文件时,仅仅察看文件大小而不考虑文件时间
--modify-window=NUM
决定文件是否时间相同时使用的时间戳窗口,默认为0
-T --temp-dir=DIR
DIR中创建临时文件
--compare-dest=DIR
同样比较DIR中的文件来决定是否需要备份
-P
等同于 --partial
--progress 显示备份过程
-z, --compress
对备份的文件在传输时进行压缩处理
  --exclude=PATTERN
指定排除不需要传输的文件模式
  --include=PATTERN
指定不排除而需要传输的文件模式
  --exclude-from=FILE
排除FILE中指定模式的文件
  --include-from=FILE
不排除FILE指定模式匹配的文件
--version 打印版本信息
--address 绑定到特定的地址
--config=FILE
指定其他的配置文件,不使用默认的rsyncd.conf文件
--port=PORT 指定其他的rsync服务端口
--blocking-io
对远程shell使用阻塞IO
-stats
给出某些文件的传输状态
--progress
在传输时显示传输过程
--log-format=formAT
指定日志文件格式
--password-file=FILE FILE中得到密码
--bwlimit=KBPS
限制I/O带宽,KBytes per second
-h, --help
显示帮助信息

常用的选项为: avz
具体的options信息,可以用man rsync查看。

4. Rsync命令格式练习

1. Local: rsync [OPTION...] SRC... [DEST]

作用:本地主机进行文件复制。类似于cp。如果只有一个SRC参数,没有DEST参数,则表示列出该目录下的内容,类似于ls

[root@server tmp]#ll

total 0

[root@server tmp]# rsync -a /etc/hoststest

[root@server tmp]# rsync -a /tmp/

drwxrwxrwt          4,096 2014/02/08 12:14:09 .

-rw-r--r--            158 2010/01/12 21:28:22 test

drwxrwxrwt          4,096 2014/02/08 09:24:42 .ICE-unix

drwx------          4,096 2014/01/09 14:57:13 .esd-0

srwxrwxrwx              0 2014/01/09 14:57:13.esd-0/socket

[root@server tmp]#

2.  Accessvia remote shell

Pull: rsync [OPTION...] [USER@]HOST:SRC...[DEST]

注释:将远程主机上的文件复制到本地。

Push: rsync [OPTION...] SRC...[USER@]HOST:DEST

注释:将本地的文件复制到远程主机上。

Pull

[root@server tmp]# rsync -avz--progress root@172.17.100.253:/opt/scripts /tmp/

The authenticity ofhost '172.17.100.253 (172.17.100.253)' can't be established.

RSA key fingerprintis 39:e2:ac:ce:7e:96:0b:cf:c9:4d:00:90:97:f7:aa:f3.

Are you sure youwant to continue connecting (yes/no)? yes

Warning:Permanently added '172.17.100.253' (RSA) to the list of known hosts.

root@172.17.100.253'spassword:

receiving incrementalfile list

scripts/

scripts/1+n.sh

           453 100%  442.38kB/s   0:00:00 (xfr#1, to-chk=14/16)

scripts/1.sh

           203 100%  198.24kB/s   0:00:00 (xfr#2, to-chk=13/16)

scripts/case1.sh

           439 100%  428.71kB/s   0:00:00 (xfr#3, to-chk=12/16)

scripts/echo-hello-world.sh

           422 100%  412.11kB/s   0:00:00 (xfr#4, to-chk=11/16)

scripts/full-name.sh

           373 100%  182.13kB/s   0:00:00 (xfr#5, to-chk=10/16)

scripts/function1.sh

           416 100%  135.42kB/s   0:00:00 (xfr#6, to-chk=9/16)

scripts/hello.sh

           450 100%  146.48kB/s   0:00:00 (xfr#7, to-chk=8/16)

scripts/menu.sh

           292 100%   95.05kB/s   0:00:00 (xfr#8, to-chk=7/16)

scripts/select.sh

           447 100%   10.39kB/s   0:00:00 (xfr#9, to-chk=6/16)

scripts/touch-3-files.sh

           854 100%   19.39kB/s   0:00:00 (xfr#10, to-chk=5/16)

scripts/yes-no-1.sh

           542 100%   12.31kB/s   0:00:00 (xfr#11, to-chk=4/16)

scripts/yes-no-2.sh

           565 100%    5.11kB/s   0:00:00 (xfr#12, to-chk=3/16)

scripts/yes-no-3.sh

           569 100%    4.75kB/s   0:00:00 (xfr#13, to-chk=2/16)

scripts/yes4.sh

           319 100%    2.64kB/s   0:00:00 (xfr#14, to-chk=1/16)

scripts/yes5.sh

           338 100%    2.68kB/s   0:00:00 (xfr#15, to-chk=0/16)


sent 300 bytes  received 4,780 bytes  483.81 bytes/sec

total size is6,682  speedup is 1.32

[root@server tmp]#

[root@server tmp]#ll

total 8

drwxr-xr-x. 2 root root 4096 Jan 24 15:49 scripts

-rw-r--r--. 1 rootroot  158 Jan 12  2010 test

[root@server tmp]#

Push

[root@server tmp]#rsync -avz /tmp/test root@172.17.100.253:/opt/

root@172.17.100.253'spassword:

sending incrementalfile list

test


sent 135 bytes  received 34 bytes  48.29 bytes/sec

total size is158  speedup is 0.93

[root@server tmp]#

[root@server1 ~]#ll /opt/

total 8

drwxr-xr-x 2 rootroot 4096 Jan 24 15:49 scripts

-rw-r--r-- 1 rootroot  158 Jan 12  2010 test

[root@server1 ~]#


5. Rsync工作在daemon模式的配置

配置文件:/etc/rsyncd.conf(需要手动创建)

默认端口:873

配置文件rsyncd.conf由两部分组成:参数和模块。参数的格式是“name = value”,模块的格式是[module]。在该文件中以#开始的表示注释,以\结尾的表示是上一行的延续。value可以是yes/no0/1true/false

启动服务的方式:/path/rsync –daemon

rsync可以通过xinetd这个superdaemon进行管理,也可以以stand alone的方式允许,如果以xinetd的方式进行管理的话,需要在/etc/services里面写入如下内容:

rsync   873/tcp

[root@server tmp]#grep rsync /etc/services

rsync           873/tcp                         # rsync

rsync           873/udp                         # rsync

如果以standalone的方式运行的话,需要用/PATH/rsync  --daemon的方式启动服务。

rsyncd.conf配置文件的参数分为全局参数和模块参数。全局参数(G)是指在【module】前面的参数。模块参数(M)是指在模块里面使用的参数,也可以用于全局。

全局参数如下:

motd file:指定motdmessage ofthe day)文件的位置。当客户端每一次连接时都会显示该文件中的内容,没有默认值。

pid file:存放rsync daemon服务的进程ID的文件名。

portrsync服务的监听端口。默认为873.

addressrsync服务监听的地址。

syslogfacility(全局):指定 rsync 发送日志消息给 syslog 时的消息级别
注意:如果启用该选项就要关闭log file选项,默认情况下log file选项会被启用.

模块选项如下(G/M表示也可以用于全局):

comment:指定模块的描述信息。(G/M

客户端测试:

[root@server1 ~]#rsync 172.17.100.254::

path:指定模块所映射的目录路径。

max connections:模块所允许的最大连接数。如果是0则表示没有限制,如果是负值则表示关闭该模块。(G/M)。如果用于全局,则表示所有模块的最大的连接数。

log file:指定日志文件的名称。(G/M

lock file:指定锁定文件的位置。默认为/var/run/rsyncd.lock。(G/M

read only:是否允许客户端上传。yes表示允许,no不允许。默认为no

write only:是否允许客户端下载。yes表示不允许客户端下载,no允许客户端下载。

list:是否允许客户端列出该模块。yes允许,no不允许。

可以用如下方法查看服务器上的模块:

[root@server1 ~]#rsync 172.17.100.254::

uidusernameuser ID。指定该模块以指定的用户传输文件

uidgroupnamegroup ID。指定该模块以指定的组传输文件

exclude:指定多个文件或目录(相对路径)不被同步,并将其添加到 exclude 列表中.多个文件(目录)用空格分隔.作用等同于在客户端命令中使用--exclude来指定模式.

include:该选项针对于exclude,即同步exclude中的哪个文件(目录),并将其添加到include列表中,覆盖了exclude指定的文件或目录。.多个文件(目录)用空格分隔.作用等同于在客户端命令中使用--include来指定模式.

exclude from:和exclude的作用一样,只不过是exclude是将排除的文件或目录作为value的,而excludefrom则是将排除的文件和目录写在文件中的,一行一个文件或目录。

include from:和include的作用一样,将包括的文件写在文件中。

authuserssecrets file:这两个选项只能组合使用
auth users指定由空格或逗号分隔的用户名列表,只有这些用户才允许连接该模块,这里的用户和系统用户没有任何关系,用户名和口令以明文方式存放在 secrets file 参数指定的文件中,格式为username:password,常用的文件名为:/etc/rsyncd.secrets

strictmodes:指定是否监测口令文件的权限.若为 yes 则口令文件只能被 rsync 服务器运行身份的用户访问,其他任何用户不可以访问该文件,默认为yes。也就是该文件的权限为600400

hostsallow:用一个主机列表指定哪些主机客户允许连接该模块.不匹配主机列表的主机将被拒绝.也就是说如果指定hosts allow那么不在hosts allow指定中的主机都将都拒绝.

hostsdeny用一个主机列表指定哪些主机不能连接rsync模块.如果hosts allowhosts deny同时指定一台主机,则以hosts allow为准.hosts allowhosts deny的格式可以是x.x.x.xx.x.x.x/n x.x.x.x/x.x.x.x的形式,也可以是主机名,要求能够被解析。

incomingchmod:设置用户上传文件到服务器端时权限。

outgoingchmod:设置用户从服务器端下载文件到客户端时的权限。

transferlogging:该选项开启则记录下载和上传操作

logformat通过该选项用户在使用transfer logging可以自己定制日志文件的字段.
其格式是一个包含格式定义符的字符串,但要注意log format使用要在transfer logging选项开启的时候才可以.

常用的如下:
%o表示服务端提供什么操作,比如是接收还是发送.

%a表示客户端的IP地址.

%m表示服务端的模块.

%P表示服务端模块指定的路径.

%f表示同步的文件.

%l表示同步文件的大小.

如:log format = [op]:%o [ip]:%a [module]:%m [path]:%P [file]:%f[size]:%l

ignoreerrors :可以忽略一些无关的IO错误

usechroot(全局/模块):若为 true, rsync 在传输文件之前首先 chroot path 参数所指定的目录下.这样做的原因是实现额外的安全防护,但是缺点是需要 root 权限,并且不能备份指向 path 外部的符号连接所指向的目录文件.


示例:

rsyncd.conf配置文件的内容:

[root@server ~]#cat /etc/rsyncd.conf

pid file =/var/run/rsyncd.pid

lock file =/var/run/rsyncd.lock

log file =/var/log/rsyncd.log

port = 873

address =172.17.100.254

motd file =/etc/motd


[test]

comment = testmodule

path = /tmp

uid = root

gid = root

read only = no

write only = no

list = yes

auth users = frame

secrets file =/etc/rsyncd.secrets

strict modes = yes

use chroot = yes

transfer logging =yes

ignore errors

log format =[op]:%o [ip]:%a [module]:%m [path]:%P [file]:%f [size]:%l

[root@server ~]#


启动服务:rsyncd –daemon

观察监听端口:netstat –tunlp | grep rsync

[root@server ~]#netstat -tunlp | grep rsync

tcp        0     0 172.17.100.254:873         0.0.0.0:*                   LISTEN      12330/rsync        

[root@server ~]#

查看客户端的模块名称和motd


[root@server1 tmp]#rsync frame@172.17.100.254::

==========================================

*   This is a Test System , You Can Do  *

*     AnyThing In It Except shutdown    *

*       the System , Thanks !           *

==========================================


test           test module

[root@server1 tmp]#

红色部分为MOTD消息。

×××部分为模块名称(test)和模块的说明信息(comment

上传文件测试:

[root@server1 tmp]#rsync -avz /etc/hosts root@172.17.100.254::test

==========================================

*   This is a Test System , You Can Do  *

*     AnyThing In It Except shutdown    *

*       the System , Thanks !           *

==========================================


Password:

@ERROR: auth failedon module test

rsync error: errorstarting client-server protocol (code 5) at main.c(1530) [sender=3.0.6]

[root@server1 tmp]#

出现这种问题是由于我们使用了非auth users,应该把root换成frameauth users)。

测试:

[root@server1 tmp]#rsync -avz /etc/hosts frame@172.17.100.254::test

==========================================

*   This is a Test System , You Can Do  *

*     AnyThing In It Except shutdown    *

*       the System , Thanks !           *

==========================================


Password:

sending incrementalfile list

hosts


sent 199 bytes  received 27 bytes  150.67 bytes/sec

total size is195  speedup is 0.86

[root@server1 tmp]#

上传成功。

查看log,这里定义的位置为/var/log/rsyncd.log,可以看到如下信息:

[op]:recv[ip]:172.17.100.253 [module]:test [path]:/tmp [file]:hosts [size]:195

这个就是我们使用log format所定义的日志格式,对客户端所做的操作就一清二楚。


如果要停止rsync服务的话,可以使用如下方法:

1.cat /var/run/rsyncd.pid  #找到rsyncd的进程号

2.kill -9 rsync-pid  #杀掉rsync的进程

3.rm –rf /var/run/rsyncd.pid  #删掉存放rsync进程号的文件


注意事项:

客户端跟服务端密码文件不一定非要一样.就是说服务端的内容可写为 username:password
客户端的内容只写为 password,这样在客户端使用--password-file指定密码文件时,才不会报错,如果客户端和服务器端都使用同样的格式(username:password),会提示password mismatch的问题。