systemd-tmpfiles를 사용해서 불필요한 파일을 정리하는 방법

과거에는(지금도 많이 사용하는 방법이지만) find /path -mtime +7 -delete와 같이 crontab에 등록하여 일정기간(7일) 이상 경과한 파일을 주기적으로 삭제했죠.

0 0 * * * find /path -mtime +7 -delete

그런데 systemd-tmpfiles를 사용하면 리눅스 시스템에서 부팅 시 또는 주기적으로 임시 또는 지정 파일 및 디렉터리(예: /tmp, /var/tmp, /run)를 안전하게 생성, 권한 설정, 그리고 불필요하게 오래된 파일 및 디렉터리들을 자동으로 정리(Cleanup)할 수 있습니다. systemd-tmpfiles의 간략한 작동 원리를 먼저 알아보겠습니다.

  1. 시스템은 /usr/lib/tmpfiles.d/*.conf 및 /etc/tmpfiles.d/*.conf 설정 파일을 읽어들입니다.
  2. 부팅 시 systemd-tmpfiles-setup.service가 실행되어 설정을 적용하고, 주기적으로 systemd-tmpfiles-clean.timer가 동작하여 지정된 기간(Age)이 지난 임시 파일들을 자동으로 삭제합니다.

systemd-tmpfiles를 알아보기에 앞서 이와 관련된 서비스(Service) 및 타이머(Timer) 유닛들의 목록과 각각의 역할을 알아보겠습니다.

# systemctl list-units --all "systemd-tmpfiles*"
UNIT                               LOAD   ACTIVE   SUB     DESCRIPTION
systemd-tmpfiles-clean.service     loaded inactive dead    Cleanup of Temporary Directories
systemd-tmpfiles-setup-dev.service loaded active   exited  Create Static Device Nodes in /dev
systemd-tmpfiles-setup.service     loaded active   exited  Create Volatile Files and Directories
systemd-tmpfiles-clean.timer       loaded active   waiting Daily Cleanup of Temporary Directories

LOAD   = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB    = The low-level unit activation state, values depend on unit type.

4 loaded units listed.
To show all installed unit files use 'systemctl list-unit-files'.
유닛 이름 (Unit Name) 타입 역할 및 동작 시점
systemd-tmpfiles-setup-dev.service Service 시스템 부팅 초기, /dev 디렉터리 내에 필요한 임시 디렉터리나 노드 파일들을 생성 및 설정합니다.
systemd-tmpfiles-setup.service Service 시스템 부팅 시점에 /etc/tmpfiles.d/, /usr/lib/tmpfiles.d/ 등의 설정 파일을 읽어 필요한 임시 디렉터리를 생성하고 기본 권한을 초기화합니다. (부팅 시 1회 실행 후 종료)
systemd-tmpfiles-clean.service Service 설정된 보존 기간(Age)이 지난 불필요한 임시 파일들을 실제로 청소(systemd-tmpfiles –clean)하는 작업 수행합니다. (단독 실행 불가, 타이머에 의해 호출됨)
systemd-tmpfiles-clean.timer Timer systemd-tmpfiles-clean.service를 주기적으로 실행시키는 트리거(스케줄러)입니다. systemctl edit [--full] systemd-tmpfiles-clean.timer 명령어로 수정합니다. (기본값: 부팅 후 15분 뒤 최초 실행, 이후 24시간마다 반복)

# grep -vE "^#|^$" /usr/lib/systemd/system/systemd-tmpfiles-clean.timer
[Unit]
Description=Daily Cleanup of Temporary Directories
Documentation=man:tmpfiles.d(5) man:systemd-tmpfiles(8)
[Timer]
OnBootSec=15min
OnUnitActiveSec=1d

불필요 파일 정리를 위한 설정 파일 작성 방법

  1. 설정 파일 생성 예시: man tmpfiles.d 명령어로 매뉴얼을 확인할 수 있습니다. 여기서는 주요한 옵션 및 사용법에 대해 알아보겠습니다.
    vi /etc/tmpfiles.d/cleanup-app.conf
    # Type  Path                   Mode  User  Group  Age  Argument
    d       /app/logs              0755  root  root   -    -
    D       /var/run/myapp         0755  app   app    1d   -
    f       /var/log/myapp.state   0644  root  root   -    -
    F       /var/log/debug.log     0600  root  root   -    -
    r       /tmp/old_cache.tmp     -     -     -      2d   -
    R       /app/logs/*            -     -     -      7d   -
    C       /app/default.conf      -     -     -      -    /usr/share/myapp/template.conf
    x       /tmp/.oracle
    L       /var/app/current_log   -     -     -      -    /data/heavy_storage/log
    
    • Type (타입):
      • d: 지정한 경로에 디렉터리가 없으면 생성하고, 이미 존재하면 생성하지 않습니다. 지정된 권한(Mode), 소유자(User), 그룹(Group)으로 설정합니다.(존재하면 유지)
      • D: d와 비슷하지만, systemd-tmpfiles가 실행될 때 해당 디렉터리 내부의 기존 파일들을 전부 비우고(초기화하고) 새로 시작합니다. 뒤에 지정한 Age(예: 1d) 조건에 따라 오래된 내부 파일들을 정리합니다.(주로 깨끗한 상태로 시작해야 하는 런타임 경로에 유용)
      • f: 지정한 경로에 파일이 없으면 빈 파일을 생성합니다. 이미 존재할 경우 내용은 유지하되 권한과 소유권만 지정된 값으로 맞춥니다.
      • F: f와 비슷하지만, 파일이 이미 존재하더라도 내용을 비우고(Truncate) 새로 생성합니다.
      • r: 지정된 경로의 파일이나 비어 있는 디렉터리를 삭제합니다. (하위 파일이 있는 디렉터리에는 동작하지 않음)
      • R: 지정된 경로 안의 모든 파일과 하위 디렉터리들을 재귀적으로 전부 탐색하여, 지정한 기간(7d)이 지난 항목들을 일괄 삭제합니다.
      • C: 마지막 인자(Argument)로 지정된 원본 경로의 파일이나 디렉터리를 앞선 경로로 복사합니다. 대상에 이미 파일이 존재하면 덮어쓰지 않고 무시합니다.
      • x: 다른 규칙이나 일반적인 정리 대상에 포함되더라도, 이 타입이 지정된 경로는 systemd-tmpfiles –clean 작업에서 완전히 제외시킵니다. 다른 규칙에 의해 실수로 삭제되는 것을 막아주는 방어선 역할을 합니다. 오라클 소켓 파일이나 중요한 락 파일 등 시스템 무중단을 위해 절대 지워지면 안 되는 핵심 경로를 보호할 때 필수적입니다.
      • L: 지정한 경로에 원본 파일/디렉터리를 가리키는 심볼릭 링크(ln -s)를 생성합니다. Argument가 링크가 바라볼 원본 디렉터리 또는 파일 경로입니다.(ln -s /data/heavy_storage/log /var/app/current_log 명령을 실행한 것과 동일한 효과)
    • Age (보존 기간):
      • 7d: 7일
      • 24h: 24시간
      • 30m: 30분
      • -: 기간 제한 없음 (삭제 안 함)
  2. 적용 여부 테스트 (Dry-Run): 설정에 문법적 오류가 없는지, 그리고 정리 대상에서 해당 경로들이 안전하게 제외되는지 확인하려면 다음 명령어로 확인해 볼 수 있습니다.
    systemd-tmpfiles --cat-config
    

실행 주기(스케줄)를 변경하는 방법

  1. 실행 주기(스케줄)만 변경하는 방법 (Drop-in 설정)
    기본 설정 파일(/usr/lib/systemd/system/systemd-tmpfiles-clean.timer)을 직접 수정하는 것은 권장되지 않으며, 시스템 업데이트 시 초기화될 수 있습니다. 대신 systemctl edit 명령어를 사용하여 설정을 안전하게 오버라이드(Override)합니다. 저장하면 /etc/systemd/system/systemd-tmpfiles-clean.timer.d/override.conf로 드롭인 오버라이드 파일이 생성됩니다. 패키지 매니저를 통해 systemd 패키지가 업데이트되더라도 드롭인 파일은 유지되므로 시스템 업데이트 후에도 설정이 지워지지 않고 안전하게 보존됩니다.
    # OnUnitActiveSec 지시자는 실행 주기를 설정할 때, OnCalendar 지시자는 특정 시간에 정확히 돌리고 할 때 설정합니다.
    systemctl edit systemd-tmpfiles-clean.timer
    [Timer]
    OnBootSec=10min
    OnUnitActiveSec=12h
    OnCalendar=*-*-* 03:00:00
    
  2. 원본 유닛 파일 전체를 열어서 수정하는 방법
    systemd-tmpfiles-clean.timer는 기본적으로 시스템 부팅 후 15분 뒤에 처음 실행되고, 그 후에는 24시간(1일)마다 주기적으로 정리 서비스(systemd-tmpfiles-clean.service)를 호출하도록 설정되어 있습니다. 저장하면 기존 기본 유닛 파일 전체를 완전히 대체(Supersede)하게 되고, 패키지 업그레이드 시 원본 파일의 개선 사항이 자동으로 반영되지 않을 수 있습니다. 따라서 단순 주기 변경 등 일부 옵션만 바꿀 때는 기본 systemctl edit (드롭인 방식)이 더 안전하며, 의존성이나 전체 구조를 통째로 바꾸어야 할 때 –full 옵션을 유용하게 활용할 수 있습니다.
    systemctl edit --full systemd-tmpfiles-clean.timer
    #  This file is part of systemd.
    #
    #  systemd is free software; you can redistribute it and/or modify it
    #  under the terms of the GNU Lesser General Public License as published by
    #  the Free Software Foundation; either version 2.1 of the License, or
    #  (at your option) any later version.
    
    [Unit]
    Description=Daily Cleanup of Temporary Directories
    Documentation=man:tmpfiles.d(5) man:systemd-tmpfiles(8)
    
    [Timer]
    OnBootSec=15min
    OnUnitActiveSec=1d
    
  3. 기본 타이머 활성화 및 확인: 타이머가 켜져 있지 않다면 부팅 시 자동 시작되도록 활성화합니다.
    # systemd 설정 리로드
    systemctl daemon-reload
    
    # 타이머 활성화 및 즉시 시작
    systemctl enable --now systemd-tmpfiles-clean.timer
    
    # 타이머 작동 상태 및 다음 실행 시간 확인
    systemctl status systemd-tmpfiles-clean.timer
    

You may also like...

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다