Linux Fundamentals - Everything is a File

Everything is a File 철학, FHS 디렉토리 구조, 파일 타입


🎯 “Everything is a File”

리눅스(유닉스)의 핵심 설계 철학.

의미:

  • 일반 파일뿐 아니라 디렉토리, 디바이스, 프로세스, 네트워크 소켓까지 파일처럼 다룸
  • 동일한 인터페이스(open, read, write, close)로 모든 것을 제어할 수 있음
  • 복잡한 것을 단순하고 일관되게 다루기 위한 추상화

예시:

대상경로설명
일반 파일/home/user/document.txt텍스트, 바이너리 등
디렉토리/home/user/파일 목록을 담은 특수 파일
하드디스크/dev/sda블록 디바이스
터미널/dev/tty문자 디바이스
프로세스 정보/proc/1234/status가상 파일시스템
시스템 정보/sys/class/net/eth0/가상 파일시스템
소켓/var/run/docker.sock네트워크/IPC 통신
# 디스크에 직접 쓰기 (파일처럼)
dd if=/dev/zero of=/dev/sdb bs=1M count=100
 
# 프로세스 정보 읽기 (파일처럼)
cat /proc/cpuinfo
 
# 시스템 설정 변경 (파일처럼)
echo 1 > /proc/sys/net/ipv4/ip_forward

이 철학의 효과:

  • 쉘 스크립트로 거의 모든 것을 제어 가능
  • 파이프(|)로 프로그램 간 데이터 연결
  • 권한 시스템 하나로 모든 리소스 접근 제어

💡 소켓, 파이프처럼 파일 경로 없이 file descriptor만 존재하는 것들도 있어서 “Everything has a file descriptor”라는 표현을 쓰기도 함.


📁 파일 종류

리눅스에서 “파일”은 7가지 타입이 있음.

타입기호설명예시
Regular file-일반 파일/etc/passwd
Directoryd디렉토리/home/
Symbolic linkl심볼릭 링크 (바로가기)/usr/bin/python
Block deviceb블록 단위 I/O 장치/dev/sda
Character devicec문자 단위 I/O 장치/dev/tty
Sockets프로세스 간 통신/var/run/docker.sock
Named pipe (FIFO)p프로세스 간 파이프mkfifo로 생성
# 파일 타입 확인
ls -l /dev/sda
# brw-rw---- 1 root disk 8, 0 Jan 20 10:00 /dev/sda
#  ^-- 'b' = block device
 
ls -l /etc/passwd
# -rw-r--r-- 1 root root 2847 Jan 20 10:00 /etc/passwd
#  ^-- '-' = regular file

🗂️ 디렉토리 구조 (FHS)

FHS (Filesystem Hierarchy Standard) = 리눅스 디렉토리 구조의 표준.

전체 구조

flowchart TB
    Root["/"]
    Root --> bin["bin - 필수 사용자 명령어"]
    Root --> boot["boot - 부팅 파일"]
    Root --> dev["dev - 디바이스 파일"]
    Root --> etc["etc - 시스템 설정"]
    Root --> home["home - 사용자 홈"]
    Root --> lib["lib - 공유 라이브러리"]
    Root --> media["media - 이동식 미디어"]
    Root --> mnt["mnt - 임시 마운트"]
    Root --> opt["opt - 추가 패키지"]
    Root --> proc["proc - 프로세스 정보 (가상)"]
    Root --> rootdir["root - root 홈"]
    Root --> run["run - 런타임 데이터"]
    Root --> sbin["sbin - 시스템 명령어"]
    Root --> srv["srv - 서비스 데이터"]
    Root --> sys["sys - 시스템 정보 (가상)"]
    Root --> tmp["tmp - 임시 파일"]
    Root --> usr["usr - 사용자 프로그램"]
    Root --> var["var - 가변 데이터"]

디렉토리별 상세

/etc - 설정 파일의 집합소

“시스템이 어떻게 동작할지”를 결정하는 곳

파일/디렉토리용도
/etc/passwd사용자 계정 정보
/etc/shadow사용자 비밀번호 (암호화)
/etc/group그룹 정보
/etc/fstab파일시스템 마운트 설정
/etc/hosts로컬 DNS 매핑
/etc/resolv.confDNS 서버 설정
/etc/ssh/SSH 서버/클라이언트 설정
/etc/nginx/Nginx 설정
/etc/systemd/systemd 서비스 설정
/etc/cron.d/cron 작업 설정
# 사용자 목록 확인
cat /etc/passwd
 
# 마운트 설정 확인
cat /etc/fstab
 
# 네트워크 호스트 추가
echo "192.168.1.100 myserver" >> /etc/hosts

/var - 가변 데이터

“운영 중에 계속 변하는 데이터”가 저장되는 곳

디렉토리용도
/var/log/시스템/애플리케이션 로그
/var/lib/애플리케이션 상태 데이터
/var/cache/캐시 데이터
/var/spool/대기열 (메일, 프린트)
/var/tmp/재부팅 후에도 유지되는 임시 파일
/var/run//run런타임 데이터 (심볼릭 링크)
# 시스템 로그 확인
tail -f /var/log/syslog      # Debian/Ubuntu
tail -f /var/log/messages    # RHEL/CentOS
 
# 특정 서비스 로그
tail -f /var/log/nginx/access.log
 
# 패키지 매니저 캐시
ls /var/cache/apt/archives/   # Debian/Ubuntu
ls /var/cache/dnf/            # RHEL/Fedora

/proc - 프로세스와 커널 정보 (가상)

실제 파일이 아니라 커널이 실시간으로 생성하는 가상 파일시스템

경로내용
/proc/cpuinfoCPU 정보
/proc/meminfo메모리 정보
/proc/version커널 버전
/proc/[PID]/특정 프로세스 정보
/proc/[PID]/cmdline프로세스 실행 명령어
/proc/[PID]/fd/프로세스가 열고 있는 파일
/proc/sys/커널 파라미터 (sysctl)
# CPU 정보
cat /proc/cpuinfo | grep "model name"
 
# 메모리 정보
cat /proc/meminfo | head -5
 
# 특정 프로세스가 열고 있는 파일
ls -l /proc/1234/fd/
 
# 커널 파라미터 변경 (런타임)
echo 1 > /proc/sys/net/ipv4/ip_forward
 
# 또는 sysctl 사용
sysctl -w net.ipv4.ip_forward=1

/dev - 디바이스 파일

하드웨어를 파일로 추상화한 곳

디바이스설명
/dev/sda, /dev/sdbSATA/SCSI 디스크
/dev/sda1, /dev/sda2디스크 파티션
/dev/nvme0n1NVMe SSD
/dev/tty현재 터미널
/dev/null블랙홀 (모든 입력 버림)
/dev/zero무한한 null 바이트
/dev/random랜덤 데이터 (블로킹)
/dev/urandom랜덤 데이터 (논블로킹)
# 출력 버리기
command > /dev/null 2>&1
 
# 파일을 0으로 채우기
dd if=/dev/zero of=zeros.bin bs=1M count=10
 
# 랜덤 비밀번호 생성
head -c 32 /dev/urandom | base64

/usr - 사용자 프로그램

User System Resources (사용자 시스템 리소스)

디렉토리용도
/usr/bin/일반 사용자 명령어
/usr/sbin/시스템 관리 명령어
/usr/lib/라이브러리
/usr/local/수동 설치한 프로그램
/usr/share/아키텍처 독립적 데이터 (문서, 아이콘)

💡 현대 리눅스에서는 /bin/usr/bin, /sbin/usr/sbin으로 심볼릭 링크됨


/home vs /root

디렉토리용도
/home/username/일반 사용자 홈 디렉토리
/root/root 사용자 홈 디렉토리
# 홈 디렉토리로 이동
cd ~
cd $HOME
 
# 현재 사용자 홈 확인
echo $HOME

/tmp vs /var/tmp

디렉토리특징
/tmp재부팅 시 삭제됨, 10일 후 자동 삭제
/var/tmp재부팅 후에도 유지, 30일 후 자동 삭제

🔗 관련 포스트


🔗 참고 자료