특정 파일 시스템과 상호 작용하는 방법은 무엇입니까?

특정 파일 시스템과 상호 작용하는 방법은 무엇입니까?

사용자 공간 프로그램이 구체적인 파일 시스템(VFS 아님)과 상호 작용할 수 있습니까? 내가 얻은 것은 VFS를 사용하면 Linux가 모든 파일 시스템을 동일하게 처리하고 사용자 공간에 추상 API를 제공할 수 있다는 것입니다.

조건을 구현하고 싶습니다. 사용자 정의 파일 시스템은 사용자 공간에서 사용 가능한 페이지 수준에서 디스크(SSD)를 읽고 쓰고 지우기 위한 API를 제공할 수 있어야 합니다.

이를 위해서는 특정 파일 시스템과 VFS 상호 작용을 우회하는 방법이 필요했습니다.

답변1

파일 시스템 상호 작용의 유일한 진입점은 시스템 호출 메커니즘이며, 이는 전적으로는 아니지만 VFS에 크게 의존합니다.

누군가 VFS에 의존하지 않는 파일 시스템을 생성하려는 경우 해당 사람은 Linux 블록 수준과 직접 상호 작용하는 새로운 I/O 시스템 호출 세트를 구현해야 합니다.

이것은 우아하지도 않고 휴대하기에도 좋지 않습니다. 구현, 디버그 및 유지 관리가 까다로울 뿐만 아니라 이 사용자 정의 파일 시스템은 이 사용자 정의 시스템 호출 세트를 사용하는 애플리케이션에서만 액세스할 수 있습니다. 이 접근 방식은 이식성에 대한 개념을 완전히 없애줍니다.

따라서 귀하의 질문에 답해 드리자면, 그렇습니다. 새로운 시스템 호출 세트를 구현하면 가능합니다. 그러나 그러한 파일 시스템에 대한 유일한 사용자 공간 클라이언트는 귀하의 애플리케이션이 될 것입니다. 이보다 더 이식성을 높이려면 VFS를 사용해야 합니다.

편집하다:

나는 당신을 본다이전 질문SSD용 고성능 키-값 스토리지 시스템 구현과 관련하여 이러한 접근 방식을 고려하게 된 동기가 있다고 생각합니다. 두 가지 점을 추가하고 싶습니다.

  • VFS는아니요병목 현상. I/O 작업을 Linux 블록 수준으로 매우 효율적으로 라우팅합니다.
  • 커널 패치(코드 품질 문제)가 필요한 애플리케이션은 가용성이 매우 낮습니다. 개인적인 사용을 위해 이 시스템을 명시적으로 작성하는 것이 아니라면 커널 내부를 최적화하기 전에 다른 가능성을 탐색해 보는 것이 좋습니다.

답변2

"디스크에서 지우기"(예: ioctl())를 제외하면 다음과 유사합니다.

  • 블록 장치에서 페이지 읽기/쓰기
  • 주어진 파일의 페이지 읽기/쓰기

적절한 페이지 크기로 lseek + 읽기/쓰기를 사용하여 이 모든 작업을 수행할 수 있습니다.

(한 번의 시스템 호출로 모든 것을 사용하려면 pred/pwrite를 수행할 수 있지만 이는 동일합니다)

답변3

따르다Linux의 저수준 디스크 I/O, 블록 장치에 직접 액세스하는 프로그램을 사용하여 파일 시스템에 액세스하는 고유한 코드를 구현할 수 있습니다. 이는 커널의 파일 시스템 드라이버(VFS 계층을 통해 액세스됨 - VFS 계층의 용도임)보다 느릴 가능성이 높습니다. 이는 일부 사용 사례(포렌식 또는 커널에서 지원하지 않는 파일 시스템 유형 액세스 등)에 가능하고 유용하지만 사용 사례에는 잘못된 접근 방식입니다.

관련 정보