🖥️ System

임시 스토리지 관리 (Ephemeral Storage Management)

개요

임시 스토리지(Ephemeral Storage)는 프로세스나 컨테이너의 수명과 동일하게 존재하다가 종료 시 자동으로 삭제되는 저장소를 말합니다. Linux에서는 주로 /tmp, /dev/shm, tmpfs로 마운트된 파일시스템을 통해 임시 데이터를 관리하며, 클라우드 서버리스 환경에서는 Lambda의 /tmp, 컨테이너의 ephemeral overlay가 이 역할을 담당합니다.

임시 스토리지 관리의 핵심은 빠른 임시 I/O 제공, 적절한 수명 관리, 그리고 보안입니다. 불필요한 임시 파일이 축적되면 디스크 용량을 잠식하고 성능을 저하시키며, 반대로 너무 공격적으로 삭제하면 아직 사용 중인 데이터가 사라질 수 있습니다. 따라서 시스템 수준의 자동 정리 메커니즘과 애플리케이션 수준의 안전한 임시 파일 생성 API를 함께 이해해야 합니다. 본 문서에서는 Linux의 임시 스토리지 아키텍처, 파일 시스템 유형, 정리 메커니즘, 보안 고려 사항, 컨테이너/클라우드 환경의 임시 저장소를 분석합니다.

임시 스토리지 아키텍처

그림 1. Linux 임시 스토리지 계층 구조

핵심 개념

/tmp 디렉토리

/tmp는 POSIX 표준 임시 파일 저장소로, 모든 사용자가 읽기/쓰기/실행 권한(1777, sticky bit)으로 접근할 수 있습니다.

/tmp 특징:
- sticky bit: 파일 소유자만 삭제 가능 (다른 사용자의 파일 삭제 방지)
- 시스템 재부팅 시 정리: 대부분 배포판에서 재부팅 시 /tmp 내용을 비움
- 용량 제한: 물리적 RAM 또는 디스크 할당량에 따라 제한
- tmpfs 마운트: 현대 리눅스에서는 기본적으로 tmpfs(메모리 기반)로 마운트

/tmp 사용 패턴:
- 프로세스 간 임시 데이터 교환
- 컴파일 중간 산물 저장
- 잠금 파일(lock file) 생성
- 대용량 데이터 처리 시 임시 버퍼

/var/tmp 디렉토리

/var/tmp/tmp와 유사하지만 재부팅 후에도 유지되는 임시 저장소입니다.

특성 /tmp /var/tmp
수명 재부팅 시 삭제 재부팅 후 유지
권한 1777 (sticky bit) 1777 (sticky bit)
일반적 구현 tmpfs (RAM 기반) 디스크 기반
주요 용도 짧은 수명 임시 파일 장기 임시 캐시
정리 주기 재부팅 시 systemd-tmpfiles 시간 기반

tmpfs 파일시스템

tmpfs는 커널의 가상 메모리(Virtual Memory)에 파일시스템을 구현하는 메커니즘으로, /tmp, /dev/shm, 스왑 영역 등에 사용됩니다.

tmpfs 속성:
- RAM 기반: 파일 접근이 물리 디스크보다 훨씬 빠름
- 스왑 활용: 물리 메모리 부족 시 스왑 공간으로 이동 가능 (Linux 6.4부터 noswap 옵션으로 비활성화 가능)
- 동적 크기: 사용량에 따라 소비 메모리가 변동 (기본값: 물리 RAM의 50%)
- 리마운트 가능: mount -o remount로 크기 변경 가능
- 마운트 해제 시 삭제: umount하면 내용이 모두 사라짐

tmpfs 마운트 옵션:

옵션 설명 기본값
size 최대 크기 (바이트, k/m/g 접미사, % 접미사 가능) 50% of RAM
nr_inodes 최대 inode 수 물리 RAM 페이지 절반
mode 루트 디렉토리 권한 1777
huge THP 할당 정책 never
mpol NUMA 할당 정책 default
noswap 스왑 비활성화 (Linux 6.4+) 활성화

/dev/shm:
- POSIX 공유 메모리(shm_open)와 POSIX 세마포어의 구현체
- 기본적으로 tmpfs로 마운트
- 프로세스 간 고속 데이터 공유에 사용
- /proc/meminfoShmem 필드에 크기 반영

ramfs vs tmpfs

특성 ramfs tmpfs
크기 제한 없음 (RAM 전부 사용 가능) 지정된 크기 제한
스왑 사용 불가 가능 (기본값)
OOM 위험 높음 (제한 없음) 낮음 (크기 제한)
커널 옵션 CONFIG_RAMFS CONFIG_TMPFS
사용 권장 비권장 표준

임시 파일 생성 API

C 표준 라이브러리와 POSIX에서 제공하는 임시 파일 생성 함수들은 보안과 안전성에 서로 다른 특성을 가집니다.

함수 원자적 생성 파일 디스크립터 반환 보안 수준
tmpnam() X X 낮음 (race condition)
tempnam() X X 낮음 (race condition)
mktemp() O X 중간 (race condition 가능)
mkstemp() O O 높음 (safe)
mkdtemp() O 디렉토리 경로 높음 (safe)
tmpfile() O O (FILE*) 높음 (safe, 자동 삭제)

safe 함수 사용 권장:
- mkstemp(): 고유한 임시 파일 생성 + 파일 디스크립터 반환 + 0600 권한
- mkdtemp(): 고유한 임시 디렉토리 생성 + 0700 권한
- tmpfile(): 임시 파일 생성 후 자동 삭제 (종료 시)

systemd-tmpfiles 정리 메커니즘

systemd-tmpfiles는 부팅 시 임시 파일 생성과 주기적 정리를 담당하는 systemd 컴포넌트입니다.

설정 파일 위치 (우선순위 순):
1. /etc/tmpfiles.d/*.conf (관리자 오버라이드)
2. /run/tmpfiles.d/*.conf (런타임)
3. /usr/lib/tmpfiles.d/*.conf (패키지 기본값)

주요 설정 타입:

타입 기능 예시
d 디렉토리 생성 + 시간 기반 정리 d /tmp/myapp 1777 root root 10d
D 디렉토리 생성 + --remove 시 삭제 D /run/myapp 0755 root root -
e 기존 디렉토리 정리만 (생성 안 함) e /tmp/cache 1777 root root 5d
f 파일 생성 f /tmp/myfile 0644 root root - content
r 파일/빈 디렉토리 삭제 r /tmp/stale - - - -
R 재귀적 삭제 R /tmp/oldstuff - - - -
x 정리에서 제외 x /tmp/important - - - -

Age 필드 형식:
- 숫자 + 단위: 10d(10일), 2h(2시간), 30min(30분), 1w(1주)
- 기본 시간 단위: 초(s)
- 0이면 무조건 삭제

시스템 서비스:
- systemd-tmpfiles-setup.service: 부팅 시 임시 파일 생성
- systemd-tmpfiles-clean.timer/service: 주기적 정리 (기본 1일)
- systemd-tmpfiles-clean.service --remove --create: 정리 + 재생성

임시 파일 보안

임시 파일은 여러 보안 위협에 노출될 수 있습니다.

주요 보안 위협:

공격 유형 설명 방어 기법
Race condition (TOCTOU) 파일 생성과 사용 사이의 시간 차를 이용한 공격 mkstemp(), 원자적 open
Symlink 공격 기존 파일을 심볼릭 링크로 교체하여 임의 파일 덮어쓰기 sticky bit, O_NOFOLLOW
정보 노출 임시 파일에 민감한 데이터 포함 시 권한 부족으로 노출 0600 권한, 즉시 삭제
디스크 공간 고갈 무제한 임시 파일 생성으로 디스크 부족 quota, tmpfs 크기 제한

보안 권장 사항:
1. mkstemp() 또는 mkdtemp() 사용 (safe API)
2. 임시 파일 권한 0600/0700 설정
3. 사용 완료 즉시 unlink() 또는 remove()
4. /tmp에 sticky bit 확인
5. 컨테이너에서는 ephemeral overlay 사용

비교/분석

임시 스토리지 구현체 비교

구현체 위치 미디어 속도 수명 용도
tmpfs /tmp, /dev/shm RAM 매우 빠름 마운트 유지 동안 일반 임시 파일
disk-backed /tmp /tmp 디스크 보통 재부팅 시 대용량 임시 데이터
ramfs 임의 마운트 RAM 매우 빠름 마운트 해제 시 비권장
overlayfs 컨테이너 내부 디스크/RAM 빠름 컨테이너 수명 컨테이너 레이어
Docker tmpfs mount 컨테이너 내부 RAM 매우 빠름 컨테이너 수명 민감한 임시 데이터

컨테이너 임시 스토리지

환경 기본 임시 저장소 크기 제한 정리 정책
Docker overlay2 (컨테이너 내부) 이미지 + writable layer 컨테이너 삭제 시
Docker tmpfs tmpfs 마운트 메모리 제한 컨테이너 삭제 시
Kubernetes emptyDir node 디스크 또는 tmpfs 메모리/디스크 제한 Pod 삭제 시
Kubernetes emptyDir (tmpfs) tmpfs 메모리 제한 Pod 삭제 시
AWS Lambda /tmp 512MB~10GB 실행 환경 종료 시
GCP Cloud Functions /tmp 디스크 할당량 인스턴스 종료 시
Azure Functions /tmp 디스크 할당량 인스턴스 종료 시

모니터링 및 관리 도구

도구 기능 예시
df -h 마운트된 파일시스템 용량 확인 df -h /tmp
du -sh 디렉토리별 사용량 측정 du -sh /tmp/*
find 오래된 파일 검색/삭제 find /tmp -type f -mtime +7 -delete
tmpwatch/tmpreaper 시간 기반 자동 삭제 tmpwatch 720 /tmp
systemd-tmpfiles 설정 기반 정리 systemd-tmpfiles --clean
/proc/meminfo tmpfs 사용량 확인 grep Shmem /proc/meminfo
lsof +deleted 삭제된 파일이 열려 있는지 확인 lsof +L1

동작 원리

tmpfs 동작 흐름

  1. 마운트: mount -t tmpfs -o size=512M tmpfs /tmp 명령으로 tmpfs 생성
  2. 파일 생성: open() 시스템 콜 → 커널이 RAM 할당 → inode 및 페이지 캐시에 저장
  3. 쓰기: write() 시스템 콜 → 페이지 캐시에 데이터 기록 → dirty page로 표시
  4. 읽기: read() 시스템 콜 → 페이지 캐시에서 직접 반환 (디스크 I/O 없음)
  5. 스왑 (선택): 물리 메모리 부족 시 커널이 swap 영역으로 페이지 이동
  6. umount 또는 재부팅: 모든 페이지 해제, inode 해제, RAM 회수
tmpfs 동작 흐름

그림 2. tmpfs 파일 생성부터 해제까지의 동작 흐름

systemd-tmpfiles 정리 동작

  1. 부팅 시: systemd-tmpfiles-setup.service가 설정 파일 읽기
  2. --create: d, D, f 타입 디렉토리/파일 생성, 권한 설정
  3. --remove: r, R 타입 항목 삭제
  4. --clean (주기적): d, D, e 타입의 age 기반 정리
  5. age 판정: 파일의 mtime/atime/ctime 중 하나라도 현재 시간 - age보다 최신이면 유지
  6. 잠금 확인: BSD flock으로 잠긴 파일/디렉토리는 정리에서 제외
  7. 삭제 실행: 대상 파일/디렉토리 삭제

컨테이너 ephemeral overlay 동작

  1. 이미지 레이어: 읽기 전용 컨테이너 이미지 레이어 마운트
  2. writable layer: 상단에 writable overlay 레이어 추가 (copy-on-write)
  3. 파일 수정: 기존 파일 수정 시 writable layer에 복사 후 수정 (COW)
  4. 파일 생성: writable layer에 직접 생성
  5. 파일 삭제: whiteout 파일 생성으로 숨김 처리
  6. 컨테이너 삭제 시: writable layer 완전 삭제, 모든 변경사항 소멸

임시 파일 수명 주기

생성 → 사용 → 정리/삭제
  │       │       │
  │       │       ├── 애플리케이션 종료 시 unlink()
  │       │       ├── systemd-tmpfiles age 기반 정리
  │       │       ├── 재부팅 시 /tmp 비우기
  │       │       └── 컨테이너/Pod 삭제 시
  │       │
  │       └── 잠금 파일(lock), 캐시, 중간 산물
  │
  └── mkstemp(), mkdtemp(), tmpfile()

장단점

장점

  1. 높은 I/O 성능: tmpfs는 RAM 기반으로 디스크 I/O 없이 파일 접근 가능
  2. 자동 정리: 재부팅, 컨테이너 삭제, systemd-tmpfiles에 의해 자동으로 리소스 회수
  3. 보안 격리: 컨테이너별/프로세스별 격리된 임시 저장소 제공
  4. 유연한 용량 조정: tmpfs는 mount -o remount로 온라인에서 크기 변경 가능
  5. 디스크 수명 보호: SSD에 임시 파일을 반복 기록하지 않아 워어링 최소화

단점

  1. 데이터 유실 위험: 시스템 비정상 종료 시 임시 데이터 손실 가능
  2. 메모리 소비: tmpfs는 실제 RAM을 사용하여 다른 프로세스의 사용 가능 메모리 감소
  3. 용량 제한: 메모리 기반 임시 저장소는 물리 RAM에 의해 제한
  4. 보안 관리 필요: 임시 파일에 민감한 데이터 포함 시 추가 보안 조치 필요
  5. 정리 타이밍: age 기반 정리가 아직 사용 중인 파일을 삭제할 수 있음

관련 기술

  • zRAM - /tmp에 사용되는 압축 메모리 기반 블록 디바이스
  • OverlayFS - 컨테이너의 copy-on-write 파일시스템 레이어
  • PMDK - 영구 메모리 프로그래밍 키트 (임시 데이터의 영속화 대안)
  • systemd-tmpfiles - 임시 파일/디렉토리 생성 및 정리 프레임워크
  • Linux namespaces - 컨테이너 격리에서 임시 저장소 네임스페이스 분리

참고 문헌

  • tmpfs man page: https://man7.org/linux/man-pages/man5/tmpfs.5.html
  • systemd-tmpfiles man page: https://man7.org/linux/man-pages/man8/systemd-tmpfiles.8.html
  • tmpfiles.d man page: https://man7.org/linux/man-pages/man5/tmpfiles.d.5.html
  • mkdtemp man page: https://man7.org/linux/man-pages/man3/mkdtemp.3.html
  • Linux Kernel Documentation - tmpfs: https://www.kernel.org/doc/Documentation/filesystems/tmpfs.rst
  • Docker Storage Drivers: https://docs.docker.com/storage/storagedriver/

관련 문서

핵심 정리

  1. tmpfs: Linux의 주요 임시 스토리지 구현체로, RAM 기반으로 빠른 I/O를 제공하며 마운트 해제 또는 재부팅 시 자동으로 삭제됩니다.

  2. 보안 APIs: mkstemp()mkdtemp()는 race condition과 symlink 공격을 방어하는 안전한 임시 파일 생성 함수이며, 임의의 임시 파일 생성 시 반드시 사용해야 합니다.

  3. systemd-tmpfiles: age 필드를 활용한 시간 기반 정리 메커니즘으로, 시스템 수준에서 임시 파일의 수명을 자동으로 관리합니다.

  4. 컨테이너 환경: Docker의 writable overlay, Kubernetes의 emptyDir, Lambda의 /tmp는 각각 컨테이너/FaaS 수명과 동일한 임시 저장소를 제공하며, 리소스 격리와 자동 정리를 보장합니다.

  5. 모니터링: /proc/meminfo의 Shmem 필드, df -h, du -sh, find 명령 등을 통해 임시 스토리지 사용량을 주기적으로 모니터링하고 불필요한 파일을 적절히 정리하는 것이 중요합니다.