前面一篇博文介绍了rsync的主要使用及工作于服务器模式下的安装、配置。inotify是Linux内核中监控文件系统的一种事件机制,它负责监视文件系统的变化。如文件的创建、修改、删除等,并以事件的方式通知给应用程序。inotify-tools是一个基于内核的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可以监控的文件或目录数目上限

 

inotifywait命令

inotifywait尤其适用于在脚本中等待某事件的发生,并可基于特定的事件执行相应操作。如将其用于脚本中监控某指定目录中的文件上的修改、新建、删除、属性信息的改变,而后使用rsync命令将某事件对应的文件同步至其它主机上。其常用选项如下:

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

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

-e <event>, --event <event>:指定要监控的特定事件,默认是监控所有的事件;此处<event>包括access, modify, attrib, close_write, close_nowirte, close, open, moved_to, moved_from, move, create, delete, delete_selt等;

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

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

      %w:显示被监控文件的文件名;

      %f:如果发生某事件的对象是目录,则显示被监控目录的名字;默认显示为空串;

      %T:使用--timefmt选项中自定义的时间格式

 

举例:

        # inotify -r -m --timefmt '%d/%m/%y %H:%M' --format '%T %w %f' -e create,delete,modify,close_write /tmp/src

        持久监控/tmp/src目录及其内部所有文件上发生的create,delete,modify,close_write事件。

 

两台主机间文件同步备份

文件源主机A : 192.168.100.107            要同步的源文件: /var/mydata

文件备份服务器B : 192.168.100.105     备份存放位置: /tmp/mydata

假定在服务器B上已经安装配置好了rsync服务,并已经正常开启了服务。在主机A上也已经安装好了rsync,并已测试通过两主机之间通过rsync同步文件的功能。只需安装inotify-tools,然后编写相应的脚本。

 

1) 编译安装inotify-tools

假定已经在官方网站下载好了源码包inotify-tools-3.13.tar.gz,位于/tmp/目录下。

# tar xf inotify-tools-3.13.tar.gz
# cd inotify-tools-3.13
# ./configure
# make && make install
# echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf
# ldconfig

2) 编写脚本/root/mydatasync.sh

#!/bin/bash
#

syncServer=192.168.100.105
syncShareName=mydata
srcdir=/var/mydata/

inotifywait -mr --timefmt "%y%m%d %H%M" --format "%T %w %f" \
        -e create,modify,delete,close_write,attrib $srcdir \
        | while read DATE TIME DIR FILE; do
    fileName=${DIR}${FILE}
    rsync -azv --password-file=/etc/rsyncd.passwd $srcdir \
    myuser@${syncServer}::${syncShareName} &>/dev/null
    if [ $? -eq 0 ]; then
        echo "At ${TIME} on ${DATE}, file ${fileName} was backde up by rsync." \
        >> /var/log/backup.log
    fi
done

3) 给予脚本可执行权限

# chmod u+x /root/mydatasync.sh
 

如果想让次文件同步备份在开机时自动启动,可以如下方式进行:

# echo "/root/mydatasync.sh" >> /etc/rc.d/rc.local

 

实际测试心得:

通过以上方式,实现了在源端新增了文件或目录,以及文件内容发生修改时,均被同步更新到了备份服务器端。如果在源端删除了某个文件或目录,则备份服务器端不会作对应的删除。所以这种同步备份,不适合要求源端和服务器端资源严格一致的场景!