[Daily morning study] 파일 시스템 구조 (inode, 디렉토리 트리)

#daily morning study

Image


파일 시스템이란

파일 시스템은 OS가 저장 장치(HDD, SSD 등) 위에서 파일과 디렉토리를 생성·읽기·쓰기·삭제할 수 있도록 관리하는 체계다. 파일 시스템이 없으면 디스크는 그냥 연속된 바이트 덩어리일 뿐이다. 대표적인 파일 시스템으로는 ext4(Linux), NTFS(Windows), APFS(macOS) 등이 있다.


디스크 구조 개요

파일 시스템이 초기화(포맷)되면 디스크 영역이 다음과 같이 나뉜다.

영역설명
Boot BlockOS 부팅 코드
Super Block파일 시스템 메타데이터 (블록 크기, inode 수, 블록 수 등)
inode Table모든 파일/디렉토리의 메타데이터 배열
Data Blocks실제 파일 내용이 저장되는 공간

inode (Index Node)

개념

inode는 파일 하나에 대응하는 고정 크기 메타데이터 구조체다. 파일 이름을 제외한 모든 정보를 담는다.

inode가 저장하는 정보:

  • 파일 타입 (일반 파일, 디렉토리, 심볼릭 링크 등)
  • 퍼미션 (rwxrwxrwx)
  • 소유자 UID, GID
  • 파일 크기 (바이트)
  • 타임스탬프 (atime, mtime, ctime)
  • 하드 링크 카운트
  • 데이터 블록 포인터

데이터 블록 포인터 구조 (ext 계열 기준)

inode 하나에는 블록 포인터가 15개 들어 있다.

Direct Pointers (0~11)    → 데이터 블록 직접 가리킴
Single Indirect (12)       → 포인터 목록 블록 → 데이터 블록
Double Indirect (13)       → 포인터 목록 블록 → 포인터 목록 블록 → 데이터 블록
Triple Indirect (14)       → 3단계 간접 참조

블록 크기가 4KB이고 포인터 하나가 4바이트라면 간접 블록 하나에 포인터 1024개가 들어간다. 이중 간접까지 사용하면 약 4GB 이상의 파일도 표현 가능하다.

inode 번호 확인

ls -i /etc/hosts
# 출력 예: 1234567 /etc/hosts

inode 번호는 파일 시스템 내에서 파일의 실제 주소 역할을 한다.


디렉토리 트리

디렉토리의 정체

디렉토리는 특별한 파일이다. 내부 구조는 (파일 이름 → inode 번호) 쌍의 목록이다.

/etc 디렉토리의 데이터 블록 내용 (개념):
"hosts"    → inode #1234567
"passwd"   → inode #1234568
"fstab"    → inode #1234569
...

파일 이름은 inode에 없고 오직 디렉토리에만 있다. 파일 이름을 바꿔도 inode 번호는 그대로다.

경로 분석 과정

/etc/hosts를 열 때 커널이 하는 일:

  1. /(루트) 디렉토리의 inode를 읽는다 (inode #2로 고정)
  2. 루트 디렉토리 데이터 블록에서 "etc" 항목을 찾아 inode 번호를 얻는다
  3. etc 디렉토리의 inode를 읽고, 데이터 블록에서 "hosts" 항목을 찾는다
  4. hosts 파일의 inode를 읽어 퍼미션 확인 후 데이터 블록에 접근한다

디렉토리 depth가 깊을수록 inode 조회 횟수가 늘어나는 구조다.


하드 링크 vs 심볼릭 링크

하드 링크

ln /etc/hosts /tmp/hosts_link

같은 inode를 가리키는 다른 디렉토리 항목을 추가한다. inode의 링크 카운트가 1 증가한다. 원본 파일을 삭제해도 링크 카운트가 0이 되기 전까지 실제 데이터는 삭제되지 않는다.

  • 파일 시스템 경계를 넘을 수 없다 (inode 번호가 FS마다 독립적이므로)
  • 디렉토리에는 사용 불가 (무한 루프 방지)

심볼릭 링크

ln -s /etc/hosts /tmp/hosts_symlink

별도 inode를 생성하고, 데이터 블록에 대상 경로 문자열을 저장한다. 원본이 삭제되면 링크가 깨진다(dangling symlink).

  • 파일 시스템 경계를 넘을 수 있다
  • 디렉토리에도 사용 가능
구분하드 링크심볼릭 링크
inode동일별도 생성
원본 삭제 시데이터 유지링크 깨짐
FS 경계불가가능
디렉토리불가가능

VFS (Virtual File System)

Linux는 VFS 계층을 두어 ext4, XFS, tmpfs, NFS 등 서로 다른 파일 시스템을 동일한 인터페이스로 다룬다. open(), read(), write() 같은 시스템 콜은 VFS가 받아서 실제 파일 시스템 드라이버로 전달한다.

애플리케이션
    ↓  open("/mnt/usb/file.txt")
VFS 레이어
    ↓
FAT32 드라이버 (USB)    ext4 드라이버 (루트 FS)

파일 삭제의 실제 동작

rm 명령은 파일 데이터를 즉시 지우지 않는다.

  1. 디렉토리에서 해당 (이름 → inode) 항목을 제거한다
  2. inode의 링크 카운트를 1 감소시킨다
  3. 링크 카운트가 0이 되면 inode와 데이터 블록을 free 목록에 반환한다

이 때문에 파일을 삭제한 직후에도 inode와 데이터 블록이 덮어쓰여지기 전까지 복구 도구로 되살릴 수 있다.


정리

  • 파일 시스템은 Super Block + inode Table + Data Blocks로 구성된다
  • inode에는 파일 이름을 빼고 모든 메타데이터와 블록 포인터가 들어 있다
  • 디렉토리는 (이름 → inode 번호) 매핑 테이블이다
  • 경로 조회는 루트부터 각 디렉토리를 순회하며 inode를 따라가는 과정이다
  • 하드 링크는 inode를 공유하고, 심볼릭 링크는 경로 문자열을 저장하는 새 inode다
  • VFS가 여러 파일 시스템을 단일 인터페이스로 추상화한다