일반적으로 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 을 만들 수 있다.
댓글 없음:
댓글 쓰기