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 |
| Directory | d | 디렉토리 | /home/ |
| Symbolic link | l | 심볼릭 링크 (바로가기) | /usr/bin/python |
| Block device | b | 블록 단위 I/O 장치 | /dev/sda |
| Character device | c | 문자 단위 I/O 장치 | /dev/tty |
| Socket | s | 프로세스 간 통신 | /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.conf | DNS 서버 설정 |
/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/cpuinfo | CPU 정보 |
/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/sdb | SATA/SCSI 디스크 |
/dev/sda1, /dev/sda2 | 디스크 파티션 |
/dev/nvme0n1 | NVMe 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일 후 자동 삭제 |
🔗 관련 포스트
- Linux Filesystem Overview — 파일시스템 종류 비교
- Linux Distribution Overview — 배포판별 특징