rsync是利用 rsync算法同步文件的一种机制。

rsync有四种工作模式:

第一个是shell模式,也称为本地模式

例如:

rsync + inotify 总结_rsync inotify

rsync + inotify 总结_rsync inotify_02

/etc目录下的所有文件都会被复制到/test/etc

注意在shell,/etc 和 /etc/有所不同, /etc表示 /etc目录, 而 /etc/隐含等于 /etc/*

所以 cp-a /etc/ /tmp 和 cp-a /etc  /tmp 结果是完全不同的,对于rsync同样需要注意这一点。

 

 

第二个是远程shell模式,其利用SSH执行底层连接和传输;

 

echo"password"  | rsync -azv -e 'ssh -p 1998'   /rsync/httpd/ vps:/etc/httpd/

当然如果设置了使用密钥认证,就不需要密码了,我的因为SELinux导致ssh必须使用密码才能登陆,后来才发现,实验环境下就无所谓啦

 

第三个是列表模式,其工作方式与ls相似,即列出源的内容;-nv

例如

rsync + inotify 总结_rsync inotify_03

可以指定 -v-r 等参数

 

第四个模式是服务器模式rsync以守护进程方式运行,接收文件传输请求。在使用时,可以使用rsync命令把文件发送给守护进程,也可以向它请求文件。服务器模式非常适合创建中心备份服务器或项目存储库。

 

远程shell模式和服务器模式的差异在于,后者在源和目标名中使用两个冒号(:)

 

rsync-rl /www/htdocs HOST:/www

rsync-rl /www/htdocs HOST::htdocs

rsync命令常用选项

--daemon以 daemon模式启动

daemon模式的其它选项见 manpage DAEMON OPTIONS 

-v,--verbose 详细模式输出 

-q,--quiet 精简输出模式 

-c,--checksum 打开校验开关,强制对文件传输进行校验

-a,--archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD

 

--delete  delete extraneous files from dest dirs,从目标目录中删除源目录(文件)中没有的

-r,--recursive 对子目录以递归模式处理 

-l,--links 保留符号链结

--list-onlylist the files instead of copying them(好像列表模式不需要指定这个选项)

-n,--dry-run 测试运行,不进行任何修改

-p,--perms 保留文件权限

-t,--times 保留文件时间戳 

-g,--group 保留文件属组信息 

-o,--owner 保留文件属主信息

-D,--devices 保留设备文件即特殊文件信息

-exclude=PATTERN      exclude files matching PATTERN

--exclude-from=FILE    read exclude patterns from FILE

--include=PATTERN      don’t exclude files matching PATTERN

--include-from=FILE    read include patterns from FILE

--files-from=FILE      read list of source-file names from FILE


-e,--rsh=COMMAND 指定替代rshshell程序

-z,--compress 对备份的文件在传输时进行压缩处理

--password-file=filename在连接远程rsync服务器时指定密码文件所在

还可以使用两个选项监视传输的状态:--progress--stats

--progress显示进度条

--stats显示如何执行压缩和传输

 

rsync服务器模式配置

rsync的安装非常简单,而且系统一般有自带。

rsync的配置文件是 /etc/rsyncd.conf需要手工创建。

配置文件范例

#Section1: Global settings

port= 873

address= 173.254.227.40

#rsyncdxinetd运行时,portaddress被忽略

uid= nobody#传输文件时,rsync进程使用的用户身份

gid= nobody

usechroot = no

maxconnections = 3

timeout= 300

strictmodes = yes

#是否检查口令文件的权限。如果设置为yes,密码文件的权限必须只有root可读,其它用户无权限

pidfile = /var/run/rsyncd.pid

#lockfile=/tmp/rsyncd.lock

logfile = /var/log/rsyncd.log

#Section 2Directoryto be synced

 

[htdocs]

path= /web/htdocs

comment= backup the web document

ignoreerrors = yes

readonly = no

#hostsallow = 172.16.0.0/16

#hostsdeny = *

list= no

uid= root

gid= root

authusers = www#客户端连接使用的账号,类似于samba的账号,跟系统账号无关

secretsfile = /etc/.rsync.passwd

 

[htconfig]

path= /etc/httpd

ignoreerrors = yes

readonly = no

list= yes

uid= root

gid=root

authusers = www

secretsfile = /etc/.rsync.passwd

 

配置分为全局段和模块段,全局段指定全局的和缺省的设置。

密码文件格式

用户名:密码

echo"www:q3zbZ" > /etc/.rsync.passwd

chmod600 /etc/.rsync.passwd

 

客户端设置

echo"q3zbZ" > /etc/.rsync.pass

chmod600 /etc/.rsync.pass

使用如下命令即可同步远程服务器上的数据

rsync-avz --progress --password-file=/etc/.rsync.pass  www@vps::htdocs /backup/htdocs

 

rsyncd可以独立运行,也可以挂在 xinetd下运行,后者需要修改/etc/xinetd.d/rsync文件,设置 disable= no

注意防火墙放行相应端口的数据通过

 

 

Rsync+ inotify 合作备份数据

单靠 rsync很难实现实时同步数据,而且rsync虽然是比较源、目标文件的差异之后才只针对差异的文件进行必要的同步,这样虽然较之简单的复制大大提高的效率。但如果需要扫描的文件过多的话,也会产生大量的磁盘I/O。如果有一种机制,实时监控需要同步的文件,当文件发生改变时,就通知rsync进行数据同步,岂不美哉!

Inotify正是提供这一机制的。

 

inotifyLinux内核2.6.13版本之后新增的一个子系统(API),通过inotify可以实时监控文件系统中添加、删除、修改、移动等各种细微事件。

inotify可以监视的文件系统常见事件包括:

IN_ACCESS:文件被访问

IN_MODIFY:文件被修改

IN_ATTRIB,文件属性被修改

IN_CLOSE_WRITE,以可写方式打开的文件被关闭

IN_CLOSE_NOWRITE,以不可写方式打开的文件被关闭

IN_OPEN,文件被打开

IN_MOVED_FROM,文件被移出监控的目录

IN_MOVED_TO,文件被移入监控着的目录

IN_CREATE,在监控的目录中新建文件或子目录

IN_DELETE,文件或目录被删除

IN_DELETE_SELF,自删除,即一个可执行文件在执行时删除自己

IN_MOVE_SELF,自移动,即一个可执行文件在执行时移动自己

 

通过/proc接口中的如下参数设定inotify能够使用的内存大小:

1/proc/sys/fs/inotify/max_queue_events

应用程序调用inotify时需要初始化inotify实例,并时会为其设定一个事件队列,此文件中的值则是用于设定此队列长度的上限;超出此上限的事件将会被丢弃;

2/proc/sys/fs/inotify/max_user_instances

此文件中的数值用于设定每个用户ID(以ID标识的用户)可以创建的inotify实例数目的上限;

3/proc/sys/fs/inotify/max_user_watches

此文件中的数值用于设定每个用户ID可以监控的文件或目录数目上限;

 

inotify-tools则是利用这一API开发的套件,它包括一个C库和几个命令行工具,这些命令行工具可用于通过命令行或脚本对某文件系统的事件进行监控。inotify-tools提供了两个重要工具

inotifywait和 inotifyswatch

 

inotifywait的使用简介:

inotifywait [-hcmrq] [-e <event> ] [-t <seconds> ] [--format <fmt>] [--timefmt <fmt> ] <file> [ ...

]

常用选项:

-m,--monitorinotifywait的默认动作是在监控至指定文件的特定事件发生一次后就退出了,而使用此选项则可实现持续性的监控;

-r,--recursive:递归监控指定目录下的所有文件,包括新建的文件或子目录;如果要监控的目录中文件数量巨大,则通常需要修改/proc/sys/fs/inotify/max_users_watchs内核参数,因为其默认值为8192

 

-e <event>, --event <event>

Listenfor specific event(s) only.  The events which can be listened for are  listed  in  the

EVENTSsection.  This option can be specified more than once.  If omitted,all events are lis-

tenedfor.

此处<event>包括access,modify, attrib, close_write, close_nowirte, close, open, moved_to,moved_from, move, create, delete, delete_selt等;

--exclude<pattern>

Do not process any events whose filename matches the specified POSIXextended regular expres-

sion,case sensitive.

 

--excludei<pattern>

Donot process any events whose filename matches the specified POSIXextended regular  expres-

sion,case insensitive.

-t<seconds>, --timeout <seconds>

Exit if  an appropriate event has not occurred within <seconds>seconds. If <seconds> is zero

(thedefault), wait indefinitely for an event.

--timefmt<fmt>:当在--format选项中使用%T时,--timefrt选项则可以用来指定自定义的符合strftime规范的时间格式,此时间格式可用的格式符可以通过strftime的手册页获取;--timefrt后常用的参数是'%d/%m/%y%H:%M'

--format<fmt>:自定义inotifywait的输出格式,如--format'%T %w %f';常用的格式符如下:

%w   This will be replaced with the name of the Watched file on whichan event occurred.

%f   When an event occurs within a directory, this will be replacedwith the name of the File which

causedthe event to occur.  Otherwise, this will be replaced with an emptystring.

如果被监控的目录发生事件,用引起事件的文件名来替换%f.

%e  Replaced with the Event(s) which occurred, comma-separated.

%Xe  Replaced with the Event(s) which occurred, separated by whichevercharacter is in the place of

             ‘X’.

%T   Replaced  with  the current Time in the format specified by the--timefmt option, which should

bea format string suitable for passing to strftime(3).

 

使用范例如下:

rsync + inotify 总结_rsync inotify_04


编写脚本监控本地需要同步的目录,当目录发生特定改动时,执行rsync连接远程服务器上的 rsyncd守护进程,然后针对改变的文件进行数据同步。脚本范例如下:

 

#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin

RHOST=172.16.9.1
DISTINATION=htdocs
SRCDIR=/web/htdocs/
AUTH_USER=www
PASSWDFILE=/etc/.rsyncpass
LOGFILE=/tmp/rsync.log

inotifywait--monitor --recursive  --eventsclose_write,move_from,move_to,delete,attrib --timefmt '%d/%m/%y%H:%M' --format '%T %w %f ' \
$SRCDIR| while read DATE TIME DIR CHANGED_FILE
do
rsyncaqz --delete --password-file="$PASSWDFILE" $AUTH_USER@RHOST::$DISTINATION &> /dev/null
echo-e "At $DATE $TIME,\t${DIR}$CHANGED_FILE was backuped via rsync"
done>  $LOGFILE

 

 

 

其它:

经过我的测试,觉得 create事件发生时不宜进行同步,使用 close_write比较好

move A file or directory was moved from or to a watched directory.   Note that  this  is  actuallyimplemented  simply  by  listening  for both  moved_to and moved_from, hence all close events eceived will beoutput as one or both of these, not MOVE.即监控move事件 包括move_to和 move_from,但输出时不会显示 move,只会显示 move_to和 move_from

上面的脚本有参考书上和老师的,不过我没有做测试执行。