rsync是利用 rsync算法同步文件的一种机制。
rsync有四种工作模式:
第一个是shell模式,也称为本地模式;
例如:
/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
例如
可以指定 -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 指定替代rsh的shell程序
-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
#当rsyncd由xinetd运行时,port和address被忽略
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 2:Directoryto 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正是提供这一机制的。
inotify是Linux内核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,--monitor:inotifywait的默认动作是在监控至指定文件的特定事件发生一次后就退出了,而使用此选项则可实现持续性的监控;
-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连接远程服务器上的 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
上面的脚本有参考书上和老师的,不过我没有做测试执行。