2016년 3월 30일 수요일

FUSE (Filesystem in Userspace) 에 대한 이해

일반적으로 filesystem 은 kernel layer 에서 개발하는데, 이 경우 kernel 에 대한 높은 이해가 필요하다.

kernel 에 대한 이해 없이 디버깅의 편리성, 시스템 안정성 향상, 개발 속도 같은 것들을 우선하는 filesystem 을 만들고 싶을 때 사용하는 것이 FUSE 가 되겠다.

즉 FUSE 는 filesystem 을 user layer 에서 개발할 수 있도록 도와주는 framework 이다.

일반적으로 linux, mac 등에서는 FUSE, windows 에서는 dokan 이 fuse 같은 framework 을 제공한다.

FUSE 를 구현하는 법은 간단하다.

예를 들어 user program 으로 read 를 구현하고

그것을 FUSE framework 에 넘기면, 내부적으로 kernel layer 에 read 가 불릴때 user program 에 구현된 read 를 불러준다.

(function pointer 달아가지고 fuse_main 호출하면 끝이다.)

쉽게 생각하면 user program 에서 libfuse 를 가져다쓰는 것이다.



그런데 libfuse 를 가져다 쓰지 않고 구현할 수도 있다.

libfuse 에서 해주는 일은 /dev/fuse 를 열고 주기적으로 해당 노드를 read 하여

(kernel 에서 부터 요청이 온 request 를 읽어서) 적절한 user function 을 호출하는 일을 한다.

(즉,  fuse kernel module 이 하는 일은 kernel에 filesystem operation 들을 /dev/fuse 에 써주는 역할이다.)

이 내용을 직접 user program 에서 작성하여 더 빠르게 request 를 처리하도록 설정할 수 있다는 것이다.

(thread 를 여러개 둬서 /dev/fuse 를 마구 읽어서 처리한다던지...)

user filesystem 에 한계는 명확히 존재하지만 libfuse 를 직접 구현하면 mmap 등을 이용해

kernel - user copy를 줄일 여지가 더 생기는 등 괜찮은 filesystem 을 만들 수 있다.










댓글 없음:

댓글 쓰기