Chinaunix首页 | 论坛 | 博客
  • 博客访问: 348324
  • 博文数量: 79
  • 博客积分: 3053
  • 博客等级: 中校
  • 技术积分: 861
  • 用 户 组: 普通用户
  • 注册时间: 2006-02-27 20:43
文章分类

全部博文(79)

文章存档

2012年(3)

2011年(21)

2010年(15)

2009年(40)

分类: LINUX

2009-05-04 11:13:30

Inotify 是文件系统事件监控机制,一种强大的、细粒度的、异步的机制,它满足各种各样的文件监控需要,不仅限于安全和性能。

inotify是dnotify的升级版本,inotify 取代 dnotify 的原因有很多。第一个原因是,dnotify 需要您为每个打算监控是否发生改变的目录打开一个文件描述符。当同时监控多个目录时,这会消耗大量的资源,因为有可能达到每个进程的文件描述符限制。除此之外,文件描述符会锁定目录,不允许卸载(unmount)支持的设备,这在存在可移动介质的环境中会引发问题。在使用 inotify 时,如果正在监控被卸载的文件系统上的文件,那么监控会被自动移除并且您会接收到一个卸载事件。dnotify 不如 inotify 的第二个原因是dnotify 基础设施的简单文件系统监控粒度只停留于目录级别。如果要实现更细粒度的监控,实现起来比较复杂。

inotify 的另一个优点是它使用文件描述符作为基本接口,使应用程序开发者使用 selectpoll 来监控设备。这允许有效的多路 I/O 和与 Glib 的 mainloop 的集成。相反,dnotify 所使用的信号常常使程序员头疼并且感觉不太优雅。

inotify 通过提供一个更优雅的 API 解决了这些问题,该 API 使用最少的文件描述符,并确保更细粒度的监控。与 inotify 的通信是通过设备节点提供的。基于以上原因,对于监控 Linux 2.6 平台上的文件,inotify 是您最明智的选择。 

安装 inotify 的第一步是确定您使用的 Linux 内核是否支持它。检查发行版的最简单方法是,寻找是否存在 /dev/inotify 设备。如果存在该设备,说明你的系统支持inotify,如果缺少该设备,您可能需要对内核打补丁并创建该设备。在2.6.13及以下的版本中,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 的新内核。在继续往下操作前,测试您的新内核以确保它工作正常。

接下来,您需要确保创建 /dev/inotify 设备。以下步骤带领您完成这个过程。重要注意:次设备编号可能会发生改变,所以您需要多加注意以确保它随时更新!如果 Linux 安装支持 udev 功能,它将会自动保持更新。

在重新引导到新内核后,您必须获取次设备编号:

bash:~$ dmesg | grep ^inotify

返回结果示例如下:

inotify device minor=63

因为 inotify 是 misc 设备,所以主设备编号是 10。要创建设备节点作为根用户,请执行以下命令:

bash:~$ mknod /dev/inotify c 10 63

注意:如有必要,请使用合适的次设备编号替换“63”。

您可以随意设置您想要的权限。一个示例权限设置如下所示:

bash:~$ chown root:root /dev/inotify
bash:~$ chmod 666 /dev/inotify

现在准备使用 inotify 设备进行文件系统监控。

注:如果使用python进行管理,需要安装python的pyinotify及ctypes模块。


inotify的具体用法示例见链接:Sample code

inotify在python中的应用实例:大量小文件同步实例



阅读(1310) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~