UNIX 파일 시스템 구조와 inode·마운트 관리 방식
UNIX 파일 시스템의 디렉토리 트리, inode와 블록 그룹 구조, ext 계열·XFS·Btrfs의 특성, mount와 /etc/fstab 관리 방식을 정리한다.
2026-08-14 · 최초 발행 2026-01-12
루트 디렉토리에서 시작하는 파일 관리 방식
UNIX 파일 시스템은 모든 파일과 디렉토리를 루트(/) 아래의 트리로 배치한다. 디렉토리 이름과 파일의 메타데이터를 분리하고, inode를 통해 둘을 연결하는 구조가 핵심이다. 일반 파일뿐 아니라 디렉토리, 장치, 소켓, 파이프도 파일로 표현하므로 open, read, write, close 같은 일관된 인터페이스를 사용할 수 있다.
이 구조는 1970년대 초 UNIX 개발과 함께 등장했으며 Dennis Ritchie와 Ken Thompson이 Bell Labs에서 개발한 UNIX와 연결된다. 간결한 계층 구조, 다양한 하드웨어에서 동작하는 표준 인터페이스, 대용량 파일 시스템까지 수용하는 확장성이 설계의 축이다.
디렉토리 트리가 역할을 나누는 방식
루트 디렉토리는 모든 경로의 출발점이며 절대 경로는 /로 시작한다. 그 아래 디렉토리는 실행 파일, 설정, 사용자 데이터, 장치, 커널 정보를 목적에 따라 나눈다.
/bin에는 ls, cp, mv, cat 같은 필수 실행 파일이 있고 모든 사용자가 사용할 수 있다. /sbin은 fsck, mount, shutdown 등 시스템 관리 실행 파일을 둔다. /etc는 시스템 설정 파일의 위치이며 /etc/passwd, /etc/fstab, /etc/hosts가 여기에 속한다.
공유 라이브러리는 /lib에 위치하며 /lib/libc.so.6은 C 표준 라이브러리다. /usr는 사용자 프로그램과 데이터를 담고, /usr/bin, /usr/lib, /usr/share로 다시 나뉜다. 사용자별 홈 디렉토리는 /home/user1, /home/user2처럼 /home 아래에 배치되며, root 사용자의 홈은 /root다.
변하는 운영 데이터는 /var에 둔다. /var/log는 로그 파일, /var/spool은 메일과 프린터 등의 스풀 파일, /var/tmp는 재부팅 후에도 유지되는 임시 파일을 담는다. /tmp 역시 임시 파일을 위한 경로지만 재부팅 때 삭제될 수 있다.
/dev는 /dev/sda1, /dev/null, /dev/tty처럼 장치를 파일로 드러낸다. /proc는 프로세스와 커널 정보를 제공하는 가상 파일 시스템으로 /proc/cpuinfo, /proc/meminfo를 포함한다. /sys도 커널과 장치 정보를 제공하는 가상 파일 시스템이며 sysfs를 사용한다. /boot에는 vmlinuz 커널 이미지와 initrd 초기 RAM 디스크 같은 부트 로더 파일이 있다. /mnt, /media는 USB와 CD-ROM 등의 임시 마운트 포인트로 사용한다.
FHS(Filesystem Hierarchy Standard)는 Linux Foundation에서 관리하는 디렉토리 구조 표준이다. 이 표준은 시스템 사이의 이식성과 일관성을 높이는 기준이 된다.
저장 장치 위에 놓이는 메타데이터와 데이터
파일 시스템의 물리적 구성은 부트 블록, 수퍼블록, inode 리스트, 데이터 블록으로 이어진다. 부트 블록은 파일 시스템 첫 번째 블록인 블록 0에 있으며 부트로더와 시스템 부팅 정보를 담는다. 파일 시스템과 독립적이고 모든 파일 시스템에 존재한다.
수퍼블록은 부트 블록 다음인 블록 1에 위치한다. 파일 시스템의 크기, 블록 수, inode 수, 블록 크기, inode 크기 같은 메타데이터를 보관하며, 여러 블록 그룹에는 수퍼블록 복사본이 저장된다.
inode 리스트는 수퍼블록 다음에 배치되는 모든 inode의 배열이다. inode는 파일 메타데이터를 담고, 그 크기는 파일 시스템을 생성할 때 결정된다. 이후 대부분의 영역을 차지하는 데이터 블록에는 파일 데이터와 디렉토리 엔트리가 저장된다.
블록 그룹으로 지역성을 확보한다
블록 그룹은 파일 시스템을 여러 그룹으로 분할하고, 각 그룹이 독립적인 구조를 갖도록 한 방식이다. 파일과 inode를 가까운 위치에 배치해 지역성을 높이고 디스크 헤드 이동을 줄이는 데 목적이 있다.
각 블록 그룹에는 일부 그룹에만 존재하는 수퍼블록 백업, 블록 그룹 디스크립터, 빈 블록을 추적하는 블록 비트맵, 빈 inode를 추적하는 inode 비트맵, inode 테이블, 데이터 블록이 포함된다. 파일과 inode가 같은 그룹에 위치하면 디스크 접근 시간을 줄일 수 있고, 그룹 단위 관리로 대용량 파일 시스템을 지원하며 그룹별 독립적 복구도 가능하다.
경로 이름을 inode까지 해석하는 과정
디렉토리는 파일명에서 inode 번호로 연결하는 테이블이다. 파일의 이름은 디렉토리 엔트리에 있고, 파일 메타데이터와 데이터 블록 위치는 inode에 있다.
디렉토리 /home/user:
. → inode 50000
.. → inode 10000
file.txt → inode 12345
subdir → inode 12346
디렉토리 엔트리는 다음과 같은 형태를 가진다.
struct dirent {
ino_t d_ino; // inode 번호
char d_name[]; // 파일명
};
/home/user/file.txt를 열 때는 루트 디렉토리 inode인 inode 2를 읽고, / 디렉토리 데이터 블록에서 home을 찾아 inode 10000을 확인한다. 이어 /home 디렉토리 inode와 데이터 블록에서 user를 찾아 inode 50000으로 이동한다. /home/user의 inode와 데이터 블록에서 file.txt를 찾으면 inode 12345를 읽고, 마지막으로 해당 파일의 데이터 블록을 읽는다.
자주 쓰는 inode와 디렉토리는 메모리에 캐싱되어 경로 탐색 성능을 높인다.
파일 시스템별로 달라지는 선택 기준
ext2는 1993년 Rémy Card가 개발한 전통적인 UNIX 파일 시스템 구조다. inode와 블록 그룹을 사용하지만 저널링이 없어 시스템 충돌 시 fsck 복구 시간이 길 수 있다.
ext3는 2001년 Stephen Tweedie가 개발했으며 ext2에 저널링을 더해 데이터 무결성과 빠른 복구를 지원한다. journal 모드는 메타데이터와 데이터를 저널링하고, ordered 모드는 메타데이터를 저널링하면서 데이터를 먼저 쓴다. writeback은 메타데이터만 저널링한다. ordered는 기본 모드다.
ext4는 2008년에 개발되었다. 익스텐트 기반 할당, 16TB 대용량 파일 지원, 지연 할당, 빠른 fsck, 나노초 단위의 타임스탬프 정밀도 향상이 특징이다. 익스텐트는 연속된 블록을 단일 단위로 관리하므로 단편화를 줄인다.
XFS는 1993년 SGI가 개발하고 2001년 Linux로 포팅한 파일 시스템이다. 8EB 파일 시스템, 병렬 I/O 최적화, 동적 inode 할당, AG(Allocation Group) 구조를 제공한다. 대용량 파일과 고성능 I/O가 필요한 서버와 데이터베이스 환경에 맞는다.
Btrfs는 2007년 Oracle이 개발했다. Copy-on-Write(CoW), 스냅샷, 클론, 데이터 무결성을 위한 체크섬, RAID, 서브볼륨을 지원하므로 고급 파일 시스템 기능이 필요한 경우에 사용할 수 있다.
디렉토리 트리에 파일 시스템을 연결하는 마운트
마운트는 블록 장치인 디스크나 파티션의 파일 시스템을 디렉토리 트리에 연결하는 작업이다. 연결 대상 디렉토리를 마운트 포인트라고 하며, 마운트한 동안에는 기존 디렉토리 내용이 숨겨진다.
/dev/sda1 → / (루트 파일 시스템)
/dev/sda2 → /home
/dev/sdb1 → /mnt/usb
mount와 umount는 파일 시스템을 연결하거나 분리할 때 사용한다.
# 파일 시스템 마운트
mount /dev/sda1 /mnt
# 파일 시스템 유형 지정
mount -t ext4 /dev/sda1 /mnt
# 읽기 전용 마운트
mount -o ro /dev/sda1 /mnt
# 모든 마운트된 파일 시스템 표시
mount
# 언마운트
umount /mnt
# 강제 언마운트
umount -f /mnt
부팅 때 자동으로 마운트할 항목은 /etc/fstab에 저장한다.
# <device> <mount-point> <type> <options> <dump> <pass>
/dev/sda1 / ext4 defaults 0 1
/dev/sda2 /home ext4 defaults 0 2
/dev/sdb1 /mnt/usb vfat noauto 0 0
각 필드는 장치 경로 또는 UUID를 지정하는 device, 연결할 mount-point, 파일 시스템 type, defaults, ro, noauto 등의 options, 백업 여부를 나타내는 dump, fsck 순서를 나타내는 pass로 구성된다. dump는 0 또는 1이고 pass에는 0, 1, 2를 사용한다.
UUID를 이용하면 장치를 식별해 /etc/fstab에 마운트 설정을 기록할 수 있다.
# UUID 확인
blkid /dev/sda1
# /dev/sda1: UUID="12345678-1234-1234-1234-123456789012" TYPE="ext4"
# /etc/fstab에서 UUID 사용
UUID=12345678-1234-1234-1234-123456789012 / ext4 defaults 0 1
생성·점검·조회에 사용하는 도구
mkfs는 파일 시스템을 생성하고 포맷하는 명령이다.
# ext4 파일 시스템 생성
mkfs.ext4 /dev/sda1
# XFS 파일 시스템 생성
mkfs.xfs /dev/sdb1
# inode 비율 지정 (ext4)
mkfs.ext4 -i 8192 /dev/sda1
fsck와 xfs_repair는 파일 시스템의 점검과 복구에 사용한다. 이 도구는 언마운트 상태에서 실행해야 하며, 루트 파일 시스템은 단일 사용자 모드에서 실행한다.
# ext4 점검
fsck.ext4 /dev/sda1
# 또는
e2fsck /dev/sda1
# 자동 수정
fsck -y /dev/sda1
# XFS 복구
xfs_repair /dev/sdb1
디스크 사용량과 inode 사용량은 df로 확인할 수 있다.
# 파일 시스템 사용량
df -h
# Filesystem Size Used Avail Use% Mounted on
# /dev/sda1 100G 50G 50G 50% /
# /dev/sda2 200G 100G 100G 50% /home
# inode 사용량
df -i
ext2, ext3, ext4 파일 시스템의 상세 정보는 dumpe2fs로, XFS 정보는 xfs_info로 조회한다.
dumpe2fs /dev/sda1
xfs_info /dev/sdb1