프로그래밍/운영체제

리눅스 tmpfiles.d 설정 기준 정리

포도알77 2026. 5. 28. 10:40

본문 중간의 쿠팡 추천 상품 구매시 쿠팡 파트너스에서 일정액의 수수료를 제공받습니다.

리눅스 tmpfiles.d 설정 기준 정리

tmpfiles.d는 리눅스에서 부팅 시 필요한 디렉터리와 파일을 만들고, 일정 시간이 지난 임시 파일을 정리할 때 자주 등장한다. 2026년 5월 28일 기준 systemd 공식 문서를 보면 이 기능은 단순히 /tmp 청소용이 아니라, 생성, 권한 조정, 내용 기록, 시간 기반 정리까지 포함하는 일반적인 파일 관리 규칙으로 정의돼 있다.

실무에서 핵심은 세 가지다. 서비스 전용 런타임 디렉터리처럼 unit 수명과 함께 관리해야 하는 경로라면 RuntimeDirectory= 같은 service 옵션이 우선이고, 여러 파일을 배포판 기본값 위에서 덮어써야 할 때는 /etc/tmpfiles.d/ 우선순위를 이해해야 하며, 정리 동작까지 기대한다면 agesystemd-tmpfiles --clean이 실제로 어떤 범위를 지우는지 확인해야 한다.

tmpfiles.d는 무엇을 하는 설정일까?

tmpfiles.d(5)는 이 포맷을 파일, 디렉터리, FIFO, 디바이스 노드 생성과 접근 권한 조정, 속성 변경, 내용 기록, 시간 기반 제거를 위한 메커니즘으로 설명한다. 이름 때문에 임시 파일 전용처럼 보이지만, 문서상 범위는 그보다 넓다.

systemd-tmpfiles(8)는 이 규칙을 읽어 생성, 제거, 정리 작업을 수행하는 도구다. 시스템 부팅 시에는 관련 service가 생성 작업을 실행하고, 이후에는 clean timer가 age가 있는 항목을 주기적으로 정리할 수 있다.

어떤 디렉터리에 파일을 둬야 할까?

공식 문서 기준 역할은 분명하다. /etc/tmpfiles.d/는 로컬 관리자가 쓰는 위치이고, /usr/lib/tmpfiles.d/는 패키지 공급자가 기본 규칙을 배포하는 위치다. /run/tmpfiles.d/는 런타임에 생성되는 규칙에 사용된다.

같은 이름의 파일이 여러 디렉터리에 있으면 /etc/run/usr/lib를 덮어쓴다. 문서는 공급자 파일을 비활성화해야 할 때 같은 이름으로 /dev/null 심볼릭 링크를 /etc/tmpfiles.d/에 두는 방식을 권장한다.

우선순위는 파일명과 경로 중 무엇이 더 중요할까?

여기서 자주 헷갈린다. 먼저 같은 basename 파일은 디렉터리 우선순위로 하나만 선택된다. 그다음 실제 적용 대상이 된 모든 파일은 파일명 기준 사전식 순서로 정렬된다.

tmpfiles.d(5)는 여러 파일이 같은 path를 지정하면 파일명이 더 이른 항목이 적용되고, 나머지 충돌 항목은 오류로 기록된다고 설명한다. 즉 sysctl.d처럼 나중 파일이 같은 키를 덮어쓰는 구조가 아니라, 동일 path 중복 자체를 피하는 쪽으로 이해하는 편이 맞다.

언제 tmpfiles.d보다 RuntimeDirectory가 나을까?

systemd 공식 문서는 서비스 데몬이 /run 아래에 개인 런타임 디렉터리를 필요로 할 때, tmpfiles.d의 유연성이 꼭 필요하지 않다면 unit 파일의 RuntimeDirectory=를 쓰는 편이 더 낫다고 안내한다.

이유는 수명 주기가 서비스와 직접 연결되기 때문이다. systemd.exec(5)는 이런 디렉터리 옵션을 쓰면 디렉터리가 표준 경로 아래에 자동 생성되고, unit 시작과 정지 흐름에 맞춰 관리된다고 설명한다. 단순히 소켓 디렉터리 하나를 만들 목적이라면 서비스 정의 안에서 끝내는 편이 운영상 더 예측 가능하다.

 

 

정리 작업은 어떻게 동작할까?

systemd-tmpfiles --clean은 age 값이 지정된 항목만 정리한다. 문서상 age는 디렉터리 내용이나 파일을 얼마나 지난 뒤 정리할지 나타내며, line type에 따라 의미가 조금씩 다르다.

예를 들어 d는 디렉터리를 만들고 age가 있으면 내부 항목을 시간 기준으로 정리할 수 있다. D는 여기에 더해 --remove 시 내용 제거까지 연결된다. 따라서 생성만 필요한 경로와, 주기 청소까지 맡길 경로를 구분해서 써야 한다.

자주 쓰는 line type은 무엇을 뜻할까?

타입 의미 실무 해석
d 디렉터리 생성 권한과 소유자까지 함께 관리할 때 기본 선택지
D 디렉터리 생성 + remove 시 내용 정리 패키지 제거 시 내부까지 같이 정리할 필요가 있을 때 검토
f 일반 파일 생성 빈 파일이나 기본 내용을 가진 파일 생성에 사용
w 파일에 내용 쓰기 단순 생성이 아니라 지정 문자열을 기록해야 할 때 사용
z, Z 권한과 소유자, 보안 라벨 조정 기존 경로의 퍼미션 보정이 목적일 때 사용
r, R 경로 제거 생성 규칙과는 별도이며 제거 범위를 명확히 이해해야 함

운영 기준은 어떻게 잡으면 될까?

상황 권장 기준 이유
서비스 전용 /run 디렉터리 RuntimeDirectory= 우선 unit 수명과 같이 관리되고 선행 실행 순서를 덜 신경 써도 된다
패키지 기본 규칙 배포 /usr/lib/tmpfiles.d/ 로컬 관리자가 /etc에서 쉽게 오버라이드할 수 있다
로컬 운영 정책 추가 /etc/tmpfiles.d/ 공급자 기본값보다 높은 우선순위를 가진다
임시 파일 청소 자동화 age를 명시한 d 또는 관련 타입 사용 --clean은 age가 없는 항목을 정리하지 않는다

FAQ

Q. tmpfiles.d는 부팅 때만 실행될까?

아니다. 생성은 부팅 시 관련 service로 실행될 수 있지만, systemd-tmpfiles 자체는 --create, --clean, --remove 같은 명령으로 별도 실행할 수 있다. 정리도 timer를 통해 주기적으로 일어날 수 있다.

Q. 같은 path를 두 파일에서 선언해도 마지막 파일이 이길까?

그렇게 보면 안 된다. tmpfiles.d(5)는 같은 path를 지정하는 충돌 항목이 있으면 파일명이 더 이른 항목을 적용하고, 다른 충돌 항목은 오류로 기록된다고 설명한다. 따라서 path 중복을 피하는 설계가 안전하다.

Q. 느낌표 !가 붙은 규칙은 언제 적용될까?

문서 기준으로 !는 부팅 시에만 안전한 규칙을 뜻하며, --boot 옵션을 줄 때만 고려된다. 실행 중 시스템에서 돌리면 위험할 수 있는 동작을 구분하는 표시다.

한 줄 정리

tmpfiles.d는 임시 파일 삭제 규칙만이 아니라 시스템 경로 생성과 정리 정책을 선언하는 포맷이다. 다만 서비스 전용 런타임 디렉터리는 가능하면 RuntimeDirectory=로 처리하고, 로컬 오버라이드는 /etc/tmpfiles.d/, 공급자 기본값은 /usr/lib/tmpfiles.d/로 나누는 편이 현재 systemd 문서 기준에 맞는 운영 방식이다.

참고 자료

반응형
페이스북으로 공유카카오톡으로 공유카카오스토리로 공유트위터로 공유URL 복사