반응형

리눅스 파일에는 시간이 세 개 있다

리눅스에서 파일을 다루다 보면 ls -l 명령어로 날짜 정보를 확인할 때가 많습니다. 그런데 사실 리눅스 파일 시스템은 파일 하나당 세 가지 타임스탬프를 별도로 관리합니다. 바로 atime(접근 시간), mtime(수정 시간), ctime(변경 시간)입니다. 이 세 가지는 이름이 비슷해서 혼동하기 쉽지만, 각각 전혀 다른 상황에서 갱신됩니다.

단순히 개념을 아는 것을 넘어, 백업 스크립트 작성, 보안 감사, 성능 최적화 등 실무에서 이 차이를 정확히 알아야 하는 상황이 자주 생깁니다. 세 가지 타임스탬프의 정확한 정의와 동작 방식, 그리고 실무 활용법까지 정리합니다.

세 가지 타임스탬프 정의

atime — Access Time (접근 시간)

파일의 내용이 마지막으로 읽힌 시각입니다. cat, less, grep 등으로 파일 내용을 읽으면 atime이 갱신됩니다. 파일을 수정하지 않고 단순히 열어보기만 해도 변경된다는 점이 핵심입니다.

  • 갱신 시점: 파일 내용 읽기 (cat, less, grep, cp의 소스 파일 등)
  • 갱신되지 않는 경우: 파일 속성만 조회 (ls -l, stat)
  • 주의: 현대 리눅스는 성능 이슈로 relatime 옵션을 기본 적용 — mtime이나 ctime보다 atime이 오래됐을 때만 갱신

mtime — Modify Time (수정 시간)

파일의 내용(데이터)이 마지막으로 변경된 시각입니다. 파일을 편집하거나 새로운 내용을 추가·삭제할 때 갱신됩니다. ls -l로 기본 출력되는 날짜가 바로 mtime입니다.

  • 갱신 시점: 파일 내용 쓰기 (vi 저장, echo 리다이렉션, 프로그램이 파일에 데이터 기록)
  • 갱신되지 않는 경우: 파일 권한 변경(chmod), 소유자 변경(chown), 파일명 변경(mv)
  • mtime이 변경되면 ctime도 반드시 함께 변경됨

ctime — Change Time (변경 시간)

파일의 inode 정보가 마지막으로 변경된 시각입니다. 여기서 많은 분들이 헷갈리는데, ctime은 "Created Time(생성 시간)"이 아닙니다. 파일 내용뿐 아니라 권한, 소유자, 링크 수 등 메타데이터 변경까지 모두 추적합니다.

  • 갱신 시점: 파일 내용 변경(mtime 갱신 시 포함), chmod, chown, ln(하드링크 추가), mv(같은 파일 시스템 내)
  • 갱신되지 않는 경우: 파일 내용 읽기만 하는 경우
  • ctime은 사용자가 임의로 변경할 수 없음 — 보안 감사에서 중요한 이유

타임스탬프 확인 방법

ls -l은 mtime만 보여줍니다. 세 가지 타임스탬프를 모두 확인하려면 stat 명령어를 사용합니다.

stat filename.txt

출력 예시는 다음과 같습니다.

  File: filename.txt
  Size: 1024
Access: 2025-03-15 09:00:00.000  ← atime
Modify: 2025-03-14 18:30:00.000  ← mtime
Change: 2025-03-14 18:30:05.000  ← ctime

각 타임스탬프를 기준으로 파일을 찾으려면 find 명령어의 옵션을 다르게 사용합니다.

find /var/log -mtime -1      # mtime 기준 — 최근 1일 이내 내용이 수정된 파일
find /etc -ctime -7          # ctime 기준 — 최근 7일 이내 속성이 변경된 파일
find /home -atime +30        # atime 기준 — 30일 이상 접근하지 않은 파일

atime 성능 이슈와 마운트 옵션

atime은 파일을 읽을 때마다 디스크에 쓰기 작업이 발생한다는 단점이 있습니다. 읽기 작업이 많은 서버에서는 이 오버헤드가 성능에 영향을 줄 수 있어, 리눅스는 마운트 옵션으로 atime 동작을 제어합니다.

  • strictatime: 파일 접근 시 항상 atime 갱신. 가장 정확하지만 성능 부하 최대.
  • relatime (기본값): mtime 또는 ctime보다 atime이 오래됐을 때만 갱신. 성능과 정확성의 균형.
  • noatime: atime을 전혀 갱신하지 않음. 성능 최적화 목적. 빈번한 읽기가 발생하는 고성능 서버에 적용.
  • nodiratime: 디렉터리의 atime만 갱신하지 않음.
# /etc/fstab에서 noatime 적용 예시
/dev/sda1  /  ext4  defaults,noatime  0 1

실무 활용 시나리오

백업 스크립트 — mtime 활용

증분 백업(Incremental Backup)을 구현할 때 mtime을 기준으로 변경된 파일만 선별합니다. 파일 내용이 실제로 바뀐 것만 추적하기 때문에 가장 정확합니다.

find /data -mtime -1 -type f | xargs tar -czf /backup/incremental_$(date +%F).tar.gz

보안 감사 — ctime 활용

해커가 파일 내용을 수정한 뒤 touch 명령으로 mtime을 위조하더라도, ctime은 시스템 내부에서 관리되므로 사용자가 임의로 변경할 수 없습니다. 침해사고 분석 시 ctime을 기준으로 의심 파일을 추려내는 이유가 여기에 있습니다.

# 최근 24시간 이내 ctime이 변경된 시스템 파일 탐지
find /etc /bin /usr/bin -ctime -1 -type f

스토리지 정리 — atime 활용

오랫동안 아무도 접근하지 않은 파일을 찾아 아카이브하거나 삭제할 때 atime을 기준으로 삼습니다.

# 180일 이상 접근하지 않은 파일 목록 출력
find /home -atime +180 -type f -ls

세 타임스탬프 비교 요약

  • atime: 파일 내용을 읽으면 갱신 / noatime으로 비활성화 가능 / 장기 미접근 파일 탐지에 활용
  • mtime: 파일 내용을 쓰면 갱신 / ls -l 기본 출력값 / 증분 백업 기준으로 활용
  • ctime: 내용·메타데이터 모두 변경 시 갱신 / 사용자 임의 변경 불가 / 보안 감사 기준으로 활용

마무리

ctime, mtime, atime은 단순한 날짜 정보가 아니라 파일 시스템이 파일의 상태 변화를 추적하는 핵심 메커니즘입니다. 세 가지의 차이를 명확히 이해하고 find 명령어와 조합하면 백업 자동화, 보안 감사, 스토리지 최적화 등 다양한 실무 작업의 정확도와 효율을 크게 높일 수 있습니다.

반응형

+ Recent posts