Linux 파일 타임스탬프 설명: atime, mtime 및 ctime

파일 시스템에서 “변경됨”과 “수정됨”이라는 용어는 때로는 혼동을 야기할 수 있습니다. 특히 리눅스 파일 타임스탬프를 다룰 때 그렇습니다. 이 글에서는 리눅스 시스템이 파일 타임스탬프를 어떻게 관리하고, 사용자가 직접 이들을 변경할 수 있는 방법에 대해 알아봅니다.

atime, mtime, ctime의 구별

리눅스 파일 시스템은 각 파일마다 세 가지 중요한 타임스탬프를 기록합니다. 이들은 다음과 같습니다:

  • 접근 시간 (atime): 파일이 마지막으로 읽힌 시간을 나타냅니다. 이는 프로그램이 파일의 내용을 확인하거나 데이터를 읽었을 때 업데이트됩니다. 파일 자체의 내용 변경은 이 타임스탬프에 영향을 주지 않습니다.
  • 수정 시간 (mtime): 파일의 내용이 마지막으로 변경된 시간을 나타냅니다. 파일에 새로운 데이터가 추가되거나 기존 내용이 삭제, 수정된 경우 mtime이 업데이트됩니다.
  • 변경 시간 (ctime): 파일 내용 변경과는 관련 없이, 파일 자체의 메타데이터(예: 권한)가 변경된 시간을 나타냅니다. 예를 들어, 파일의 접근 권한이 변경되면 ctime이 업데이트됩니다.

흥미롭게도, 표준 ext4 리눅스 파일 시스템은 파일 생성 시간을 위한 공간도 할당하지만, 이는 아직 완전히 구현되지는 않았습니다. 이 타임스탬프는 때때로 채워지기도 하지만, 정확성을 보장할 수 없습니다.

타임스탬프의 구조

리눅스 타임스탬프는 단순히 날짜와 시간을 나타내는 것이 아니라, 1970년 1월 1일 자정(UTC)을 기준으로 경과된 초 단위의 숫자를 저장합니다. 이를 ‘유닉스 시간’이라고 합니다. 윤초는 이 계산에서 제외됩니다.

시스템이 타임스탬프를 표시할 때, 이 초 단위 숫자를 날짜와 시간으로 변환합니다. 이 과정에서 사용자의 컴퓨터 위치와 시간대 설정이 고려됩니다. 또한, 사용자의 지역 설정에 따라 월 이름을 현지 언어로 표시합니다.

리눅스 타임스탬프에 저장할 수 있는 초 단위의 최댓값은 2,147,483,647입니다. 이는 2038년 1월 19일 오전 3시 14분 7초에 해당합니다. 이 시점이 되면 타임스탬프 처리 방식에 새로운 시스템이 필요하게 됩니다.

타임스탬프 확인하기

ls 명령어와 함께 다양한 옵션을 사용하여 파일 타임스탬프를 확인할 수 있습니다.

  • 수정 시간(mtime): ls -l 파일명
  • 접근 시간(atime): ls -lu 파일명
  • 변경 시간(ctime): ls -lc 파일명

또한, stat 명령어를 사용하면 세 가지 타임스탬프를 한 번에 볼 수 있습니다.

stat 파일명

위의 예시에서 파일 내용은 2019년 4월 21일에 마지막으로 수정되었음을 보여줍니다. 접근 및 변경 시간은 2020년 1월 20일로 동일한데, 이는 파일을 다른 컴퓨터에서 복사해왔기 때문입니다. 이때 두 타임스탬프가 모두 업데이트됩니다.

stat 명령어의 출력 결과에는 시간대 정보가 하단에 표시됩니다. 각 타임스탬프의 끝에 나타나는 -0500 또는 -0400은 시간대 오프셋을 나타냅니다. 파일 시스템은 타임스탬프를 UTC로 기록하고, stat 명령어는 이를 현지 시간대로 변환하여 보여줍니다.

흥미로운 점은, 시간대 정보 자체는 파일 시스템 어디에도 저장되지 않는다는 것입니다. 타임스탬프가 저장될 때 UTC 시간이 사용되고, 이를 표시하는 컴퓨터의 시간대 설정과 일광 절약 시간 적용 여부를 고려하여 현지 시간으로 변환됩니다.

stat 명령어 출력에는 “Birth” 타임스탬프도 표시되지만, 이는 아직 구현되지 않아 하이픈(-)으로 표시됩니다.

타임스탬프 변경하기

touch 명령어를 사용하여 파일의 접근 시간(atime) 또는 수정 시간(mtime)을 변경할 수 있습니다.

  • 접근 시간 변경: touch -a 파일명
  • 수정 시간 변경: touch -m 파일명
  • 접근 및 수정 시간 동시 변경: touch -d "날짜 시간" 파일명

touch -a 명령어는 접근 시간을 현재 시간으로 설정하고, touch -m 명령어는 수정 시간을 현재 시간으로 설정합니다. touch -d 명령어는 접근 및 수정 시간을 지정된 날짜와 시간으로 설정합니다.

또한, touch 명령어와 함께 -r 옵션을 사용하면 다른 파일의 타임스탬프 값을 복사할 수 있습니다.

touch 파일명 -r 참조파일명

파일의 메타데이터만 변경하고 싶다면, 파일 권한을 변경하는 chmod 명령어를 사용할 수 있습니다. 이는 파일 내용 자체를 변경하지 않으므로 변경 시간(ctime)만 업데이트됩니다.

chmod +x 파일명

파일 시스템의 타임스탬프 업데이트 방식

파일 시스템이 마운트될 때, 타임스탬프 업데이트 방법을 결정하는 여러 옵션이 설정될 수 있습니다. 이러한 옵션은 /etc/fstab 파일에 저장됩니다.

주요 옵션은 다음과 같습니다:

  • strictatime: 파일 접근 시마다 접근 시간(atime)을 업데이트합니다.
  • noatime: 접근 시간(atime) 업데이트를 완전히 비활성화합니다. 수정 시간(mtime)은 계속 업데이트됩니다.
  • nodiratime: 파일의 접근 시간 업데이트는 활성화하지만, 디렉토리는 비활성화합니다.
  • relatime: 접근 시간이 24시간 이상 지났거나, 기존 접근 시간이 수정 또는 변경 시간보다 오래된 경우에만 접근 시간을 업데이트합니다.

/etc/fstab 파일을 확인하여 어떤 옵션이 설정되어 있는지 확인할 수 있습니다.

less /etc/fstab

# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
#                 
# / was on /dev/sda1 during installation
UUID=4a143d08-8695-475b-8243-b13b56050fc2 / ext4 errors=remount-ro 0 1
/swapfile none swap sw 0 0

위 예시에서, errors=remount-ro 옵션만 설정되어 있으며, 이는 파일 시스템에 오류가 있을 때 읽기 전용으로 다시 마운트하도록 지시합니다. 타임스탬프 업데이트 옵션은 명시되어 있지 않습니다.

이 경우, 리눅스 시스템은 합리적인 기본값을 사용합니다. /proc/mounts 파일을 확인하여 어떤 옵션이 실제로 사용되는지 확인할 수 있습니다.

cat /proc/mounts | grep "sda"

위 출력 결과에서 relatime 옵션이 사용되고 있음을 확인할 수 있습니다. 이는 대부분의 리눅스 시스템에서 기본값으로 설정되는 방식입니다.

타임스탬프의 중요성

타임스탬프는 파일 접근, 수정, 변경 시점을 정확하게 파악할 수 있도록 돕습니다. 백업 소프트웨어는 타임스탬프를 사용하여 어떤 파일을 백업해야 할지 결정합니다. 또한 타임스탬프를 조작함으로써 특정 파일 또는 파일 집합을 포함하거나 제외하도록 백업 프로그램을 설정할 수 있습니다.