리눅스 퓨즈 란 무엇입니까?
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











대 코드 시스템 요구 사항 : 운영 체제 : Windows 10 이상, MacOS 10.12 이상, Linux 배포 프로세서 : 최소 1.6GHz, 권장 2.0GHz 이상의 메모리 : 최소 512MB, 권장 4GB 이상의 저장 공간 : 최소 250MB, 권장 1GB 및 기타 요구 사항 : 안정 네트워크 연결, Xorg/Wayland (LINUX)

Linux 시스템의 5 가지 기본 구성 요소는 다음과 같습니다. 1. Kernel, 2. System Library, 3. System Utilities, 4. 그래픽 사용자 인터페이스, 5. 응용 프로그램. 커널은 하드웨어 리소스를 관리하고 시스템 라이브러리는 사전 컴파일 된 기능을 제공하며 시스템 유틸리티는 시스템 관리에 사용되며 GUI는 시각적 상호 작용을 제공하며 응용 프로그램은 이러한 구성 요소를 사용하여 기능을 구현합니다.

메모장은 Java 코드를 직접 실행할 수는 없지만 다른 도구를 사용하여 명령 줄 컴파일러 (Javac)를 사용하여 Bytecode 파일 (filename.class)을 생성하면 달성 할 수 있습니다. Java Interpreter (Java)를 사용하여 바이트 코드를 해석하고 코드를 실행하고 결과를 출력하십시오.

VS 코드 확장을 설치하는 이유는 다음과 같습니다. 네트워크 불안정성, 불충분 한 권한, 시스템 호환성 문제, C 코드 버전은 너무 오래된, 바이러스 백신 소프트웨어 또는 방화벽 간섭입니다. 네트워크 연결, 권한, 로그 파일, 업데이트 대 코드 업데이트, 보안 소프트웨어 비활성화 및 대 코드 또는 컴퓨터를 다시 시작하면 점차 문제를 해결하고 해결할 수 있습니다.

git 저장소 주소를 보려면 다음 단계를 수행하십시오. 1. 명령 줄을 열고 리포지토리 디렉토리로 이동하십시오. 2. "git remote -v"명령을 실행하십시오. 3. 출력 및 해당 주소에서 저장소 이름을 봅니다.

VSCODE 내장 터미널은 편집기 내에서 명령 및 스크립트를 실행하여 개발 프로세스를 단순화 할 수있는 개발 도구입니다. VSCODE 터미널 사용 방법 : 바로 가기 키 (CTRL/CMD)로 터미널을 엽니 다. 명령을 입력하거나 스크립트를 실행하십시오. 핫키 (예 : ctrl l)를 사용하여 터미널을 지우십시오). 작업 디렉토리 (예 : CD 명령)를 변경하십시오. 고급 기능에는 디버그 모드, 자동 코드 스 니펫 완료 및 대화식 명령 기록이 포함됩니다.

Visual Studio Code (VSCODE)에서 코드를 작성하는 것은 간단하고 사용하기 쉽습니다. vscode를 설치하고, 프로젝트를 만들고, 언어를 선택하고, 파일을 만들고, 코드를 작성하고, 저장하고 실행합니다. VSCODE의 장점에는 크로스 플랫폼, 무료 및 오픈 소스, 강력한 기능, 풍부한 확장 및 경량 및 빠른가 포함됩니다.

VS 코드는 Mac에서 사용할 수 있습니다. 강력한 확장, GIT 통합, 터미널 및 디버거가 있으며 풍부한 설정 옵션도 제공합니다. 그러나 특히 대규모 프로젝트 또는 고도로 전문적인 개발의 경우 VS 코드는 성능 또는 기능 제한을 가질 수 있습니다.