inotify

위키백과, 우리 모두의 백과사전.
이동: 둘러보기, 검색

inotify는 파일 시스템 이벤트 통보 기능을 제공해 주는 리눅스 커널 서브시스템 중 하나이다. inotify는 존 맥컷챈(John McCutchan)이 개발하였는데, 로버트 러브(Rober Love) 및 뒤이어 애이미 그리피스(Amy Griffis)의 도움을 받았다. dnotify를 대체한다. inotify는 메인라인 커널에 2.6.13 버전부터 포함되었다. 그 전에도 소프트웨어 패치를 통해서 사용이 가능하였다. inotify는 파일 시스템의 변경 사항을 알아내고, 응용 프로그램에 이러한 변경 사항들을 보고하기 위한 것이다.

Inotify는 주로 비이글과 같은 데스크톱 검색 유틸리티에 이용된다. Inotify를 쓰면, 몇 분마다 반복하여 파일시스템을 스캐닝할 필요가 없이 변경된 파일들을 리인덱싱 할 수 있다. 능동적으로 파일의 바뀜을 살피는 것이 아니라, 커널에 의해 직접 파일이 바뀌었음을 통보받는다. 비이글과 같은 데스크톱 검색 유틸리티들은 수 초 내의 "변경부터 리인덱싱까지의 시간"(change-to-reindexing time)을 가질 수 있다. 또한, inotify는 그러한 유틸리티들로 하여금 매우 적은 CPU 성능만을 사용하도록 해주며, 요컨데 inotify는 이러한 프로그램들로 하여금 현명한 방식으로 사용되도록 해 준다; 참고로, 유저랜드에 충분한 성능을 제공해 주어야 하기 때문에 성능을 많이 잡아먹는 대몬(daemon)들은 배포자들에게 용납되지 않는다.

또한, inotify는 디렉터리 뷰(view)를 자동적으로 갱신하는 일에 쓰일 수 있다. 또한 설정 파일을 다시 읽어 들이는 일이나, 로그 변경, 백업, 동기화, 업로드 같은 일에 쓰일 수 있다.

장점[편집]

Inotify는 앞서 개발된 dnotify에 비해 많은 장점을 가지고 있다. dnotify를 가지고서는, 프로그램은 모니터링하는 각각의 디렉터리에 대해서 각각 하나씩의 파일 서술자를 사용했어야만 했다. 이 경우에는, 프로세스 당 파일 서술자의 개수가 한계에 다다를 수 있고, 또 그렇게 되면 일종의 보틀넥(bottleneck)이 되기 때문에 이것은 좋은 방법이 아니었다. Dnotify는 제거 가능한 미디어(removable media)를 사용할 때도 문제가 되었다. 파일 서술자 때문에, 장치가 사용중(busy) 상태가 되었으므로, 장치가 해제(umount)될 수 없었다.

Dnotify의 다른 단점은, 모니터(monitor)를 디렉터리 단위에서만 변경 가능하기 때문에, 세세한 제어가 불가능했다는 점이다. 프로그래머들은 Dnotify로부터 통지(notification)를 받았을 때, 무슨 일이 일어났는지 정확히 알기 위해서는 스태트(stat) 스트럭쳐를 이용해야만 했다. 프로그래머들은 스태트(stat) 스트럭쳐의 캐시(cahce)를 유지해야만 했으며, 디렉터리 안의 어떤 파일에서 변경이 일어났을 경우 새로운 스태트(stat) 스트럭쳐를 생성하고는 그것을 캐시(cache)된 것과 비교해야만 했다.

Inotify는 최소한의 파일 서술자만 사용하는 API를 쓰고 있다. 프로그래머들은 이미 널리 쓰이고 있는 select나 poll 인터페이스를 이용하여 그 API를 사용할 수 있다. dnotify가 썼던 시그널(signal) 통지가 아니라 말이다. 이것 때문에 기존의 select나 poll 기반 라이브러리(요컨데, Glib)와의 통합이 쉬워졌다.

동작 방법[편집]

inotify는 inotify를 위해 특별히 고안된 일련의 시스템 콜을 이용하여 이용할 수 있다.

int inotify_init ()

inotify 인스턴스를 생성한다. 모든 이벤트를 읽어낼 수 있는 파일 서술자 하나를 반환한다.

int inotify_add_watch (int fd, const char* pathname, int mask)

pathname이 가리키는 inode에 대한 감시(watching)을 시작한다. mask에 포함된 이벤트에 대한 감시이다. (inotify 인스턴스 내에서) pathname이 가리키는 inode에 대해 고유한 감시 서술자(watch decriptor) 하나를 반환해준다. (참조: 여러 개의 pathname들이 동일한 inode/watch descriptor를 가리킬 수 있다.)

int inotify_rm_watch (int fd, int wd)

주어진 감시 서술자 wd에 대한 감시를 중단한다.

inotify가 올려주는 이벤트에는 다음과 같은 정보가 들어 있다:

아이덴티파이어 내용
wd 감시 서술자(watch descriptor )
mask 이벤트 태그(event tag)
cookie IN_MOVED_FROMIN_MOVED_TO 사이 동기화(일치)를 위한 쿠키(cookie)
len 이름 필드의 길이
name (부가요소) 이 이벤트와 관계된 파일 이름 (상위 디렉터리에 대해서 로컬 이름임.)

모니터될 수 있는 이벤트들은 예를 들어 다음과 같다:

  • IN_ACCESS - 파일의 마지막 접근
  • IN_MODIFY - 파일의 마지막 수정
  • IN_ATTRIB - 파일 변경의 속성
  • IN_OPENIN_CLOSE - 파일의 열기 혹은 닫기
  • IN_MOVED_FROMIN_MOVED_TO - 파일이 이동(move)되거나 이름이 바뀜(rename)
  • IN_DELETE - 파일/디렉터리의 삭제
  • IN_CREATE - 파일/디렉터리의 생성
  • IN_DELETE_SELF - 모니터되는 파일 자체의 삭제

역사[편집]

같이 보기[편집]

바깥 고리[편집]

  • (영어) inotify-tools A suite of userland utilities, based on inotify, to watch and log modifications on files and directories
  • (영어) Official inotify README
  • (영어) Kernel Korner - Intro to inotify by Robert Love (2005)
  • (영어) LWN Article on Inotify Watching filesystem events with inotify (partly out of date)
  • (영어) IBM Article Monitor Linux file system events with inotify (out of date)
  • (영어) incron An inotify cron system. It works like a regular cron but handles filesystem events rather than time periods.

프로그래밍 API[편집]