tmpfs·procfs·sysfs — 메모리와 커널이 만드는 가상 파일시스템

tmpfs로 RAM 기반 고속 임시 저장소를 만들고, procfs로 프로세스 정보를 읽고 커널 파라미터를 조작하고, sysfs로 하드웨어를 제어하는 방법을 설명합니다.

· 6 min read · PALDYN Team

지난 글에서 심볼릭 링크 함정을 살펴봤습니다. 이번에는 디스크 없이 커널이 직접 생성하는 가상 파일시스템(Virtual Filesystem) 세 종류를 알아봅니다. /tmp, /proc, /sys — 모두 부팅할 때 메모리에 만들어지고, 재부팅하면 사라집니다.

세 파일시스템 한눈에 비교

tmpfs·procfs·sysfs 비교

리눅스 부팅 후 mount 명령을 실행하면 디스크 파티션 외에 이 세 가지 파일시스템이 자동으로 마운트되어 있습니다.

findmnt -t tmpfs,proc,sysfs
# TARGET     SOURCE  FSTYPE  OPTIONS
# /proc      proc    proc    rw,nosuid,nodev,noexec
# /sys       sysfs   sysfs   rw,nosuid,nodev,noexec
# /run       tmpfs   tmpfs   rw,nosuid,nodev,size=10%
# /dev/shm   tmpfs   tmpfs   rw,nosuid,nodev
# /tmp       tmpfs   tmpfs   rw,nosuid,nodev

tmpfs — RAM 기반 임시 저장소

tmpfs는 메모리를 파일시스템처럼 쓸 수 있게 합니다. 일반 파일시스템과 동일한 API로 읽고 쓸 수 있지만, 모든 데이터는 RAM(필요시 스왑)에만 저장됩니다.

주요 마운트 포인트

경로용도
/tmp프로그램 임시 파일
/runsystemd 런타임 파일(PID, 소켓)
/dev/shmPOSIX 공유 메모리
/run/user/{uid}사용자별 런타임 디렉터리

tmpfs 직접 마운트

# 1GB 제한 tmpfs 마운트
sudo mount -t tmpfs -o size=1G tmpfs /mnt/ramdisk

# fstab에 영구 등록 (noexec: 실행 파일 차단)
tmpfs   /tmp   tmpfs   size=2G,mode=1777,noexec,nosuid   0 0

# 현재 사용량 확인
df -h /tmp /run /dev/shm

tmpfs는 실제로 필요한 만큼만 메모리를 사용합니다. size=2G로 설정해도 1MB만 쓰면 1MB만 점유합니다.

빌드 속도 개선에 활용

컴파일 중간 파일을 tmpfs에 올리면 I/O 병목을 크게 줄일 수 있습니다.

# CMake 빌드 디렉터리를 tmpfs에
sudo mount -t tmpfs -o size=4G tmpfs /build
cmake -B /build -S /src
cmake --build /build -j$(nproc)

procfs — 프로세스와 커널의 창

/proc커널이 실시간으로 생성하는 프로세스 정보 및 커널 파라미터를 파일 트리로 보여줍니다. ps, top, lsof 같은 도구들이 실제로 /proc를 읽어서 동작합니다.

프로세스 디렉터리 구조

# 각 PID 디렉터리 주요 파일
ls /proc/1234/
# cmdline  cwd  environ  exe  fd/  maps  mem  net/  root  stat  status

# 실행 명령어 확인
cat /proc/1234/cmdline | tr '\0' ' '

# 메모리 맵
cat /proc/1234/maps

# 열린 파일 디스크립터
ls -la /proc/1234/fd/

# 현재 프로세스
cat /proc/self/status | grep -E 'Name|Pid|VmRSS'

커널 전역 정보

# CPU 정보
cat /proc/cpuinfo | grep 'model name' | head -1

# 메모리 정보
cat /proc/meminfo | head -10

# 실행 중인 인터럽트 수
cat /proc/interrupts

# 마운트 목록 (findmnt의 원본)
cat /proc/mounts

커널 파라미터 조작 (/proc/sys)

# IP 포워딩 활성화 (임시)
echo 1 > /proc/sys/net/ipv4/ip_forward

# sysctl로 동일하게 (권장 방법)
sysctl -w net.ipv4.ip_forward=1

# 영구 적용: /etc/sysctl.conf 또는 /etc/sysctl.d/*.conf
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.d/99-forward.conf
sysctl -p

sysfs — 하드웨어와 드라이버 트리

가상 파일시스템 사용 명령어

/sys커널 디바이스 드라이버 모델을 파일 트리로 노출합니다. procfs가 프로세스 중심이라면 sysfs는 하드웨어 중심입니다. udev/sys의 이벤트를 감지해 /dev 노드를 생성합니다.

주요 디렉터리

경로내용
/sys/class/net/네트워크 인터페이스
/sys/class/block/블록 디바이스
/sys/class/power_supply/배터리·AC 어댑터
/sys/bus/pci/devices/PCI 디바이스 목록
/sys/devices/system/cpu/CPU 정보·주파수

실전 활용 예시

# 배터리 잔량
cat /sys/class/power_supply/BAT0/capacity

# 네트워크 인터페이스 MTU 읽기/변경
cat /sys/class/net/eth0/mtu
echo 9000 > /sys/class/net/eth0/mtu  # Jumbo Frame

# CPU 주파수 (kHz)
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq

# 디스크 큐 깊이
cat /sys/block/sda/queue/nr_requests

# LED 제어 (Raspberry Pi 등)
echo 0 > /sys/class/leds/led0/brightness  # LED 끄기

컨테이너에서의 가상 파일시스템

컨테이너는 네임스페이스로 격리된 별도의 /proc를 가집니다. 컨테이너 안에서 cat /proc/1/cmdline을 읽으면 호스트의 PID 1이 아니라 컨테이너의 PID 1(보통 앱 프로세스)이 보입니다.

# 컨테이너 안: 격리된 /proc
docker run --rm alpine cat /proc/1/cmdline
# /bin/sh 또는 컨테이너 진입점

# 호스트: 해당 컨테이너의 실제 PID로 /proc 접근 가능
cat /proc/$(docker inspect --format '{{.State.Pid}}' my_container)/status

지난 글: 심볼릭 링크의 함정 — 깨진 링크와 순환 참조 피하기

다음 글: NFS 마운트 — 네트워크 파일시스템 공유와 연결


읽어주셔서 감사합니다. 😊