FHS(Filesystem Hierarchy Standard) 개요
FHS는 Linux 및 Unix 계열 운영체제에서 디렉토리 구조와 각 디렉토리의 용도를 정의하는 표준이다. Linux Software Base(LSB)의 일부로 유지되며, 대부분의 주요 배포판(Debian, Red Hat, Ubuntu 등)이 이 표준을 따른다.
핵심 설계 원칙:
- 공유 가능(shareable) vs 공유 불가(unshareable): 네트워크를 통해 다른 호스트와 공유할 수 있는 데이터와 호스트별 고유 데이터를 분리
- 정적(static) vs 가변(variable): 변경되지 않는 데이터(바이너리, 라이브러리)와 런타임에 변경되는 데이터(로그, 스풀)를 분리
| 공유 가능 (Shareable) | 공유 불가 (Unshareable) | |
|---|---|---|
| 정적 | /usr, /opt | /etc, /boot |
| 가변 | /var/mail, /var/spool/news | /var/run, /var/lock |
주요 디렉토리 상세 설명
/ (루트 디렉토리)
파일 시스템의 최상위 디렉토리. 모든 파일과 디렉토리의 시작점이다.
- 루트 파일 시스템은 부팅, 복구, 시스템 복원에 필요한 최소한의 파일만 포함해야 한다.
- 별도 파티션 없이 단일 파티션 시스템이라면 모든 것이 여기에 위치한다.
# 루트 디렉토리 구조 확인
ls -la /
# 마운트된 파일 시스템에서 루트 파티션 확인
df -h //bin - 필수 사용자 바이너리
시스템 부팅 및 단일 사용자 모드에서도 필요한 필수 명령어가 위치한다.
- 모든 사용자가 사용 가능한 기본 명령어:
ls,cp,mv,rm,cat,echo,mkdir,chmod등 - 최신 배포판에서는
/bin이/usr/bin의 심볼릭 링크인 경우가 많다 (UsrMerge)
ls -la /bin
# 많은 배포판에서 다음과 같이 확인 가능
readlink -f /bin
# /usr/bin (UsrMerge된 시스템)/sbin - 시스템 관리 바이너리
시스템 관리(부팅, 복구, 수리)에 필요한 바이너리가 위치한다.
- 주로 root 사용자가 실행:
fdisk,fsck,mkfs,ifconfig,iptables,reboot,shutdown - 일반 사용자의
$PATH에는 포함되지 않는 경우가 있다 - 최신 배포판에서는
/usr/sbin의 심볼릭 링크
ls /sbin/
# fdisk fsck halt ifconfig init iptables mkfs reboot shutdown ...
# 일반 사용자에서 sbin 명령 위치 확인
which fdisk # 없을 수 있음
/sbin/fdisk -l # 절대 경로로 실행 (root 권한 필요)/usr - 사용자 프로그램 및 데이터
Unix System Resources의 약자. 시스템에 설치된 대부분의 프로그램, 라이브러리, 문서가 위치한다. 읽기 전용(read-only)으로 마운트 가능하도록 설계되었다.
| 하위 디렉토리 | 설명 |
|---|---|
/usr/bin | 대부분의 사용자 명령어 |
/usr/sbin | 시스템 관리 명령어 (비필수) |
/usr/lib | 공유 라이브러리 |
/usr/include | C/C++ 헤더 파일 |
/usr/share | 아키텍처 독립적 데이터 (man 페이지, 아이콘 등) |
/usr/src | 커널 소스 코드 등 |
/usr/local | 로컬 설치 프로그램 (아래 참조) |
/usr/local - 로컬 설치 프로그램
시스템 패키지 관리자가 아닌, 관리자가 직접 컴파일/설치한 소프트웨어가 위치한다.
/usr와 동일한 하위 구조:bin,sbin,lib,share,include,etcmake install시 기본 PREFIX가 보통/usr/local- 패키지 관리자(apt, yum)로 설치한 것과 분리하여 관리
# 직접 빌드한 소프트웨어 설치 예시
./configure --prefix=/usr/local
make
sudo make install
# /usr/local/bin에 설치된 프로그램 확인
ls /usr/local/bin//etc - 시스템 설정 파일
시스템 전역 설정 파일이 위치한다. 이름의 유래는 “et cetera”이며, 초기 Unix에서 다른 곳에 분류되지 않는 파일을 모아두던 디렉토리였으나 현재는 설정 파일 전용으로 사용된다. 바이너리 파일은 포함하지 않는다.
주요 설정 파일:
| 파일/디렉토리 | 용도 |
|---|---|
/etc/passwd | 사용자 계정 정보 |
/etc/shadow | 암호화된 패스워드 |
/etc/group | 그룹 정보 |
/etc/fstab | 파일 시스템 마운트 테이블 |
/etc/hosts | 호스트명-IP 매핑 |
/etc/hostname | 시스템 호스트명 |
/etc/resolv.conf | DNS 설정 |
/etc/network/ | 네트워크 설정 (Debian 계열) |
/etc/sysconfig/ | 시스템 설정 (Red Hat 계열) |
/etc/crontab | 시스템 크론 작업 |
/etc/ssh/ | SSH 서버/클라이언트 설정 |
/etc/sudoers | sudo 권한 설정 |
/etc/profile | 전역 셸 프로파일 |
/etc/environment | 전역 환경 변수 |
# passwd 파일 구조: 사용자명:패스워드:UID:GID:설명:홈디렉토리:셸
cat /etc/passwd | head -5
# root:x:0:0:root:/root:/bin/bash
# daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
# fstab 파일 구조: 장치 마운트포인트 파일시스템 옵션 dump pass
cat /etc/fstab/var - 가변 데이터
런타임에 크기가 변하는 파일들이 위치한다.
| 하위 디렉토리 | 설명 |
|---|---|
/var/log | 시스템/애플리케이션 로그 (syslog, auth.log, kern.log 등) |
/var/cache | 애플리케이션 캐시 데이터 |
/var/spool | 스풀 데이터 (인쇄 큐, 메일 큐, cron) |
/var/mail | 사용자 메일함 |
/var/tmp | 재부팅 후에도 유지되는 임시 파일 |
/var/run | 런타임 데이터 (PID 파일 등, 최신 시스템에서는 /run의 심볼릭 링크) |
/var/lib | 프로그램 상태 데이터 (dpkg, mysql 등) |
/var/lock | 잠금 파일 |
# 최근 시스템 로그 확인
tail -20 /var/log/syslog
# 인증 관련 로그
tail -20 /var/log/auth.log
# 디스크 사용량 확인 - /var/log가 커질 수 있음
du -sh /var/log//tmp - 임시 파일
모든 사용자가 쓸 수 있는 임시 파일 디렉토리.
- 재부팅 시 삭제되는 것이 일반적 (배포판에 따라 다름)
- Sticky Bit(1777)이 설정되어 자신의 파일만 삭제 가능
tmpfs(메모리 기반)로 마운트되는 경우가 많다
ls -ld /tmp
# drwxrwxrwt 15 root root 4096 ... (t = Sticky Bit)
# tmpfs 여부 확인
df -T /tmp
# Filesystem Type ...
# tmpfs tmpfs .../home - 사용자 홈 디렉토리
일반 사용자의 개인 파일이 위치한다. 각 사용자마다 /home/username 디렉토리가 생성된다.
ls -la /home/
# drwxr-xr-x 5 alice alice 4096 ... alice
# drwxr-xr-x 3 bob bob 4096 ... bob
# 현재 사용자 홈 디렉토리
echo $HOME
echo ~/root - root 사용자 홈
root(관리자) 계정의 홈 디렉토리. /home/root가 아닌 /root에 위치하는 이유는, /home이 별도 파티션에 마운트되지 않았을 때에도 root가 작업할 수 있도록 하기 위함이다.
/opt - 선택적 소프트웨어
서드파티 또는 상용 소프트웨어가 설치되는 디렉토리. 패키지별로 /opt/패키지명 형태로 독립적인 디렉토리를 갖는다.
# 예: Google Chrome, Visual Studio Code 등
ls /opt/
# google microsoft/dev - 장치 파일
시스템의 모든 장치(하드웨어/가상)가 파일로 표현된다. “Everything is a file” 철학의 핵심. udev에 의해 동적으로 관리된다.
주요 장치 파일은 아래 섹션에서 상세히 다룬다.
/proc - 프로세스 및 커널 정보 가상 파일 시스템
아래 별도 섹션에서 상세히 다룬다.
/sys - 시스템 장치 및 커널 정보 가상 파일 시스템
아래 별도 섹션에서 상세히 다룬다.
/mnt - 임시 마운트 포인트
관리자가 파일 시스템을 임시로 마운트하는 데 사용한다.
# USB 드라이브 마운트 예시
sudo mount /dev/sdb1 /mnt
ls /mnt/
sudo umount /mnt/media - 이동식 미디어 자동 마운트
CD-ROM, USB 드라이브 등 이동식 미디어가 자동으로 마운트되는 위치.
# USB 드라이브 삽입 시 자동 마운트
ls /media/$USER/
# USB_DRIVE_LABEL
/mntvs/media:/mnt는 수동 마운트,/media는 자동(automount) 마운트 용도로 구분한다.
/boot - 부트 로더 파일
시스템 부팅에 필요한 파일이 위치한다.
| 파일 | 설명 |
|---|---|
vmlinuz-* | 압축된 Linux 커널 이미지 |
initrd.img-* / initramfs-* | 초기 RAM 디스크 (부팅 초기에 필요한 드라이버/모듈 포함) |
grub/ | GRUB 부트 로더 설정 |
System.map-* | 커널 심볼 테이블 |
ls /boot/
# config-5.15.0-76-generic grub initrd.img-5.15.0-76-generic
# System.map-5.15.0-76-generic vmlinuz-5.15.0-76-generic/lib - 필수 공유 라이브러리
/bin과 /sbin의 바이너리가 의존하는 공유 라이브러리(.so 파일)가 위치한다. 최신 배포판에서는 /usr/lib의 심볼릭 링크.
# 동적 링커
ls /lib/x86_64-linux-gnu/ld-*
# /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
# 커널 모듈
ls /lib/modules/
# 5.15.0-76-generic
# 특정 바이너리의 의존 라이브러리 확인
ldd /bin/ls/srv - 서비스 데이터
시스템이 제공하는 서비스의 데이터가 위치한다. 웹 서버, FTP 서버 등.
# 웹 서버 데이터
ls /srv/www/
# FTP 서버 데이터
ls /srv/ftp//run - 런타임 데이터
부팅 이후 실행 중인 시스템에 대한 정보. tmpfs로 마운트되어 재부팅 시 사라진다.
- PID 파일, 소켓 파일, 잠금 파일 등
/var/run은/run의 심볼릭 링크
ls /run/
# lock mount shm user utmp ...
# systemd/ NetworkManager/ sshd.pid ...
# 예: sshd PID 확인
cat /run/sshd.pid/proc 가상 파일 시스템 상세
/proc는 procfs(process filesystem)로, 디스크에 존재하지 않고 커널이 메모리에서 동적으로 생성하는 가상 파일 시스템이다. 프로세스 정보와 커널 파라미터에 접근할 수 있다.
/proc/cpuinfo - CPU 정보
cat /proc/cpuinfo
# 주요 필드:
# processor : 논리 CPU 번호 (0부터)
# model name : CPU 모델명
# cpu MHz : 클럭 속도
# cache size : L2 캐시 크기
# cpu cores : 물리 코어 수
# siblings : 하이퍼스레딩 포함 논리 프로세서 수
# flags : 지원하는 기능 (sse4_2, avx2, vmx 등)
# CPU 코어 수 빠르게 확인
nproc
grep -c ^processor /proc/cpuinfo/proc/meminfo - 메모리 정보
cat /proc/meminfo
# 주요 필드:
# MemTotal : 전체 물리 메모리
# MemFree : 사용 가능한 메모리 (실제 여유)
# MemAvailable : 실질적으로 사용 가능한 메모리 (캐시/버퍼 회수 가능분 포함)
# Buffers : 커널 버퍼
# Cached : 페이지 캐시
# SwapTotal : 전체 스왑 크기
# SwapFree : 여유 스왑
# 간편하게 확인
free -h/proc/[pid]/ - 프로세스별 정보
각 프로세스는 자신의 PID 번호에 해당하는 디렉토리를 가진다.
# 현재 셸의 PID 확인
echo $$
# 해당 프로세스 정보 탐색
ls /proc/$$/
# 주요 파일:
# cmdline - 실행 명령줄 (NULL 문자로 구분)
# status - 프로세스 상태 (이름, 상태, PID, 메모리 등)
# fd/ - 열린 파일 디스크립터들 (심볼릭 링크)
# maps - 메모리 매핑 정보
# environ - 환경 변수 (NULL 문자로 구분)
# cwd - 현재 작업 디렉토리 (심볼릭 링크)
# exe - 실행 파일 (심볼릭 링크)
# stat - 프로세스 상태 (수치 데이터)
# io - I/O 통계
# 프로세스 명령줄 확인
cat /proc/$$/cmdline | tr '\0' ' '
echo
# 프로세스 상태 확인
cat /proc/$$/status
# 열린 파일 디스크립터 확인
ls -la /proc/$$/fd/
# 0 -> /dev/pts/0 (stdin)
# 1 -> /dev/pts/0 (stdout)
# 2 -> /dev/pts/0 (stderr)
# 메모리 매핑
cat /proc/$$/maps | head/proc/loadavg - 시스템 부하 평균
cat /proc/loadavg
# 0.52 0.38 0.25 2/315 12847
# 1분 5분 15분 실행중/전체스레드 최근PID
# uptime 명령과 동일한 정보
uptime
# load average: 0.52, 0.38, 0.25부하(load) 해석: 단일 CPU 기준으로 1.0이면 100% 사용. 4코어 시스템이면 4.0이 100%. 일반적으로 CPU 코어 수의 70% 이하가 정상.
/proc/filesystems - 지원되는 파일 시스템
cat /proc/filesystems
# nodev sysfs
# nodev tmpfs
# nodev proc
# ext4
# xfs
# vfat
# nodev: 블록 디바이스가 필요 없는 가상 파일 시스템/proc/mounts - 현재 마운트된 파일 시스템
cat /proc/mounts
# sysfs /sys sysfs rw,nosuid,nodev,noexec,relatime 0 0
# proc /proc proc rw,nosuid,nodev,noexec,relatime 0 0
# /dev/sda1 / ext4 rw,relatime 0 0
# mount 명령과 유사한 결과
mount | column -t기타 주요 /proc 항목
# 커널 버전
cat /proc/version
# 커널 커맨드라인 (부팅 파라미터)
cat /proc/cmdline
# 현재 가동 시간 (초 단위: 시스템 업타임, 유휴 시간)
cat /proc/uptime
# 파티션 정보
cat /proc/partitions
# 네트워크 통계
cat /proc/net/dev
# 인터럽트 정보
cat /proc/interrupts
# 커널 파라미터 확인/변경 (sysctl과 연동)
cat /proc/sys/net/ipv4/ip_forward # IP 포워딩 설정
echo 1 > /proc/sys/net/ipv4/ip_forward # 런타임 변경 (root 필요)
sysctl net.ipv4.ip_forward # sysctl로 동일하게 확인/sys 가상 파일 시스템
/sys는 sysfs로, 커널의 장치 모델(device model)을 사용자 공간에 노출하는 가상 파일 시스템이다. /proc보다 구조화되어 있으며, 주로 하드웨어/드라이버 정보를 제공한다.
# 주요 하위 디렉토리
ls /sys/
# block bus class devices firmware fs kernel module power
# /sys/block - 블록 디바이스 정보
ls /sys/block/
# sda sdb loop0 ...
# 디스크 크기 (512바이트 섹터 단위)
cat /sys/block/sda/size
# /sys/class - 장치 클래스별 분류
ls /sys/class/
# net block tty input ...
# 네트워크 인터페이스 확인
ls /sys/class/net/
# eth0 lo wlan0
# 네트워크 인터페이스 MAC 주소
cat /sys/class/net/eth0/address
# /sys/devices - 장치 트리 (물리적 계층 구조)
# /sys/bus - 버스 유형별 장치 (pci, usb, scsi 등)
ls /sys/bus/
# pci usb scsi i2c ...
# /sys/fs - 파일 시스템 관련 정보
# /sys/kernel - 커널 파라미터 (hostname 등)
cat /sys/kernel/hostname
# CPU 주파수 관련
ls /sys/devices/system/cpu/cpu0/cpufreq/
# scaling_cur_freq scaling_max_freq scaling_min_freq scaling_governor/proc vs /sys 차이:
/proc는 주로 프로세스 정보와 커널 상태,/sys는 하드웨어/드라이버 모델 정보에 초점을 맞춘다. 역사적으로/proc에 과도하게 집중되었던 장치 정보를/sys로 분리한 것이다.
/dev 주요 장치 파일
Linux에서 장치는 파일로 표현된다. 크게 문자 장치(character device)와 블록 장치(block device)로 나뉜다.
ls -la /dev/null /dev/sda
# crw-rw-rw- 1 root root 1, 3 ... /dev/null (c = 문자 장치)
# brw-rw---- 1 root disk 8, 0 ... /dev/sda (b = 블록 장치)
# major번호, minor번호로 커널이 장치 식별/dev/null - 블랙홀
모든 입력을 버리는 장치. 출력을 무시하고 싶을 때 사용.
# 표준 출력 버리기
command > /dev/null
# 표준 출력 + 표준 에러 모두 버리기
command > /dev/null 2>&1
command &> /dev/null # Bash 단축 문법
# 파일 비우기
cat /dev/null > logfile.txt
# 또는 간단히
> logfile.txt/dev/zero - 0 바이트 생성기
읽으면 무한히 NULL 바이트(0x00)를 반환한다.
# 1GB 크기의 파일 생성 (디스크 성능 테스트 등)
dd if=/dev/zero of=testfile bs=1M count=1024
# 스왑 파일 생성
sudo dd if=/dev/zero of=/swapfile bs=1M count=2048
sudo mkswap /swapfile
sudo swapon /swapfile/dev/random vs /dev/urandom - 난수 생성기
| 특성 | /dev/random | /dev/urandom |
|---|---|---|
| 엔트로피 풀 | 충분하지 않으면 블로킹 | 블로킹하지 않음 |
| 속도 | 느림 (엔트로피 부족 시 대기) | 빠름 |
| 용도 | 장기 GPG/SSL 키 생성 | 일반 암호학적 용도, 세션 키 등 |
| 보안 수준 | 이론적으로 더 높음 | 실용적으로 충분 |
# 16바이트 랜덤 데이터 (hex로 출력)
head -c 16 /dev/urandom | xxd
# 랜덤 패스워드 생성
head -c 32 /dev/urandom | base64 | head -c 24
echo
# 엔트로피 풀 크기 확인
cat /proc/sys/kernel/random/entropy_avail참고: Linux 5.6 이후 커널에서는
/dev/random도 충분한 초기 시드가 확보되면 블로킹하지 않도록 변경되었다.
/dev/sda - 블록 디바이스 (디스크)
SCSI/SATA/SSD 디스크를 나타낸다.
# 디스크 목록
ls /dev/sd*
# /dev/sda /dev/sda1 /dev/sda2 /dev/sdb /dev/sdb1
# 명명 규칙:
# sda - 첫 번째 SCSI/SATA 디스크
# sda1 - 첫 번째 디스크의 첫 번째 파티션
# sdb - 두 번째 디스크
# nvme0n1 - 첫 번째 NVMe SSD
# nvme0n1p1 - 첫 번째 NVMe SSD의 첫 번째 파티션
# vda - 가상화 환경의 virtio 디스크
# 디스크 정보 확인
sudo fdisk -l /dev/sda
lsblk/dev/tty - 터미널 장치
ls /dev/tty*
# /dev/tty - 현재 프로세스의 제어 터미널
# /dev/tty0 - 가상 콘솔
# /dev/tty1 - 첫 번째 가상 콘솔 (Ctrl+Alt+F1)
# /dev/pts/0 - 의사 터미널(pseudo-terminal, SSH/터미널에뮬레이터)
# 현재 터미널 확인
tty
# /dev/pts/0
# 다른 터미널에 메시지 보내기
echo "hello" > /dev/pts/1기타 주요 장치 파일
# /dev/loop* - 루프 장치 (파일을 블록 장치로 마운트)
# /dev/stdin -> /proc/self/fd/0 (표준 입력)
# /dev/stdout -> /proc/self/fd/1 (표준 출력)
# /dev/stderr -> /proc/self/fd/2 (표준 에러)
# /dev/shm/ - 공유 메모리 (tmpfs)
# /dev/full - 항상 "디스크 가득 참" 에러 반환 (테스트용)
echo "test" > /dev/full
# bash: echo: write error: No space left on deviceinode 개념, 하드 링크 vs 심볼릭 링크
inode란?
파일 시스템에서 파일의 메타데이터를 저장하는 자료구조. 모든 파일(디렉토리 포함)은 고유한 inode 번호를 가진다.
inode에 저장되는 정보:
- 파일 타입 (일반 파일, 디렉토리, 심볼릭 링크 등)
- 권한 (rwx)
- 소유자/그룹 (UID, GID)
- 크기
- 타임스탬프 (atime, mtime, ctime)
- 데이터 블록 포인터 (direct, indirect, double indirect, triple indirect)
- 하드 링크 카운트
- 파일 이름은 inode에 저장되지 않는다 - 디렉토리 엔트리에 저장
# inode 번호 확인
ls -i filename
# 1234567 filename
# 상세 inode 정보
stat filename
# File: filename
# Size: 1024 Blocks: 8 IO Block: 4096 regular file
# Device: 801h/2049d Inode: 1234567 Links: 1
# Access: (0644/-rw-r--r--) Uid: (1000/user) Gid: (1000/user)
# Access: 2024-01-15 10:30:00.000000000 +0900
# Modify: 2024-01-15 10:25:00.000000000 +0900
# Change: 2024-01-15 10:25:00.000000000 +0900
# 파일 시스템의 inode 사용 현황
df -i하드 링크 (Hard Link)
같은 inode를 가리키는 추가 디렉토리 엔트리. 원본과 하드 링크는 동등한 관계이며 구분할 수 없다.

# 하드 링크 생성
ln original.txt hardlink.txt
# inode 번호가 동일
ls -li original.txt hardlink.txt
# 1234567 -rw-r--r-- 2 user user 100 ... original.txt
# 1234567 -rw-r--r-- 2 user user 100 ... hardlink.txt
# ^ 링크 카운트가 2
# 원본 삭제해도 하드 링크로 접근 가능
rm original.txt
cat hardlink.txt # 정상 작동 (링크 카운트가 1로 감소할 뿐)하드 링크의 제약:
- 같은 파일 시스템(파티션) 내에서만 가능 (inode 번호는 파일 시스템 내에서만 고유)
- 디렉토리에 대한 하드 링크는 불가 (순환 참조 방지, root만 가능한 배포판도 있음)
심볼릭 링크 (Symbolic Link, Soft Link)
다른 파일/디렉토리의 경로명을 가리키는 특수 파일. Windows의 바로가기와 유사.

# 심볼릭 링크 생성
ln -s /path/to/original.txt symlink.txt
# 심볼릭 링크 확인
ls -la symlink.txt
# lrwxrwxrwx 1 user user 24 ... symlink.txt -> /path/to/original.txt
# ^l: 심볼릭 링크 표시
# 심볼릭 링크가 가리키는 실제 경로
readlink symlink.txt
readlink -f symlink.txt # 모든 심볼릭 링크를 풀어서 최종 경로 반환하드 링크 vs 심볼릭 링크 비교
| 특성 | 하드 링크 | 심볼릭 링크 |
|---|---|---|
| inode | 원본과 동일 | 별도 inode |
| 원본 삭제 시 | 접근 가능 (링크 카운트만 감소) | 깨진 링크(dangling link) |
| 파일 시스템 간 | 불가 | 가능 |
| 디렉토리 | 불가 (일반적으로) | 가능 |
| 파일 크기 | 원본과 동일 | 경로 문자열 길이 |
| 성능 | 빠름 (직접 inode 참조) | 약간 느림 (경로 해석 필요) |
| 식별 | ls -i로 inode 비교 | ls -l에서 l 표시, -> |
# 파일 시스템의 실제 데이터 삭제 시점
# = 해당 inode를 가리키는 모든 하드 링크가 삭제되고 (링크 카운트 = 0)
# + 해당 파일을 열고 있는 프로세스가 없을 때
# 깨진 심볼릭 링크 찾기
find /path -xtype l
# 특정 inode를 가리키는 모든 하드 링크 찾기
find / -inum 1234567