본문 바로가기
Kernel/File System

VFS(Virtual File System)

by samdong22 2026. 9. 9.

이번 포스트는 가상파일시스템에 대해 다룬다. 

VFS와 VFS구조(슈퍼블록, 아이노드, 덴트리, 파일)에 대해서 정리한다.

 

0. UNIX에서의 파일 시스템

현재 리눅스에서의 파일시스템을 이해하려면 과거에 UNIX에서 사용하던 파일시스템에 대해 이해하는게 도움이 될 것 같다.

과거 UNIX 파일시스템은 오로지 UNIX사의 하드웨어만 마운트가 가능했고, UNIX이외의 solalis, DOS사 등은 마운트 할 수 없었다.

이를 해결한것이 linux의 가상파일시스템이다. 이를 통해서 Linux, solalis, Windows 등 다양한 파일시스템 전부를 마운트 할 수 있게 되었다.

 

1. 가상파일시스템 이란

가상파일시스템의 정의는 "파일 시스템 관련 인터페이스를 유저에게 제공하는 커널 서브시스템" 이다.

출처 : https://jeongzero.oopy.io/95fede13-b280-4b15-8210-058d0eb38700

 

 

위의 사진에서 보듯이 UNIX와 달리 Linux에서는 다양한 종류의 파일시스템을 지원한다.

자세히 보자면, Ext2 파일시스템은 /bin/ls, Windows 파일시스템은 /a/b/c, Solalis 파일시스템은 /x/y/z에 마운트 되어있다.

이때, cp /a/b/c/ /x/y/z명령이 작동되면 open(), create(), read(), write() 등의 시스템콜이 동작하게 된다.

Linux, Windows, Solalis 등 각자 시스템콜의 내부 구현 로직이 다르기 때문에 Linux는 가상파일시스템을 지원한다.

 

2. 가상파일시스템의 구조

가상파일시스템은 각각의 서로다른 파일시스템을 다루기 때문에, 이를 매핑하는 자료구조가 필요하며, 

이 자료구조가 file_operations이다.

file_operations는 struct file안의 f_op멤버가 가리키는 함수 포인터 집합이다. 

 

** 연결 순서를 한번 정리하고 가자면

1. 사용자가 파일 조작 시스템콜을 요청한다. (read(), write() ...)

2. 리눅스 커널이 해당 파일의 struct file을 찾는다.

3. struct file 내부의 f_op가 가리키는 file_operations 함수목록을 확인한다.

4. 함수 목록 내에 등록된 실제 드라이버/파일 시스템 함수를 실행한다.

 

 

   

핵심 구조체들, file, dentry, inode, super_block

  •  struct file : 프로세스가 특정 파일을 열었을 때 메모리에 생성되는 동적실행상태 정보를 가진다. - 사용중인 파일을 표현하는 객체이다.
  • struct dentry :  directory entry를 뜻하며, 파일 시스템의 경로 및 dir 계층 구조를 나타낸다. 이를 통해 파일과 아이노드를 연결시킨다. - 파일 이름과 디렉터리 트리 구조를 메모리에 캐싱해둠으로 경로 탐색 속도를 극대화한다. 이의 동작 방식은 VFS가 경로명을 사용할 때마다 먼저 덴트리에서 찾아보고, 없다면 경로 탐색을 실시한다. (중요한 이유는 파일 open등의 작업은 수많은 disk I/O를 필요로 한다.)
  • struct inode : index node를 뜻하며, 디스크에 실존하는 파일의 물리적 메타데이터이다. 즉 super_block에서 저장한 메타데이터를 유지한다. - 데이터(파일 크기, 접근 권한, ID ..)가 저장된 디스크 블록 위치 정보를 가진다.
  • struct super_block : 마운트된 전체 파일 시스템의 전역 메타데이터를 저장한다. - 파일시스템의 종류, 블록의 크기 or 갯수 등을 관리한다.

위의 네개의 구조체는 각각의 나눠져서 정의되어있고, 꼭 필요하다. 

file 구조체에서도 f_op만으로 수행이 되는게 아닌, dentry에 접근하기위한 f_dentry가 필요한것처럼 모든 포인터 변수가 중요하다.

 

 

3. /proc 파일시스템

/proc 파일시스템은 VFS아래 파일시스템이고, 운영체제에서 현재 실행중인 커널 정보와 프로세스 상태를 실시간으로 보여준다.

 

/proc아래 파일들은 일반 파일과는 다르다.

일반 파일을 예로들면 /home/user/test.txt등 실제 디스크에 데이터가 저장된 물리적 파일이 된다.

read()함수가 들어오면 디스크 컨트롤러를 통해서 실제 데이터를 가져오게 된다.

 

그러나 /proc/meminfo와 같은 예를 보면은 파일을 형태를 빌려(인터페이스) 커널 내부의 함수를 실행시키는 매개체임을 알 수 있다.

위에 파일 시스템의 동작 순서와 동일하게, /proc/meminfo에 해당하는 struct file을 열고, 이 파일에 연결된 file_operations를 확인한다.

 

 

사담

지금은 "리눅스 커널 내부구조"책으로 전체 흐름을 잡고 공부중이고, 이번 포스트처럼 교수님 강의를 참고하거나, 커널에 대해 포스팅하시는 분들의 글을 읽으면서 정리를 하고있다.

커널 내부구조 책을 9월 안으로는 다 정리하고, 좀 더 커널에 대해 틀을 잡고 나아가고자 한다.

26년 목표는 간단한 커널 커밋이다!

 

 

 

REFERENCE

https://jeongzero.oopy.io/95fede13-b280-4b15-8210-058d0eb38700