임시 스토리지 관리 (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/meminfo의 Shmem 필드에 크기 반영
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 동작 흐름
- 마운트:
mount -t tmpfs -o size=512M tmpfs /tmp명령으로 tmpfs 생성 - 파일 생성:
open()시스템 콜 → 커널이 RAM 할당 → inode 및 페이지 캐시에 저장 - 쓰기:
write()시스템 콜 → 페이지 캐시에 데이터 기록 → dirty page로 표시 - 읽기:
read()시스템 콜 → 페이지 캐시에서 직접 반환 (디스크 I/O 없음) - 스왑 (선택): 물리 메모리 부족 시 커널이 swap 영역으로 페이지 이동
- umount 또는 재부팅: 모든 페이지 해제, inode 해제, RAM 회수
그림 2. tmpfs 파일 생성부터 해제까지의 동작 흐름
systemd-tmpfiles 정리 동작
- 부팅 시:
systemd-tmpfiles-setup.service가 설정 파일 읽기 - --create:
d,D,f타입 디렉토리/파일 생성, 권한 설정 - --remove:
r,R타입 항목 삭제 - --clean (주기적):
d,D,e타입의 age 기반 정리 - age 판정: 파일의 mtime/atime/ctime 중 하나라도 현재 시간 - age보다 최신이면 유지
- 잠금 확인: BSD flock으로 잠긴 파일/디렉토리는 정리에서 제외
- 삭제 실행: 대상 파일/디렉토리 삭제
컨테이너 ephemeral overlay 동작
- 이미지 레이어: 읽기 전용 컨테이너 이미지 레이어 마운트
- writable layer: 상단에 writable overlay 레이어 추가 (copy-on-write)
- 파일 수정: 기존 파일 수정 시 writable layer에 복사 후 수정 (COW)
- 파일 생성: writable layer에 직접 생성
- 파일 삭제: whiteout 파일 생성으로 숨김 처리
- 컨테이너 삭제 시: writable layer 완전 삭제, 모든 변경사항 소멸
임시 파일 수명 주기
생성 → 사용 → 정리/삭제
│ │ │
│ │ ├── 애플리케이션 종료 시 unlink()
│ │ ├── systemd-tmpfiles age 기반 정리
│ │ ├── 재부팅 시 /tmp 비우기
│ │ └── 컨테이너/Pod 삭제 시
│ │
│ └── 잠금 파일(lock), 캐시, 중간 산물
│
└── mkstemp(), mkdtemp(), tmpfile()
장단점
장점
- 높은 I/O 성능: tmpfs는 RAM 기반으로 디스크 I/O 없이 파일 접근 가능
- 자동 정리: 재부팅, 컨테이너 삭제, systemd-tmpfiles에 의해 자동으로 리소스 회수
- 보안 격리: 컨테이너별/프로세스별 격리된 임시 저장소 제공
- 유연한 용량 조정: tmpfs는
mount -o remount로 온라인에서 크기 변경 가능 - 디스크 수명 보호: SSD에 임시 파일을 반복 기록하지 않아 워어링 최소화
단점
- 데이터 유실 위험: 시스템 비정상 종료 시 임시 데이터 손실 가능
- 메모리 소비: tmpfs는 실제 RAM을 사용하여 다른 프로세스의 사용 가능 메모리 감소
- 용량 제한: 메모리 기반 임시 저장소는 물리 RAM에 의해 제한
- 보안 관리 필요: 임시 파일에 민감한 데이터 포함 시 추가 보안 조치 필요
- 정리 타이밍: 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/
관련 문서
- 서버리스 메모리 - 서버리스 환경의 임시 저장소 개념
- 서버리스 스토리지 - 클라우드 영속 스토리지
- 스왑/zRAM - 압축 메모리 스왑
- 서버리스 Linux 최적화 - 부팅 시간 및 메모리 최적화
핵심 정리
-
tmpfs: Linux의 주요 임시 스토리지 구현체로, RAM 기반으로 빠른 I/O를 제공하며 마운트 해제 또는 재부팅 시 자동으로 삭제됩니다.
-
보안 APIs:
mkstemp()와mkdtemp()는 race condition과 symlink 공격을 방어하는 안전한 임시 파일 생성 함수이며, 임의의 임시 파일 생성 시 반드시 사용해야 합니다. -
systemd-tmpfiles: age 필드를 활용한 시간 기반 정리 메커니즘으로, 시스템 수준에서 임시 파일의 수명을 자동으로 관리합니다.
-
컨테이너 환경: Docker의 writable overlay, Kubernetes의 emptyDir, Lambda의
/tmp는 각각 컨테이너/FaaS 수명과 동일한 임시 저장소를 제공하며, 리소스 격리와 자동 정리를 보장합니다. -
모니터링:
/proc/meminfo의 Shmem 필드,df -h,du -sh,find명령 등을 통해 임시 스토리지 사용량을 주기적으로 모니터링하고 불필요한 파일을 적절히 정리하는 것이 중요합니다.