linux 文件读取 监控,linux 文件系统的监控
完整性檢查是HIDS的重要組成部分之一,linux下做完整性檢查的思路有3個
1、哈希對比
2、簽名校驗
3、inotify
方法有2個:
A、定期檢測,例如通過cron或程序內置計時器
B、實時檢測,inotify
1、2一般和A,3一般和B。用inotify做完整性檢查的程序現在貌似還沒現成比較好用的,誰推薦一個。
作者
概要 – 為什么需要監控文件系統?
在日常工作中,人們往往需要知道在某些文件(夾)上都有那些變化,比如:
通知配置文件的改變
跟蹤某些關鍵的系統文件的變化
監控某個分區磁盤的整體使用情況
系統崩潰時進行自動清理
自動觸發備份進程
向服務器上傳文件結束時發出通知
通常使用文件輪詢的通知機制,但是這種機制只適用于經常改變的文件(因為它可以確保每過x秒就可以得到i/o),其他情況下都非常低效,并且有時候會丟失某些類型的變化,例如文件的修改時間沒有改變。像Tripwire這樣的數據完整性系統,它們基于時間調度來跟蹤文件變化,但是如果想實時監控文件的變化的話,那么時間調度就束手無策了。Inotify就這樣應運而生了。本文將簡要介紹inotify,告訴我們如何監控文件夾,如何一有變化就報告相關消息事件,并介紹了一些相關工具, 我們可以把它們添加到自己的工具箱中。
Inotify到底是什么?
Inotify是一種文件變化通知機制,Linux內核從2.6.13開始引入。在BSD和Mac OS系統中比較有名的是kqueue,它可以高效地實時跟蹤Linux文件系統的變化。近些年來,以fsnotify作為后端,幾乎所有的主流Linux發行版都支持Inotify機制。如何知道你的Linux內核是否支持Inotify機制呢?很簡單,執行下面這條命令:
% grep INOTIFY_USER /boot/config-$(uname -r)
CONFIG_INOTIFY_USER=y
1
2
%grepINOTIFY_USER/boot/config-$(uname-r)
CONFIG_INOTIFY_USER=y
如果輸出(‘CONFIG_INOTIFY_USER=y’),那么你可以馬上享受Inotify之旅了。
簡單的文件變化通知樣例:
好的開始是成功的一半,對于了解Inotify機制來說,讓我們從使用inotifywait程序開始,它包含在inotify-tools工具包中。假如我們打算監控/srv/test文件夾上的操作,只需執行:
% inotifywait -rme modify,attrib,move,close_write,create,delete,delete_self /srv/test
Setting up watches. Beware: since -r was given, this may take a while!
Watches established.
1
2
3
%inotifywait-rmemodify,attrib,move,close_write,create,delete,delete_self/srv/test
Settingupwatches.Beware:since-rwasgiven,thismaytakeawhile!
Watchesestablished.
上述任務運行的同時,我們在另一個shell里依次執行以下操作:創建文件夾,然后在新文件夾下創建文件,接著刪除新創建的文件:
% mkdir /srv/test/infoq
% echo TODO > /srv/test/infoq/article.txt
% rm /srv/test/infoq/article.txt
1
2
3
%mkdir/srv/test/infoq
%echoTODO>/srv/test/infoq/article.txt
%rm/srv/test/infoq/article.txt
在運行inotifywait的shell中將會打印以下信息:
/srv/test/ CREATE,ISDIR infoq
/srv/test/infoq/ CREATE article.txt
/srv/test/infoq/ MODIFY article.txt
/srv/test/infoq/ CLOSE_WRITE,CLOSE article.txt
/srv/test/infoq/ DELETE article.txt
1
2
3
4
5
/srv/test/CREATE,ISDIRinfoq
/srv/test/infoq/CREATEarticle.txt
/srv/test/infoq/MODIFYarticle.txt
/srv/test/infoq/CLOSE_WRITE,CLOSEarticle.txt
/srv/test/infoq/DELETEarticle.txt
顯而易見,只要有變化我們就會收到相關的通知。如果想了解關于Inotify提供的事件(如modify, atrrib等)的詳細信息,請參考inotifywatch的manpage。實際使用時,如果并不想監控某個大文件夾,那么就可以使用inotifywait的exclude選項。例如:我們要忽略文件夾/srv/test/large,那么就可以這樣來建立監控:
% inotifywait --exclude '^/srv/test/(large|ignore)/' -rme modify,attrib,move,close_write,create,delete,delete_self /srv/test
Setting up watches. Beware: since -r was given, this may take a while!
Watches established.
1
2
3
%inotifywait--exclude'^/srv/test/(large|ignore)/'-rmemodify,attrib,move,close_write,create,delete,delete_self/srv/test
Settingupwatches.Beware:since-rwasgiven,thismaytakeawhile!
Watchesestablished.
上面的例子中,在exclude選項的匹配串中我們使用了正則表達式,因為我們不想將名稱中含有large或ignore的文件也排除掉。我們可以測試一下:
% echo test > /srv/test/action.txt
% echo test > /srv/test/large/no_action.txt
% echo test > /srv/test/ignore/no_action.txt
% echo test > /srv/test/large-name-but-action.txt
1
2
3
4
%echotest>/srv/test/action.txt
%echotest>/srv/test/large/no_action.txt
%echotest>/srv/test/ignore/no_action.txt
%echotest>/srv/test/large-name-but-action.txt
這里inotifywait應該只會報告’action.txt’和’large-name-but-action.txt’兩個文件的變化,而忽略子文件夾’large’和’ignore’下的文件,結果也確實如此;
/srv/test/ CREATE action.txt
/srv/test/ MODIFY action.txt
/srv/test/ CLOSE_WRITE,CLOSE action.txt
/srv/test/ CREATE large-name-but-action.txt
/srv/test/ MODIFY large-name-but-action.txt
/srv/test/ CLOSE_WRITE,CLOSE large-name-but-action.txt
1
2
3
4
5
6
/srv/test/CREATEaction.txt
/srv/test/MODIFYaction.txt
/srv/test/CLOSE_WRITE,CLOSEaction.txt
/srv/test/CREATElarge-name-but-action.txt
/srv/test/MODIFYlarge-name-but-action.txt
/srv/test/CLOSE_WRITE,CLOSElarge-name-but-action.txt
另外,通過使用-t選項我們還可以定義inotifywait的監控時間,既可以讓它執行一段時間,也可以讓它一直運行。util-linux-ng的logger命令也可以實現此功能,不過得先把相關的消息事件發送到syslog,然后從syslog服務器再分析整合。
Inotifywatch – 使用inotify來統計文件系統訪問信息
Inotify-tools中還有一個工具叫inotifywatch,它會先監聽文件系統的消息事件,然后統計每個被監聽文件或文件夾的消息事件,之后輸出統計信息。比如我們想知道某個文件夾上有那些操作:
% inotifywatch -v -e access -e modify -t 120 -r ~/InfoQ
Establishing watches...
Setting up watch(es) on /home/mika/InfoQ
OK, /home/mika/InfoQ is now being watched.
Total of 58 watches.
Finished establishing watches, now collecting statistics.
Will listen for events for 120 seconds.
total modify filename
2 2 /home/mika/InfoQ/inotify/
1
2
3
4
5
6
7
8
9
%inotifywatch-v-eaccess-emodify-t120-r~/InfoQ
Establishingwatches...
Settingupwatch(es)on/home/mika/InfoQ
OK,/home/mika/InfoQisnowbeingwatched.
Totalof58watches.
Finishedestablishingwatches,nowcollectingstatistics.
Willlistenforeventsfor120seconds.
totalmodifyfilename
22/home/mika/InfoQ/inotify/
很顯然,這里我們監控的是~/InfoQ文件夾,并且可以看到/home/mika/InfoQ/inotify上發生了兩個事件。方法雖簡單,但卻很有效。
Inotify的配置選項
使用Inotify時,要特別注意內核中關于它的兩個配置。首先/proc/sys/fs/inotify/max_user_instances 規定了每個用戶所能創建的Inotify實例的上限;其次/proc/sys/fs/inotify/max_user_watches規定了每個Inotify實例最多能關聯幾個監控(watch)。你可以很容易地試驗在運行過程中達到上限,如:
% inotifywait -r /
Setting up watches. Beware: since -r was given, this may take a while!
Failed to watch /; upper limit on inotify watches reached!
Please increase the amount of inotify watches allowed per user via `/proc/sys/fs/inotify/max_user_watches'.
1
2
3
4
%inotifywait-r/
Settingupwatches.Beware:since-rwasgiven,thismaytakeawhile!
Failedtowatch/;upperlimitoninotifywatchesreached!
Pleaseincreasetheamountofinotifywatchesallowedperuservia`/proc/sys/fs/inotify/max_user_watches'.
如果要改變這些配置,只要向相應的文件寫入新值即可,如下所示:
# cat /proc/sys/fs/inotify/max_user_watches
8192
# echo 16000 > /proc/sys/fs/inotify/max_user_watches
# cat /proc/sys/fs/inotify/max_user_watches
16000
1
2
3
4
5
# cat /proc/sys/fs/inotify/max_user_watches
8192
# echo 16000 > /proc/sys/fs/inotify/max_user_watches
# cat /proc/sys/fs/inotify/max_user_watches
16000
使用Inotify的一些工具
近一段時間出現了很多基于Inotify的超炫的工具,如incron,它是一個類似于cron的守護進程(daemon),傳統的cron守護進程都是在規定的某個時間段內執行,而incron由于使用了Inotify,可以由事件觸發執行。同時incron的安裝簡單而直觀,比如在debian上,首先在/etc/incron.allow中添加使用incron的用戶(debian默認不允許用戶使用incron,因為如果incron使用不慎的話,例如形成死循環,則會導致系統宕機):
# echo username > /etc/incron.allow
1
# echo username > /etc/incron.allow
然后調用”incrontab -e“, 在彈出的編輯器中插入我們自己的規則,例如下面的這條簡單的規則,文件一變化incron就會發郵件通知我們:
/srv/test/ IN_CLOSE_WRITE mail -s "$@/$#\n" root
1
/srv/test/IN_CLOSE_WRITEmail-s"$@/$#\n"root
從現在開始,一旦/src/test文件夾中的文件被修改,就會發送一封郵件。但是注意不要讓incron監控整個子目錄樹,因為Inotify只關注inodes,而不在乎是文件還是文件夾,所以基于Inotify的軟件都需要自己來處理/預防遞歸問題。關于incontab詳細使用,請參考incrontab的manpage。
如果你還要處理incoming文件夾,那么你可能需要inoticoming。當有文件進入incoming文件夾時Inoticoming就會執行某些動作,從而可以用inoticoming來管理debian的軟件倉庫(例如軟件倉庫中一旦有上傳源碼包或是新添加的二進制包就立刻自動進行編譯),另外,還可以用它來監控系統是否有新上傳文件,如果有就發送通知。類似的工具還有(它們都各有專長):inosync(基于消息通知機制的文件夾同步服務),iwatch(基于Inotify的程序,對文件系統進行實時監控),以及lsyncd(一個守護進程(daemon),使用rsync同步本地文件夾)。
Inotify甚至對傳統的Unix工具也進行了改進,例如tail。使用inotail,同時加上-f選項,就可以取代每秒輪詢文件的做法。此外,GNU 的coreutils從版本7.5開始也支持Inotify了,我們可以運行下面的命令來確認:
# strace -e inotify_init,inotify_add_watch tail -f ~log/syslog
[...]
inotify_init() = 4
inotify_add_watch(4, "/var/log/syslog", IN_MODIFY|IN_ATTRIB|IN_DELETE_SELF|IN_MOVE_SELF) = 1
1
2
3
4
# strace -e inotify_init,inotify_add_watch tail -f ~log/syslog
[...]
inotify_init()=4
inotify_add_watch(4,"/var/log/syslog",IN_MODIFY|IN_ATTRIB|IN_DELETE_SELF|IN_MOVE_SELF)=1
從現在開始,通過輪詢來確實文件是否需要重新讀取的方法應該作為古董了。
在腳本中使用Inotify
Inotify機制并不局限于工具,在腳本語言中也完全可以享受Inotify的樂趣,如Python中可以使用pyinotify和inotifyx,Perl中有Filesys-Notify-Simple和Linux-Inotify2,Inotify的Ruby版有ruby-inotifyrb-inoty和fssm。
總結
綜上所述,Inotify為Linux提供了一套高效監控和跟蹤文件變化的機制,它可以實時地處理、調試以及監控文件變化,而輪詢是一種延遲機制。對于系統管理員,關于實現事件驅動的服務如系統備份,構建服務以及基于文件操作的程序調試等,Inotify無疑提供了強大的支持。
包子猜您可能還喜歡下列文章:
總結
以上是生活随笔為你收集整理的linux 文件读取 监控,linux 文件系统的监控的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ftp文件服务器杀毒,FTP远程查杀网页
- 下一篇: java开发组态软件下载_基于JAVA的