리눅스 파일 시스템의 시작점, VFS 구조 쉽게 이해하기

리눅스에서 파일을 열고, 읽고, 쓰는 동작은 겉으로 보면 단순해 보입니다. 하지만 그 안쪽에서는 여러 파일 시스템을 하나의 방식으로 다루기 위한 핵심 구조가 동작하고 있습니다. 그 출발점이 바로 VFS(Virtual File System) 입니다. 이 글에서는 리눅스 파일 시스템의 시작점인 VFS 구조를, 커널 내부 흐름 기준으로 쉽게 풀어 설명합니다.

왜 VFS가 필요한가

리눅스는 하나의 파일 시스템만 사용하지 않습니다. ext4, XFS, Btrfs, NFS, proc, sysfs처럼 성격이 전혀 다른 파일 시스템들이 동시에 공존합니다. 만약 각 파일 시스템마다 접근 방식이 달랐다면, 응용 프로그램은 파일 시스템마다 다른 API를 사용해야 했을 것입니다.

VFS는 이 문제를 해결하기 위해 등장했습니다.
사용자 입장에서는 모든 파일이 동일한 방식으로 보이게 만들고
커널 내부에서는 각 파일 시스템의 차이를 흡수하는 중간 계층
역할을 합니다.

즉, VFS는 파일 시스템의 공통 인터페이스이자 추상화 계층입니다.

파일 접근의 실제 출발점은 어디인가

사용자 프로그램에서 open(), read(), write() 같은 시스템 콜을 호출하면, 이 요청은 바로 디스크로 가지 않습니다. 먼저 커널 내부의 VFS 계층으로 들어옵니다. VFS는 이 요청을 받아서
이 파일이 어떤 파일 시스템에 속해 있는지 판단하고
해당 파일 시스템에 맞는 실제 구현을 호출합니다

따라서 모든 파일 작업의 시작점은 VFS라고 볼 수 있습니다.

VFS가 제공하는 핵심 개념들

VFS를 이해하려면 몇 가지 핵심 객체를 알아야 합니다. 이들은 실제 데이터보다 구조와 관계를 표현하는 객체에 가깝습니다.

슈퍼블록 객체

슈퍼블록은 파일 시스템 전체를 대표하는 구조입니다. 파일 시스템의 종류, 크기, 블록 정보, 마운트 상태 같은 메타 정보를 담고 있습니다. ext4든 XFS든, 마운트되는 순간 VFS는 해당 파일 시스템을 하나의 슈퍼블록으로 관리합니다.

아이노드 객체

아이노드는 파일 하나를 대표하는 구조입니다. 파일의 크기, 권한, 소유자, 데이터 위치 정보 등이 여기에 들어 있습니다. 파일 이름은 포함하지 않고, 순수하게 “이 파일이 무엇인가”에 대한 정보를 담습니다.

덴트리 객체

덴트리는 파일 이름과 아이노드를 연결해주는 역할을 합니다. 경로 탐색 과정에서 매우 중요한 구조로, 디렉터리 캐시의 핵심입니다.
예를 들어 /home/user/file.txt 경로를 해석할 때, VFS는 덴트리를 따라가며 각 단계의 아이노드를 찾습니다.

파일 객체

파일 객체는 실제로 열린 파일을 의미합니다. 파일 디스크립터와 연결되며, 현재 파일 오프셋, 접근 모드 같은 실행 중 상태 정보를 관리합니다.

VFS에서 파일 경로가 해석되는 흐름

파일을 열 때 VFS는 다음과 같은 과정을 거칩니다.

경로 문자열을 받음
루트 또는 현재 디렉터리 기준으로 덴트리 탐색 시작
각 경로 요소마다 덴트리 캐시 확인
필요하면 해당 파일 시스템에 실제 탐색 요청
최종 아이노드와 파일 객체 생성

이 과정 덕분에 동일한 경로 탐색 로직으로 로컬 디스크, 네트워크 파일 시스템, 가상 파일 시스템을 모두 처리할 수 있습니다.

실제 파일 시스템은 언제 등장하는가

VFS는 직접 디스크를 읽지 않습니다. 대신 각 파일 시스템이 제공하는 연산 테이블을 호출합니다. 예를 들어 read 요청이 들어오면
VFS는 이 파일의 아이노드가 속한 파일 시스템을 확인하고
해당 파일 시스템의 read 구현을 호출합니다

이 구조 덕분에 ext4와 NFS는 내부 구현이 전혀 달라도, 사용자 입장에서는 동일한 read() 호출로 동작합니다.

가상 파일 시스템도 VFS 위에 있다

proc, sysfs 같은 가상 파일 시스템은 실제 디스크에 데이터가 없습니다. 그럼에도 파일처럼 보이는 이유는, 이들 역시 VFS 인터페이스를 구현하고 있기 때문입니다. 파일을 읽으면 디스크가 아니라 커널 내부 데이터 구조를 참조해 결과를 만들어 반환합니다.

즉, VFS는
실제 저장 장치 기반 파일 시스템
네트워크 파일 시스템
커널 정보 제공용 가상 파일 시스템
모두를 하나의 구조로 묶는 역할을 합니다.

캐시와 VFS의 관계

리눅스의 파일 관련 캐시는 대부분 VFS 구조를 기준으로 동작합니다. 덴트리 캐시, 아이노드 캐시는 VFS 계층에서 관리되며, 파일 시스템 종류와 무관하게 재사용됩니다. 이 덕분에 경로 탐색 속도와 메타데이터 접근 성능이 크게 향상됩니다.

왜 VFS를 이해해야 하는가

VFS 구조를 이해하면
파일 I/O 성능 병목의 위치
왜 특정 작업에서 sys CPU 사용률이 높아지는지
네트워크 파일 시스템이 느린 이유
캐시가 성능에 미치는 영향
같은 문제들을 구조적으로 해석할 수 있습니다.

단순히 “디스크가 느리다”가 아니라, 어느 계층에서 지연이 발생하는지를 구분할 수 있게 됩니다.

정리

리눅스 파일 시스템의 시작점은 디스크가 아니라 VFS입니다. VFS는 다양한 파일 시스템을 하나의 공통 인터페이스로 묶어, 사용자와 커널 사이의 파일 접근을 일관되게 만들어 줍니다. 슈퍼블록, 아이노드, 덴트리, 파일 객체로 이루어진 이 구조 덕분에 리눅스는 유연하고 확장 가능한 파일 시스템 생태계를 유지할 수 있습니다. 결국 VFS를 이해하는 것은 리눅스 파일 시스템 전체를 이해하는 첫걸음이라고 볼 수 있습니다.

댓글 남기기