原文地址:

http://www.51know.info/system_security/inotify.html

1. Inotify 機制概述

1.1. Inotify 介紹

在日常的運維過程中,經常需要備份某些檔案,或者對系統的某些檔案進行監控,比如重要的配置檔案等。如果需要作到實時同步或者監控,就需要使用核心的inotify機制
Inotify 是基於inode級別的檔案系統監控技術,是一種強大的、細粒度的、非同步的機制,它滿足各種各樣的檔案監控需要,不僅限於安全和效能

  • Inotify 不需要對被監視的目標開啟檔案描述符,而且如果被監視目標在可移動介質上,那麼在 umount 該介質上的檔案系統後,被監視目標對應的 watch 將被自動刪除,並且會產生一個 umount 事件。
  • Inotify 既可以監視檔案,也可以監視目錄。
  • Inotify 使用系統呼叫而非 SIGIO 來通知檔案系統事件。
  • Inotify 使用檔案描述符作為介面,因而可以使用通常的檔案 I/O 操作select 和 poll 來監視檔案系統的變化。

1.2. Inotify 可監視的檔案系統事件

  • IN_ACCESS : 即檔案被訪問
  • IN_MODIFY : 檔案被 write
  • IN_ATTRIB : 檔案屬性被修改,如 chmod、chown、touch 等
  • IN_CLOSE_WRITE : 可寫檔案被 close
  • IN_CLOSE_NOWRITE : 不可寫檔案被 close
  • IN_OPEN : 檔案被open
  • IN_MOVED_FROM : 檔案被移走,如 mv
  • IN_MOVED_TO : 檔案被移來,如 mv、cp
  • IN_CREATE : 建立新檔案
  • IN_DELETE : 檔案被刪除,如 rm
  • IN_DELETE_SELF : 自刪除,即一個可執行檔案在執行時刪除自己
  • IN_MOVE_SELF : 自移動,即一個可執行檔案在執行時移動自己
  • IN_UNMOUNT : 宿主檔案系統被 umount
  • IN_CLOSE : 檔案被關閉,等同於(IN_CLOSE_WRITE | IN_CLOSE_NOWRITE)
  • IN_MOVE : 檔案被移動,等同於(IN_MOVED_FROM | IN_MOVED_TO)

注:上面所說的檔案也包括目錄

1.3. Inotify核心版本支援

  • kernel 2.6.13開始,Inotify正式併入核心,RHEL5已經支援.
  • 看看是否有 /proc/sys/fs/inotify/目錄,以確定核心是否支援inotify
      [[email protected] Rsync]# ls -l /proc/sys/fs/inotify/
      total 0
      -rw-r--r-- 1 root root 0 Oct  9 09:36 max_queued_events
      -rw-r--r-- 1 root root 0 Oct  9 09:36 max_user_instances
      -rw-r--r-- 1 root root 0 Oct  9 09:36 max_user_watches
    

1.4. inotify 的預設核心引數

  • /proc/sys/fs/inotify/max_queued_events 預設值: 16384 該檔案中的值為呼叫inotify_init時分配給inotify instance中可排隊的event的數目的最大值,超出這個值得事件被丟棄,但會觸發IN_Q_OVERFLOW事件
  • /proc/sys/fs/inotify/max_user_instances 預設值: 128 指定了每一個real user ID可建立的inotify instatnces的數量上限
  • /proc/sys/fs/inotify/max_user_watches 預設值: 8192 指定了每個inotify instance相關聯的watches的上限

注意: max_queued_events 是 Inotify 管理的佇列的最大長度,檔案系統變化越頻繁,這個值就應該越大 
如果你在日誌中看到Event Queue Overflow,說明max_queued_events太小需要調整引數後再次使用.

2. Inotify 在系統中使用

2.1. linux shell 下使用inotify

  • 下載安裝 inotify-tools原始碼 rhel5/centos5 RPM包
    • inotifywait 僅執行阻塞,等待 inotify 事件。您可以監控任何一組檔案和目錄,或監控整個目錄樹(目錄、子目錄、子目錄的子目錄等等)
      在 shell 指令碼中使用 inotifywait。
    • inotifywatch 收集關於被監視的檔案系統的統計資料,包括每個 inotify 事件發生多少次。
  • shell指令碼示例
      [[email protected] ]# cat /tmp/test.sh
      #!/bin/bash
      inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format  '%T %w%f %e' --event modify,delete,create,attrib  /home/admin | while read  date time file event
      do
          case $event in
              MODIFY|CREATE|MOVE|MODIFY,ISDIR|CREATE,ISDIR|MODIFY,ISDIR)
                      echo $event'-'$file
                  ;;
      
              MOVED_FROM|MOVED_FROM,ISDIR|DELETE|DELETE,ISDIR)
                      echo $event'-'$file
                  ;;
          esac
      done
    
  • 執行指令碼,結果輸出(這裡測試刪除了一個目錄 rm -fr cronolog-1.6.2.bak)
      [[email protected]]# /tmp/test.sh 
      DELETE-/home/admin/cronolog-1.6.2.bak/COPYING
      DELETE-/home/admin/cronolog-1.6.2.bak/doc/cronolog.info
      DELETE-/home/admin/cronolog-1.6.2.bak/doc/cronolog.texi
      DELETE-/home/admin/cronolog-1.6.2.bak/doc/Makefile.am
      DELETE-/home/admin/cronolog-1.6.2.bak/doc/Makefile.in
      DELETE-/home/admin/cronolog-1.6.2.bak/doc/texinfo.tex
      DELETE-/home/admin/cronolog-1.6.2.bak/doc/cronosplit.1m
      DELETE-/home/admin/cronolog-1.6.2.bak/doc/Makefile
      DELETE-/home/admin/cronolog-1.6.2.bak/doc/cronolog.1m
      DELETE,ISDIR-/home/admin/cronolog-1.6.2.bak/doc
      DELETE-/home/admin/cronolog-1.6.2.bak/TODO
      DELETE-/home/admin/cronolog-1.6.2.bak/src/cronotest.c
      DELETE-/home/admin/cronolog-1.6.2.bak/src/cronolog.c
      DELETE-/home/admin/cronolog-1.6.2.bak/src/cronoutils.h
      DELETE-/home/admin/cronolog-1.6.2.bak/src/cronoutils.c
      DELETE-/home/admin/cronolog-1.6.2.bak/src/Makefile.am
      DELETE-/home/admin/cronolog-1.6.2.bak/src/Makefile.in
      DELETE-/home/admin/cronolog-1.6.2.bak/src/cronosplit.in
      DELETE-/home/admin/cronolog-1.6.2.bak/src/Makefile
      DELETE-/home/admin/cronolog-1.6.2.bak/src/cronosplit
      DELETE-/home/admin/cronolog-1.6.2.bak/src/config.h
      DELETE,ISDIR-/home/admin/cronolog-1.6.2.bak/src
      DELETE-/home/admin/cronolog-1.6.2.bak/lib/getopt1.c
      DELETE-/home/admin/cronolog-1.6.2.bak/lib/getopt.h
      DELETE-/home/admin/cronolog-1.6.2.bak/lib/Makefile.am
      DELETE-/home/admin/cronolog-1.6.2.bak/lib/Makefile.in
      DELETE-/home/admin/cronolog-1.6.2.bak/lib/localtime_r.c
      DELETE-/home/admin/cronolog-1.6.2.bak/lib/getopt.c
      DELETE-/home/admin/cronolog-1.6.2.bak/lib/Makefile
      DELETE-/home/admin/cronolog-1.6.2.bak/lib/strptime.c
      DELETE,ISDIR-/home/admin/cronolog-1.6.2.bak/lib
      DELETE-/home/admin/cronolog-1.6.2.bak/config.cache
      DELETE-/home/admin/cronolog-1.6.2.bak/install-sh
      DELETE-/home/admin/cronolog-1.6.2.bak/Makefile.am
      DELETE-/home/admin/cronolog-1.6.2.bak/README
      DELETE-/home/admin/cronolog-1.6.2.bak/AUTHORS
      DELETE-/home/admin/cronolog-1.6.2.bak/Makefile.in
      DELETE-/home/admin/cronolog-1.6.2.bak/testsuite/Makefile.am
      DELETE-/home/admin/cronolog-1.6.2.bak/testsuite/README
      DELETE-/home/admin/cronolog-1.6.2.bak/testsuite/Makefile.in
      DELETE-/home/admin/cronolog-1.6.2.bak/testsuite/Makefile
      DELETE,ISDIR-/home/admin/cronolog-1.6.2.bak/testsuite
      DELETE-/home/admin/cronolog-1.6.2.bak/cronolog.spec
      DELETE-/home/admin/cronolog-1.6.2.bak/NEWS
      DELETE-/home/admin/cronolog-1.6.2.bak/configure
      DELETE-/home/admin/cronolog-1.6.2.bak/ChangeLog
      DELETE-/home/admin/cronolog-1.6.2.bak/missing
      DELETE-/home/admin/cronolog-1.6.2.bak/config.log
      DELETE-/home/admin/cronolog-1.6.2.bak/aclocal.m4
      DELETE-/home/admin/cronolog-1.6.2.bak/Makefile
      DELETE-/home/admin/cronolog-1.6.2.bak/INSTALL
      DELETE-/home/admin/cronolog-1.6.2.bak/config.status
      DELETE-/home/admin/cronolog-1.6.2.bak/configure.in
      DELETE-/home/admin/cronolog-1.6.2.bak/mkinstalldirs
      DELETE,ISDIR-/home/admin/cronolog-1.6.2.bak
    
    詳細請參考 man inotify , man inotifywait

2.2. 使用incron實現重要配置檔案監控

Incron是inotify的cron系統,與os本身的cron一樣,包含一個後臺守護程序(incrond)和一個事件編輯器(incrontab
與os本身的cron不同的僅僅是觸發時間的是os對某個檔案(夾)的操作而不是時間,由系統事件觸發的機制,對於應用系統來說,幾乎可以做到實時性。

  • 安裝Incron Incron Rpm包
      [[email protected]]# yum install Incron
    
  • 檢視 incron 支援的事件型別 incrontab -t ,編輯配置檔案使用 incrontab -e
  • 配置檔案格式說明(預設配置在/var/spool/incron/ 目錄下)
      <path> <mask> <command>
    
    選項說明:
    <path>:欲監控的檔案或者目錄
    <mask>:os對監控物件發生的事件
    <command>:command可以是系統命令,也可以是指令碼,不能是用系統的重定向,除非重定向寫在指令碼中。
    <Command>中還可以使用下面的這些變數:
    [email protected]:代表<path>,即監控物件
    $#:發生系統事件的物件(例如監控了某個資料夾,其下的某個檔案發生了變化,那麼$#就代表了該檔名)
    $%:代表<mask>,即發生的事件
  • 配置舉例:
  • 啟動incrond (/etc/init.d/incrond start),然後在 /home/admin目錄刪除 ssss 檔案,檢視日誌 tail /var/log/cron ,有如下輸出
      Mar 23 14:05:19 localhost incrond[6857]: (root) CMD (echo "/home/admin =  = IN_OPEN,IN_ISDIR")
      Mar 23 14:05:19 localhost incrond[6857]: (root) CMD (echo "/home/admin =  = IN_CLOSE_NOWRITE,IN_ISDIR")
      Mar 23 14:05:20 localhost incrond[6857]: (root) CMD (echo "/home/admin =  = IN_OPEN,IN_ISDIR")
      Mar 23 14:05:20 localhost incrond[6857]: (root) CMD (echo "/home/admin =  = IN_CLOSE_NOWRITE,IN_ISDIR")
      Mar 23 14:05:20 localhost incrond[6857]: (root) CMD (echo "/home/admin = ssss = IN_DELETE")
    

總體來說,在檔案和目錄實時監控還是很有效的,可以結合其他工具來作統一化的解決方案,比如使用syslog-ng作統一化收集,當然最重要還是要有場景.


.