歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> 使用Inotify監控Linux文件系統事件

使用Inotify監控Linux文件系統事件

日期:2017/2/25 10:39:06   编辑:Linux教程
  Inotify 是文件系統事件監控機制,計劃包含在即將發布的 Linux 內核中作為 dnotify 的有效替代。dnotify 是較早內核支持的文件監控機制。Inotify 是一種強大的、細粒度的、異步的機制,它滿足各種各樣的文件監控需要,不僅限於安全和性能。下面讓我們一起學習如何安裝 inotify 和如何構建一個示例用戶空間應用程序來響應文件系統事件。
  文件系統事件監控對於從文件管理器到安全工具的各種程序都是必要的,但是 dnotify(早期內核中的標准)存在一些局限性,這使我們期待出現一種更加完善的機制。抱著這種期待,我們發現了 inotify,一種更加現代化的文件系統事件監控替代品。
  為什麼使用 inotify?
  使用 inotify 取代 dnotify 的原因有很多。第一個原因是,dnotify 需要您為每個打算監控是否發生改變的目錄打開一個文件描述符。當同時監控多個目錄時,這會消耗大量的資源,因為有可能達到每個進程的文件描述符限制。
  除此之外,文件描述符會鎖定目錄,不允許卸載(unmount)支持的設備,這在存在可移動介質的環境中會引發問題。在使用 inotify 時,如果正在監控被卸載的文件系統上的文件,那麼監控會被自動移除並且您會接收到一個卸載事件。
  dnotify 不如 inotify 的第二個原因是 dnotify 有點復雜。注意,使用 dnotify 基礎設施的簡單文件系統監控粒度只停留於目錄級別。為了使用 dnotify 進行更細粒度的監控,應用程序編程人員必須為每個受監控的目錄保留一個 stat 結構的緩存。該用戶空間的 stat 結構緩存需要用來明確確定當接收到通知信號時目錄發生了什麼變化。當獲得通知信號時,生成 stat 結構列表並與最新的狀態相比較。顯而易見,這種技術是不理想的。
  inotify 的另一個優點是它使用文件描述符作為基本接口,使應用程序開發者使用 select 和 poll 來監控設備。這允許有效的多路 I/O 和與 Glib 的 mainloop 的集成。相反,dnotify 所使用的信號常常使程序員頭疼並且感覺不太優雅。
  inotify 通過提供一個更優雅的 API 解決了這些問題,該 API 使用最少的文件描述符,並確保更細粒度的監控。與 inotify 的通信是通過設備節點提供的。基於以上原因,對於監控 Linux 2.6 平台上的文件,inotify 是您最明智的選擇。
  安裝 inotify
  安裝 inotify 的第一步是確定您使用的 Linux 內核是否支持它。檢查發行版的最簡單方法是,尋找是否存在 /dev/inotify 設備。如果存在該設備,您可以跳到 在簡單應用程序中使用 inotify 一節。
  在撰寫本文時,inotify 包含在 Andrew Morton 的 Linux 2.6-mm 目錄樹中,而且一些 Linux 發行版正在提供支持 inotify 的內核(包括 Gentoo 和 Ubuntu)或者具有提供支持的補充內核包(例如 Fedora 和 SuSE)。因為 Andrew 可能會根據需要從目錄樹刪除對 inotify 的支持,並且 inotify 版本還處於頻繁的開發階段,所以強烈建議您從頭開始打補丁。
  如果缺少該設備,您可能需要對內核打補丁並創建該設備。
  為 inotify 對內核打補丁
  可以從 Linux Kernel Archives 獲得 inotify 補丁。您應該為特定的內核應用最高版本編號的補丁。每個發行版處理內核的安裝都有所不同,但以下介紹的是一個通用指導。注意:從 Linux Kernel Archives 獲取發行版 2.6 Linux 內核源文件,如果合適,請獲取最新的穩定版本。
  從進入內核源文件目錄開始:
  bash:~$ cd /usr/src因為您早先安裝了內核源文件,現在需要將它解壓縮:
  bash:~$ sudo tar jxvf linux-source-2.6.8.1.tar.bz2現在,使您的 symlink 指向新的源文件目錄樹:
  bash:~$ sudo ln -sf linux-source-2.6.8.1 linux改變當前目錄到剛才創建的內核源文件目錄:
  bash:~$ cd linux拷貝 inotify 補丁:
  bash:~$ sudo cp ~/inotify* /usr/src將內核打補丁:
  bash:~$ sudo patch -p1 < ../inotify*.patch構建內核:
  bash:~$ sudo make menuconfig像平時一樣配置您的內核,確保 inotify 工作正常。如果必要,請將新內核添加到引導加載程序中,但是一定要記住維護舊內核的映像和引導加載程序選項。這一步對於不同引導加載程序有所不同(請參閱 參考資料 了解關於特定引導加載程序的更多信息)。重新引導計算機並選擇啟用 inotify 的新內核。在繼續往下操作前,測試您的新內核以確保它工作正常。
  創建 inotify 設備
  接下來,您需要確保創建 /dev/inotify 設備。以下步驟帶領您完成這個過程。重要注意:次設備編號可能會發生改變,所以您需要多加注意以確保它隨時更新!如果 Linux 安裝支持 udev 功能,它將會自動保持更新。
  在重新引導到新內核後,您必須獲取次設備編號:
  bash:~$ dmesg
Copyright © Linux教程網 All Rights Reserved