파일 시스템 커널 API

파일 시스템 커널 API

모든 파일 시스템이 임시적이라고 가정할 때 ls, touch, cat 등과 같은 도구는 어떻게 상호 작용합니까? 내 생각에 'ls'는 btrfs에 대한 세부 사항을 모르지만 어쨌든 디렉토리 항목을 읽습니다. 프로세스가 파일에 쓸 때 특정 파일 시스템의 블록 할당자에 대한 세부 정보를 알지 못하지만 이에 관계없이 파일은 성공적으로 기록됩니다.
프로세스에서 기본 파일 시스템 구현을 숨기는 일종의 커널 API가 있습니까? 학문적 목적으로 사용자 정의 단순 파일 시스템을 설계하고 이를 작동하기 위한 프로그램(mkfs, fsck 등)을 작성하는 것은 그리 복잡하지 않지만, 다른 프로세스에서 사용할 수 있도록 커널 파일 시스템 구현을 어떻게 지시합니까?

편집:
나는 사용자 공간의 시스템 호출에 대해 이해하지만, 내가 정말로 관심을 갖는 것은 나중에 커널 공간에서 일어나는 일입니다.

답변1

open모든 POSIX 시스템에서 애플리케이션과 커널 사이의 인터페이스는 , read, 등 write의 여러 함수 호출입니다. 예를 들어 close애플리케이션은 cat이러한 함수를 호출합니다. 이러한 함수가 배후에서 어떻게 구현되는지는 중요하지 않습니다.

Unix 시스템에서 이러한 기능은 실제로시스템 호출: 애플리케이션 호출핵심. 커널 내부의 일반적인 아키텍처는 다음과 같습니다.가상 FS파일 시스템 형식과 독립적인 작업(예: 올바른 파일 시스템 찾기, 권한, 잠금 등)을 처리하는 계층입니다. 파일이 상주하는 파일 시스템이 결정되면 VFS 계층은 작업을 올바른 파일 시스템별 드라이버에 전달합니다.

다음과 같은 도구를 사용하여 애플리케이션과 커널 간의 인터페이스를 관찰할 수 있습니다.스트레스Linux 또는 기타 Unix 플랫폼( trace, truss, ...)의 동급 제품. 예(시작 및 최종 정리를 위한 추적 부분 생략 cat):

$ strace cat foo
open("foo", O_RDONLY)                   = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=6, ...}) = 0
fadvise64(3, 0, 0, POSIX_FADV_SEQUENTIAL) = 0
mmap(NULL, 139264, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f8b9ea14000
read(3, "hello\n", 131072)              = 6
write(1, "hello\n", 6hello
)                  = 6
read(3, "", 131072)                     = 0
munmap(0x7f8b9ea14000, 139264)          = 0
close(3)                                = 0

파일 및 에서 cat호출을 볼 수 있습니다 open. 그것은 또한 성능 최적화를 위해서만 호출되고 생각합니다 .readclosefstatfadvise64

VFS와 파일 시스템 드라이버 간의 인터페이스는 그렇게 쉽게 모니터링할 수 없습니다.

프로그램은 파일을 다루지 않고 저장 영역을 다루기 때문에 커널의 파일 시스템 인터페이스를 선호 mkfs하지만 통과하지 않습니다. fsck그들은 방문한다블록 장치파일 시스템을 직접 포함합니다.

새로운 파일 시스템에 대한 지원을 추가하려면 이에 대한 드라이버를 작성해야 합니다. 이 문제를 해결하는 방법에는 두 가지가 있습니다.

  • 커널에서 실행되는 드라이버를 작성할 수 있습니다. 이는 최상의 성능을 제공하며 세분화된 액세스 제어와 같은 특정 기능을 구현하는 유일한 방법입니다. 그러나 디버깅도 더 어렵습니다(드라이버에 버그가 있는 경우 재부팅해야 할 수도 있습니다. 운이 좋으면 오류 추적을 볼 수 있고 데이터가 저장될 때까지 재부팅을 지연할 수도 있습니다. 가상 머신에서 이 작업을 수행하세요.) 구현해야 할 인터페이스가 무엇인지 알아보려면 Unix 변형 커널에 대한 문서를 살펴보세요.
  • 또는 다음을 사용할 수 있습니다.퓨즈, 모든 요청을 커널 외부로 다시 전달하는 파일 시스템 드라이버이므로 각 파일 시스템 드라이버는 프로세스로 구현됩니다. 파일 시스템에 문제가 있는 경우 파일 시스템 드라이버 프로세스를 종료하면 나머지 운영 체제는 계속 존재할 수 있습니다. FUSE 파일 시스템을 작성하는 방법을 알아보려면 다음을 참조하세요.다음과 같은 튜토리얼을 읽어보세요.수미트 싱.

답변2

Unix/Linux 시스템은 POSIX 시스템 호출 open(2)/close(2)/read(2)/write(2) 및 stat(2)뿐만 아니라 opendir(3)/angledir(와 같은 일부 상위 수준 함수도 제공합니다. 3) /readdir(3), 이는 해당 도구를 작성하기에 충분합니다(C 래퍼를 사용하는 것이 더 쉽습니다). 커널의 어려운 작업 중 하나는 제공된 다양한 파일 시스템에서 커널이 작동하도록 만들고 커널이 상주할 수 있는 모든 장치에서 모든 것이 작동하도록 만드는 것입니다.

답변3

대부분의 도구의 경우 맨 아래 레이어는C 표준 라이브러리("libc"). , 및 와 libc같은 다양한 저수준 파일 처리 루틴이 제공됩니다 . 이러한 루틴은 커널의 블록 장치 계층, 장치 드라이버 및 마지막으로 하드웨어 위에 있는 커널의 파일 시스템 계층에 연결됩니다.openreadwrite

libc의 구현 중 하나는 GNU C 라이브러리("glibc")입니다. 한 번 살펴보고 싶을 수도 있습니다공식 문서glibc에서는 하위 수준 파일 기능을 자세히 설명합니다.

관련 정보