inotify用法简介及结合rsync实现主机间的文件实时同步

一、inotify简介


inotify是Linux内核2.6.13 (June 18, 2005)版本新增的一个子系统(API),它提供了一种监控文件系统(基于inode的)事件的机制,可以监控文件系统的变化如文件修改、新增、删除 等,并可以将相应的事件通知给应用程序。该机制由著名的桌面搜索引擎项目beagle引入用于替代此前具有类似功能但存在诸多缺陷的dnotify。


inotify既可以监控文件,也可以监控目录。当监控目录时,它可以同时监控目录及目录中的各子目录及文件的。此外,inotify 使用文件描述符作为接口,因而可以使用通常的文件I/O操作select、poll和epoll来监视文件系统的变化。


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


inotify 是一个API,需要通过开发应用程序进行调用,对于大多数用户来讲这有着许多不便,inotify-tools的出现弥补了这一不足。inotify- tools是一套组件,它包括一个C库和几个命令行工具,这些命令行工具可用于通过命令行或脚本对某文件系统的事件进行监控。它由Rohan McGovern开发,其项目网址为http://inotify-tools.sourceforge.net。


inotify-tools提供的两个命令行工具:

inotifywait:通过inotify API等待被监控文件上的相应事件并返回监控结果,默认情况下,正常的结果返回至标准输出,诊断类的信息则返回至标准错误输出。它可以在监控到对应监控对象上指定的事件后退出,也可以进行持续性的监控。

inotifywatch:通过inotify API收集被监控文件或目录的相关事件并输出统计信息。



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选项中自定义的时间格式;


例如,要监控/tmp/test目录及其内部所有文件上发生的create,delete,modify,close_write事件,则使用如下命令:

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


此命令在监控到某文件上第一次事件后就会退出,如果想一直监控,则需要为命令添加-m选项。


在很多场景中都会用到将某主机上的某目录下的所有文件改变实时同步至另一主机上的指定位置,这也可以通过在脚本中使用inotifywait结合rsync命令来实现,比如如下脚本:


#!/bin/bash


DESTHOST=172.16.100.6

DESTHOSTDIR=/www/htdocs/

SRCDIR=/www/htdocs/


inotifywait -mr --timefmt '%d/%m/%y %H:%M' --format '%T %w %f'  \

-e create,delete,modify,attrib  $SRCDIR | while read DATE TIME DIR FILE; do

   $FILECHANGE=${DIR}${FILE}


   rsync -avze 'ssh' $SRCDIR root@${DESTHOST}:${DESTHOSTDIR} &>/dev/null && \

      echo "At ${TIME} on ${DATE}, file $FILECHANGE was backed up via rsync" >> /var/log/filesync.log


done


需要注意的是,此脚本中的rsync是通过ssh加密后进行文件传输的,因此需要事先配置好相应的ssh能够基于密钥对用户进行认证,以免每一次文件同步都需要用户手动输入密码。


当然,如果数据传输不需要加密,此处也可以通过在目录主机的启动rsyncd守护进程来实现。


三、配置rsyncd+inotify实现文件实时同步:


本案例实现监控原主机上指定目录中的所有文件变化,并将变化实时同步至目标主机的指定目录中;所用主机及相关目录如下:

源主机:RHEL5.4(x86),172.16.100.1, 文件所在的目录为/www/htdocs;

目标主机:RHEL5.4(x86),172.16.100.6, 文件所在的目录为/www/htdocs;


1、设定目标主机(本例为172.16.100.6)


本案例中采用基于rsync守护进程的方式进行数据同步,其数据传输过程是明文方式,因此只适用于在特定的场景中应用。


1)安装相关软件:

目标主机是接收别的主机发送来的文件的服务器,因此,其rsync需要以守护进程的方式工作。rsync服务通常基于超级守护进程xinetd管理的方式来实现,因此需要事先安装rysnc和xinetd:

# yum -y install rsync xinetd


2)为rsync提供配置文件/etc/rsyncd.conf,内容类似如下内容:

# Section 1: Global settings

uid = nobody

gid = nobody

use chroot = no

max connections = 3

strict modes = yes

pid file = /var/run/rsyncd.pid

log file = /var/log/rsyncd.log

# Section 2:Directory to be synced

[htdocs]

path = /www/htdocs

ignore errors = yes

read only = no

write only = no

hosts allow = 172.16.0.0/16

hosts deny = *

list = false

uid = root

gid = root

auth users = wwwuser

secrets file = /etc/rsync.passwd


其中的相关指令及其说明可以通过rsyncd.conf的手册而获取。而其访问控制功能也可基于xinetd进行,具体方法请参照xinetd.conf的手册页。


3)提供secrets file所指定的口令文件/etc/rsync.passwd,其内容类似如下:

htdocsuser:passwOrdForhtdOcs


其中冒号前的是用户名,冒号后的是对应用户的密码。此文件不能为其他任意用户可访问,因此可用如下命令修改:

# chmod 600  /etc/rsync.passwd


4)配置服务可以开机启动:

# chkconfig rsync on

# chkconfig xinetd on

# service xinetd start


默认情况下,rsyncd监听的端口为873/TCP,这可以通过如下命令查看:

# netstat -tnlp | grep ":873"

tcp        0      0 0.0.0.0:873                 0.0.0.0:*                   LISTEN      3653/xinetd


2、设定源主机


1)安装相关软件

源主机需要实时监控指定目录中的所有文件上与文件改变相关的事件,并在事件发生时将改变的数据同步至目录主机,因此,源主机上需要确保内核支持inotify,并安装inotify-tools和rsync。


rsync的安装参照目标主机的中的方式进行即可。


inotify-tools的安装可以基于源码编译的方式进行,也可以通过安装其rpm进行。

源码下载地址:http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz

rpm包下载页面:http://rpm.pbone.net/index.php3/stat/4/idpl/15265939/dir/redhat_el_5/com/inotify-tools-3.14-1.el5.i386.rpm.html


这里以编译源代码的方式演示安装过程:

# tar xf inotify-tools-3.14.tar.gz

# cd inotify-tools-3.14

# ./configure

# make

# make install

# echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf

# ldconfig


2)为源主机的rsync提供通过htdocsuser用户同步文件至目标主机的口令文件

# echo 'passwOrdForhtdOcs' > /etc/rsync.passwd

# chmod 600 /etc/rsync.passwd


注意,对于RHEL5.4自带的2.6.8版本的rsync来说,其客户端(即此处的源主机上的rsync)的口令文件中只能保存用户的口令,而不能类似目标主机上可同时指定用户名。


3)建立脚本/root/bin/htdocsync.sh,通过inotifywait监控目标文件上的相应事件,并在事件触发时启动同步过程:

#!/bin/bash

#

DESTHOST=172.16.100.6

DESTHOSTDIR=/www/htdocs/

SRCDIR=/www/htdocs/


inotifywait -mr --timefmt '%d/%m/%y %H:%M' --format '%T %w %f' -e close_write,modify,delete,create,attrib $SRCDIR |  while read DATE TIME DIR FILE; do


       FILECHANGE=${DIR}${FILE}


       rsync -avz --password-file=/etc/rsync.passwd $SRCDIR htdocsuser@${DESTHOST}::htdocs &>/dev/null && \

       echo "At ${TIME} on ${DATE}, file $FILECHANGE was backed up via rsync" >> /var/log/websync.log

done


而后给此脚本执行权限,并执行即可:

# chmod u+x /root/bin/htdocsync.sh

# /root/bin/htdocsync.sh &


如果想让此功能可以在开机时自动启动,则可以通过如下方式进行:

# echo '/root/bin/htdocsync.sh &' >> /etc/rc.d/rc.local


补充说明:如果您期望将源主机上的数据同步至多台目标主机,对每个目标主机均类似上面的目标主机的设定方法进行设定即可。


本文出自 “眼眸刻着你的微笑” 博客,请务必保留此出处http://dengaosky.blog.51cto.com/9215128/1853560

本页内容版权归属为原作者,如有侵犯您的权益,请通知我们删除。
vSphere部署系列之11——vCenter权限管理 在前面的博文章节中已完成了整个vCenter运行环境的总体部署,接下来是有关运维方面的一些研究。这一章先讲一讲vCenter中的权限设置。 在vSphere中,权限由清单对象的用户或组和分配的角色组成,例如虚拟机或 ESX/ESXi主机。权限授予用户执行对象(向其分配了角色)上的角色所指定的活动的权限。 默认情况下,在全新安装中,只有用户administrator@vsphere.local 才具有vCenter Single Sign-On 服务器
DNS ( Domain Name System ,域名系统),因特网上作为域名和 IP 地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的 IP 数串。通过主机名,最终得到该主机名对应的 IP 地址的过程叫做域名解析(或主机名解析)。 DNS 协议运行在 UDP 协议之上,使用端口号 53 。 主机名到 IP 地址的映射有两种方式: 1 )静态映射,每台设备上都配置主机到 IP 地址的映射,各设备独立维护自己的映射表,而且只供本设备使用; 2 )动态映射,建立
如题所示,生产服务器每天会产生很大的日志文件,为了不使硬盘被日志文件塞满,因此需要定期清理日志文件。这时我们可以写一个shell脚本用来清理某个路径下45天以前的日志,然后再设置一个定时任务每周定时执行这个脚本即可 (1)清理某个路径下的日志脚本delOldLogs.sh: [root@prx01cleanlog]#vim/usr/local/cleanlog/delOldLogs.sh #!/bin/sh#删除输入路径下的修改时间在45天以前的日志文件find$1-mtime+45-name"*log*
软 RAID 是在操作系统层面进行的 RAID 配置,也能对数据进行保护,实际生产环境中使用存储中磁盘阵列和硬 RAID 实现冗余的情况比较多。 此实验在虚拟机中完成,在系统中添加 5 块磁盘,每块磁盘 512MB ,利用这 5 块磁盘做 RAID5 实验 ,模拟磁盘损坏及替换磁盘,模拟停止 RAID 阵列及启动阵列,阵列中的数据情况。 1. 添加磁盘 ,每块磁盘 512MB ,共 5 块,如图 1 所示。 图 1 2. 启动系统并查看磁盘 ll /dev/sd* 出现 /dev/sdb,/dev/sdc
上一篇给大家分享了监控Nginx《 项目实战:创建模板,监控Nginx状态、服务信息 》,这里跟大家分享一下监控MySQL的记录,如果你没有安装MySQL可以参考我另一篇博文《 ubuntu安装配置LNMP 》,Let's go! Zabbix 监控 MySQL 数据库 一、客户端 Ubuntu 普通用户登录 1、 登陆 MySQL $ mysql -uroot -p Enter password: Welcome to the MySQL monitor.Commands end with ; or \
认真的测试过网上的大多数文章和版本,真正能一次性测试通过的文章太少了,需要反复的推敲,反复的查阅资料,才能真正的测试成功,所以,在此背景下,总结了Rsync,加上自己的理解分享出来; 1、 原理篇 Rsync,故名思议,是一个远程数据同步工具,可以镜像整个目录树和文件系统,也可以保持源文件的权限,时间和软硬链接,可以优化数据,文件重复数据的删除,也可以在LAN/WAN之间快速的同步多台主机的数据,这主要得益于Rsync的压缩和Rsync的核心算法,其算法,是本地和远程两台主机之间的文件达到同步并保持一致,
实战自制Linux操作系统 本文主要通过裁剪现有Linux系统,打造一个属于自己的Linux小系统,让其能够装载网卡驱动,并配置IP地址,实现网络功能。 自制linux系统 步骤概述: 1 、新建一个硬盘 2 、在该新硬盘上新建两个分区,一个当boot分区,一个当/分区 3 、格式化并且挂载两个分区 4 、安装grub至目标磁盘 5 、为grub提供配置文件 6 、复制内核文件和initrd文件 7 、创建目标主机根文件系统 8 、移植bash命令和其库文件到根文件系统 9 、装载模块,实现网络功能 10
Kickstart+PXE自动部署 目录: 无人值守安装简介 实战:PXE批量部署linux操作系统 前言 部署dhcp服务 HTTP服务 TFTP服务 复制PXE启动时需要的文件 修改引导启动菜单 配置kickstart自动安装文件(ks.cfg) 装机测试 无人值守安装简介 无人值守安装(Unattended Setup)指软件安装时无需任何用户干预,直接按默认或通过应答文件设置安装,这对于无特殊需求的用户或企业大批量部署安装操作系统及软件时非常方便。无人值守安装也称为静默安装,在安装过程中可以静默安
一、CentOS 6 的启动流程 第一步:加电自检(POST) 主要检查硬件设备是否存在并能正常运行,如:CPU、内存、硬盘、风扇、输入输出设备等。自检功能主要是通过BIOS来实现的,BIOS程序是装载在一个硬件芯片CMOS上的,加电过程就是给CMOS通电,然后启动BIOS程序,BIOS程序会根据CMOS上面的一些配置信息区读取其他的硬件设备信息并检测其是否存在并能正常运行,之后进行硬件设备的初始化。 第二步:选择启动顺序,加载MBR 按照BIOS中设置的Boot Sequence查找Boot Loade
前几天我博客记录了zabbix安装《 Ubuntu系统LNMP环境下安装配置zabbix3.04 》这里我们给大家分享一下zabbix-proxy安装配置。阿里云zabbix-service ,公司内网zabbix-proxy 下面开始: zabbix-proxy 服务器配置 1 、配置 zabbix 源 #wget http://repo.zabbix.com/zabbix/3.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_3.0-1+trusty