>  기사  >  리눅스 퓨즈 란 무엇입니까?

리눅스 퓨즈 란 무엇입니까?

青灯夜游
青灯夜游원래의
2023-02-28 09:59:242853검색

Linux에서 퓨즈는 사용자 공간 파일 시스템을 지원하는 데 사용되는 커널 모듈인 사용자 공간 파일 시스템을 의미합니다. 퓨즈는 사용자 공간에서 구현되는 파일 시스템 프레임워크입니다. 퓨즈가 제공하는 인터페이스는 특정 파일 작업을 구현하여 파일 시스템을 구현할 수 있습니다.

리눅스 퓨즈 란 무엇입니까?

이 튜토리얼의 운영 환경: linux7.3 시스템, Dell G3 컴퓨터.

fuse 설명

linux 퓨즈란 무엇입니까

Linux에서 사용자 공간 파일 시스템을 지원하기 위해 사용하는 커널 모듈을 FUSE라고 합니다. FUSE라는 용어는 때때로 Linux의 사용자 공간 파일 시스템을 지칭합니다.

은 일반 운영 체제의 중요한 부분입니다. 운영 체제는 전통적으로 커널 수준에서 파일 시스템에 대한 지원을 제공했습니다. 일반적으로 커널 모드 코드는 디버그하기 어렵고 생산성이 낮습니다.

Linux는 버전 2.6.14부터 FUSE 모듈을 통해 사용자 공간에서 파일 시스템 구현을 지원합니다.

사용자 공간에 파일 시스템을 구현하면 생산성이 크게 향상되고 운영 체제에 대한 새로운 파일 시스템 제공 작업이 단순화됩니다. 특히 다양한 가상 파일 시스템 및 네트워크 파일 시스템에 적합합니다. 위에서 언급한 ZFS와 glusterfs는 모두 네트워크 파일 시스템입니다. 그러나 사용자 모드에서 파일 시스템을 구현하면 커널 모드/사용자 모드 전환으로 인해 필연적으로 추가 오버헤드가 발생하며 이는 성능에 일정한 영향을 미칩니다.

퓨즈의 주요 기능: 파일이나 폴더의 변경 사항을 모니터링하고 다른 프로세스가 이 폴더나 파일에서 쓰거나 읽는 내용에 사용자 정의 정보를 추가합니다.

요약:

FUSE(사용자 모드 파일 시스템)는 FUSE 커널 모듈의 지원을 통해 사용자가 퓨즈에서 제공하는 인터페이스에 따라 특정 파일 작업을 구현하기만 하면 되는 파일 시스템 프레임워크입니다. 파일 시스템.

퓨즈의 구성 및 기능 구현

FUSE는 FUSE 커널 모듈, FUSE 라이브러리 및 일부 행잉 도구의 세 부분으로 구성됩니다. FUSE 커널 모듈은 VFS와의 도킹을 구현합니다. 또한 FUSE 커널 모듈은 사용자 공간 프로세스에서 열 수 있는 장치를 구현합니다. 특정 형식으로 변환하여 장치를 통해 사용자 공간 프로세스에 전달합니다. 사용자 공간 프로세스는 결과를 FUSE 커널 모듈에 반환합니다. 그런 다음 커널 모듈은 이를 Linux 커널에서 요구하는 형식으로 복원하고 반환합니다. VFS에.

리눅스 퓨즈 란 무엇입니까?

FUSE 라이브러리는 커널 공간과의 통신을 담당합니다. /dev/fuse에서 요청을 수신하여 이를 일련의 함수 호출로 변환하고 결과를 다시 /dev/fuse에 기록합니다.

FUSE 작업 구조 다이어그램

리눅스 퓨즈 란 무엇입니까?

fuse 라이브러리 인터페이스

struct 퓨즈_작업 {

int (*getattr) (const char *, struct stat *, struct 퓨즈_file_info *fi);

int (* readlink) (const char *, char *, size_t);

int (*mknod) (const char *, mode_t, dev_t);

int (*mkdir) (const char *, mode_t);

int (* unlink) (const char *);

int (*rmdir) (const char *); int (*symlink) (const char *, const char *) int (*rename) (const char *, const char *, unsigned int);

int (*link) (const char *, const char *);

int (*chmod) (const char *, mode_t, struct 퓨즈_file_info *fi);

int (* chown) (const char *, uid_t, gid_t, struct 퓨즈_file_info *fi);

int (*truncate) (const char *, off_t, struct 퓨즈_file_info *fi);

int (*open) (const char *, struct 퓨즈_file_info *);

int (*read) (const char *, char *, size_t, off_t, struct 퓨즈_file_info *);

int (*write) (const char *, const char *, size_t, off_t, struct 퓨즈_file_info *);

int (*statfs) (const char *, struct statvfs *);

int (*flush) (const char *, struct 퓨즈_file_info *);

        int (*release) (const char *, struct 퓨즈_file_info *);

        int (*fsync) (const char *, int, struct 퓨즈_file_info *);

        int (*setxattr) (const char *, const char * , const char *, size_t, int);

        int (*getxattr) (const char *, const char *, char *, size_t);

        int (*listxattr) (const char *, char *, size_t);

        int (*removexattr) (const char *, const char *);

        int (*opendir) (const char *, struct 퓨즈_file_info *);

        int (*readdir) (const char *, void *, 퓨즈_fill_dir_t , off_t,

        struct 퓨즈_file_info *, enum 퓨즈_readdir_flags);

        int (*releasedir) (const char *, struct 퓨즈_file_info *);

        int (*fsyncdir) (const char *, int, struct 퓨즈_file_info *);

ㅋㅋㅋ 정수( *create) (const char *, mode_t, struct 퓨즈_file_info *);

        int (*lock) (const char *, struct 퓨즈_file_info *, int cmd,struct 무리 *);

        int (*utimens) (const char * , const struct timespec tv[2], struct 퓨즈_file_info *fi);

        int (*bmap) (const char *, size_t blocksize, uint64_t *idx);

        int (*ioctl) (const char *, int cmd, void *arg,

        struct 퓨즈_file_info *, unsigned int 플래그, void *data);

        int (*poll) (const char *, struct 퓨즈_file_info *,

        struct 퓨즈_pollhandle *ph, unsigned *reventsp);

        int (*write_buf) (const char *, struct 퓨즈_bufvec *buf, off_t off,struct 퓨즈_file_info *);

        int (*read_buf) (const char *, struct 퓨즈_bufvec **bufp,

        size_t 크기, off_t off, struct 퓨즈_file_info *);

        int (*flock) (const char *, struct 퓨즈_file_info *, int op);

        int (*fallocate) (const char *, int, off_t, off_t,struct 퓨즈_file_info *);

}; ㅋㅋㅋ 퓨즈 .ko模块“modprobe 퓨즈”,然后在切换到example目录下编译fusexmp.c

内核源码解析

        内核源码재:内核源码/fs/fuse

     1.fuse内核模块被加载时,以下初始化例程会被调用,见fuse_init函数        (1)fuse_fs_init(); 注册fuse文件系统,创建fuse_inode高速缓存。

        (2)fuse_dev_init(); 创建fuse_req高速缓存,加载fuse设备驱动,用于apps_init(); /sys/fs目录下增加fuse节点,fuse节点下增加connections节点。

        (4)fuse_ctl_init(); 注册fuse控应文件系统

        2.fuse内核模块被卸载时,执行对应的清理工作,见fuse_exit函数

        (1)fuse_ctl_cleanup(); 注销fuse控system文件系统

        (2)fuse_sysfs_cleanup(); 移除퓨즈、연결节点。

        (3)fuse_fs_cleanup(); 注销fuse文件系统,释放fuse_inode高速缓存。

        (4)fuse_dev_cleanup(); 注销fuse设备驱动程序,释放fuse_req高速缓存。

    3. 퓨즈_conn 이 구조는 사용자 파일 시스템이 마운트될 때 생성되고, 파일 시스템이 마운트 해제될 때 해제되며, 주로 각 요청 큐를 관리하는 데 사용됩니다. 마운트된 파일 시스템은 퓨즈_conn 링크 목록을 유지합니다(퓨즈 파일 시스템은 여러 번 마운트될 수 있음).

4. 퓨즈_conn의 연결 필드는 연결 상태를 나타내는 데 사용됩니다. 파일 시스템이 마운트 해제되거나 연결이 중단되거나 장치 드라이버가 해제되면 필드는 0입니다. 이때 연결이 (중단된) 로드된 파일 시스템) 정상적인 서비스를 제공할 수 없습니다. 이 필드는 퓨즈_request_send에서 확인되며, 일반 퓨즈 파일 시스템이 연결된 경우에만 요청이 전송됩니다. ​​​​​​​

​​​​​ 5. 퓨즈의 각 요청은 퓨즈 요청, inode, 파일 등의 입력 및 출력 매개변수를 포함하는 퓨즈_req 구조로 표시됩니다. .

6. 각 퓨즈의 입력 및 출력 매개변수는 세 가지 매개변수를 지원합니다. 퓨즈_in 및 퓨즈_아웃 구조 정의를 참조하세요. 퓨즈_req 구조. 요청 유형 및 요청 매개변수에 따라 퓨즈_in(numargs)의 매개변수 수를 설정하고 매개변수를 args 배열에 채우는 동시에 퓨즈_아웃 출력 매개변수 수를 설정하고 입력합니다. 출력 결과가 args 배열에 저장되는 주소(로컬 변수 outarg)입니다.

7. 퓨즈 파일 시스템이 요청 입력 및 출력 매개변수를 설정한 후 모든 인터페이스는 마지막으로 퓨즈_request_send를 호출하여 이 요청을 나타내는 퓨즈_req 구조의 상태 플래그를 FUSE_REQ_PENDING으로 설정하고 해당 요청을 퓨즈_conn의 보류 중인 연결 목록에 추가합니다. call request_wait_answer 요청이 완료될 때까지 기다립니다(대기 대기열이 깨어난 후 요청 상태가 FUSE_REQ_FINISHED인지 확인해야 함). 이 요청이 응답되면 결과는 지역 변수 outarg에 저장되고, 퓨즈는 해당 처리를 수행하여 결과를 상위 계층으로 반환합니다.

8. 각 요청 퓨즈_req 구조에는 wait_queue_head_t의 waitq 필드가 포함되어 있습니다. 각 요청이 발행된 후 먼저 퓨즈_conn의 waitq 대기 대기열을 깨우고 사용자 모드 데몬에 요청이 도착했음을 알리고 wait_event_interruptible을 호출합니다. req의 waitq에서 절전 모드로 전환하고 FUSE_REQ_FINISHED 조건이 true가 될 때까지 기다립니다.

9. 퓨즈 장치 드라이버는 퓨즈가 사용자 모드와 커널 모드 간에 데이터를 교환하는 데 사용하는 간단한 블록 장치 드라이버입니다. 퓨즈에는 루프에서 실행되는 사용자 공간 데몬이 포함되어 있습니다. 장치에서 요청을 읽습니다. 요청이 없으면 퓨즈_conn의 waitq에서 대기합니다(이전 단락에서 요청이 발행된 후 깨어나는 퓨즈_conn의 waitq 대기 대기열에 해당). 요청이 있으면 퓨즈_conn의 보류 대기열에서 첫 번째 요청을 꺼내고(이전 단락에서 요청이 발행된 후 퓨즈_conn에 추가된 보류 중인 연결 목록에 해당) 해당 요청을 데몬 이후 처리 대기열로 이동합니다. 퓨즈_req의 관련 정보를 사용자 상태로 읽어들이고, 요청에 따라 사용자 상태에 구현된 콜백을 호출하고, 사용자 모드 요청이 완료된 후 해당 퓨즈_req를 찾아 퓨즈 장치 드라이버에 씁니다. 처리 대기열에서 결과를 퓨즈_req의 out 매개 변수에 복사하고 퓨즈_req의 상태를 FUSE_REQ_FINISHED로 설정한 다음 퓨즈_req를 깨웁니다. 이 시점에서 퓨즈_req가 처리되고 퓨즈 파일 시스템이 상위 계층으로 복귀한다.

관련 추천: "Linux 비디오 튜토리얼"

위 내용은 리눅스 퓨즈 란 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.