inotify高效监控Linux文件系统事件

inotify-tools3.14版本永久链接

链接: inotify-tools-3.14
提取码:15t5

 概要:为什么需要监控系统文件?

  • 跟踪某些关键的系统文件的变化
  • 通知配置文件的改变
  • 监控某个分区磁盘的整体情况

Inotify到底是做什么的?

  Inotify是一种文件变化通知机制,linux内核从2.6.13 开始引入。

  在BSD和Mac OS 系统中比较有名的是kqueue,他可以高效的实时跟踪Linux文件系统的变化。近些年来,以fsnotify 作为后端,几乎所有的主流Linux发行版都支持Inotify机制。

inotify的安装步骤:

一、安装:

1.1.1、查看服务器内核是否支持inotify:

  uname -r查看版本是否在2.6以上
  ll /proc/sys/inotify 查看是否有以下三个目录,有说明支持
-rw-r--r--. 1 root root 0 7月   1 14:47 max_queued_events
-rw-r--r--. 1 root root 0 7月   1 14:47 max_user_instances
-rw-r--r--. 1 root root 0 7月   1 14:47 max_user_watches

 

1.1.2、安装inotify-tools

yum install make gcc gcc-c++  //安装编译工具
上传 inotify工具包到/usr/local/src下
cd /usr/local/src 
tar zxf inotify-tools-3.14.tar.gz  //解压
cd inotify-tools-3.14 
./configure --prefix=/usr/local/inotify  //配置
make && make install

 

1.1.3、设置系统环境变量,添加软链接

echo "PATH=/usr/local/inotify/bin:$PATH" >>/etc/profile.d/inotify.sh
source /etc/profile.d/inotify.sh #使设置立即生效
echo "/usr/local/inotify/lib" >/etc/ld.so.conf.d/inotify.conf
ln -s /usr/local/inotify/include /usr/include/inotify 

 

1.1.4、修改inotify默认参数 (inotify默认内核参数数值大小)

查看系统默认参数值
sysctl -a | grep max_queued_events
结果是:fs.inotify.max_queued_events = 16384
sysctl -a | grep max_user_watches
结果是:fs.inotify.max_user_watches = 8192
sysctl -a | grep max_user_instances
结果是:fs.inotify.max_user_instances = 128

 

修改参数为:

sysctl -w fs.inotify.max_queued_events="99999999"

sysctl -w fs.inotify.max_user_watches="99999999"

sysctl -w fs.inotify.max_user_instances="65535"

 

1.1.5、修改服务的配置文件:

vi /etc/sysctl.conf //添加以下代码
fs.inotify.max_queued_events=99999999
fs.inotify.max_user_watches=99999999
fs.inotify.max_user_instances=65535

 

参数说明:

max_queued_events:
inotify队列最大长度,如果值太小,会出现"** Event Queue Overflow **"错误,导致监控文件不准确
max_user_watches:
要同步的文件包含多少目录,可以用:find /{filename} -type d | wc -l 统计,
    必须保证max_user_watches值大于统计结果(这里{filename}为同步文件目录) max_user_instances: 每个用户创建inotify实例最大值

 

此时安装完成。

二、实验是否可以使用此服务进行监控:

2.1.1、测试1:

inotifywait -mrq --timefmt '%d/%m/%y/%H:%M' --format '%T %w %f' -e access,modify,close,move,open,delete,create,attrib /etc/firewalld/ 

 

这时再开一个窗口,会输出文件的变动情况,具体参数如下方介绍。

2.1.2、测试2:

[root@localhost ~]# inotifywatch -v -e access -e modify -t 60 -r /etc/
Establishing watches...
Setting up watch(es) on /etc/
OK, /etc/ is now being watched.
Total of 598 watches.
Finished establishing watches, now collecting statistics.
Will listen for events for 60 seconds.
total  access  modify  filename
55     55      0       /etc/
9      9       0       /etc/profile.d/
7      2       5       /etc/keepalived/
6      6       0       /etc/pam.d/

 

三:具体参数介绍:

语法:inotifywait

inotifywait [-hcmrq] [-e ] [-t ] [--format ] [--timefmt ] [ ... ]

 

–fromfile
从文件读取需要监视的文件或排除的文件,一个文件一行,排除的文件以@开头。
-m, –monitor
接收到一个事情而不退出,无限期地执行。默认的行为是接收到一个事情后立即退出。
-d, –daemon
跟–monitor一样,除了是在后台运行,需要指定–outfile把事情输出到一个文件。也意味着使用了–syslog。
-o, –outfile
输出事情到一个文件而不是标准输出。
-s, –syslog
输出错误信息到系统日志
-r, –recursive
监视一个目录下的所有子目录。
-q, –quiet
指定一次,不会输出详细信息,指定二次,除了致命错误,不会输出任何信息。
–exclude
正则匹配需要排除的文件,大小写敏感。
–excludei
正则匹配需要排除的文件,忽略大小写。
-t , –timeout
设置超时时间,如果为0,则无限期地执行下去。
-e , –event
指定监视的事件。
-c, –csv
输出csv格式。
–timefmt
指定时间格式,用于–format选项中的%T格式。
–format
指定输出格式。
%w 表示发生事件的目录
%f 表示发生事件的文件
%e 表示发生的事件
%Xe 事件以“X”分隔
%T 使用由–timefmt定义的时间格式

 

语法:inotifywatch

inotifywatch [-hvzrqf] [-e ] [-t ] [-a ] [-d ] [ ... ]
参数:
-h, –help
输出帮助信息
-v, –verbose
输出详细信息
@
排除不需要监视的文件,可以是相对路径,也可以是绝对路径。
–fromfile
从文件读取需要监视的文件或排除的文件,一个文件一行,排除的文件以@开头。
-z, –zero
输出表格的行和列,即使元素为空
–exclude
正则匹配需要排除的文件,大小写敏感。
–excludei
正则匹配需要排除的文件,忽略大小写。
-r, –recursive
监视一个目录下的所有子目录。
-t , –timeout
设置超时时间
-e , –event
只监听指定的事件。
-a , –ascending
以指定事件升序排列。
-d , –descending
以指定事件降序排列。

3.1.1、示例:

inotifywait -mrq --timefmt '%d/%m/%y/%H:%M' --format '%T %w %f' -e modify,delete,create,attrib /data

 

 

3.1.2、选项参数:

-m:表示持续监视变化。 
-r:表示使用递归形式监视目录。 
-q:表示减少冗余信息,只打印出需要的信息。 
-e:表示指定要监视的事件列表。 
--timefmt是指定时间的输出格式。 
--format指定文件变化的详细信息。
其中 %w:表示监听的目录,%f表示触发事件的文件

 

3.1.3、事件说明:

access 访问,读取文件。 
modify 修改,文件内容被修改。 
attrib 属性,文件元数据被修改。 
move 移动,对文件进行移动操作。 
create 创建,生成新文件 
open 打开,对文件进行打开操作。 
close 关闭,对文件进行关闭操作。 
delete 删除,文件被删除。

 

posted @ 2020-07-03 14:49  Security  阅读(878)  评论(0编辑  收藏  举报