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

“변경됨”이 “수정됨”을 의미하지 않는 경우는 언제입니까? Linux 파일 타임스탬프에 대해 이야기할 때. 이 가이드에서는 시스템이 업데이트하는 방법과 직접 변경하는 방법을 설명합니다.

atime, mtime 및 ctime의 차이점

모든 Linux 파일에는 3개의 타임스탬프: 액세스 타임스탬프(atime), 수정된 타임스탬프(mtime), 변경된 타임스탬프(ctime).

액세스 타임스탬프는 파일을 마지막으로 읽은 시간입니다. 이것은 누군가가 프로그램을 사용하여 파일의 내용을 표시하거나 파일에서 일부 값을 읽었음을 의미합니다. 파일에 편집되거나 추가된 내용이 없습니다. 데이터가 참조되었지만 변경되지 않았습니다.

수정된 타임스탬프는 파일 내용이 마지막으로 수정된 시간을 나타냅니다. 파일을 편집하거나 조작한 프로그램 또는 프로세스. “수정됨”은 파일 내부의 내용이 수정 또는 삭제되었거나 새로운 데이터가 추가되었음을 의미합니다.

변경된 타임스탬프는 파일 내용에 대한 변경 사항을 참조하지 않습니다. 오히려 파일과 관련된 메타데이터가 변경된 시간입니다. 예를 들어 파일 권한이 변경되면 변경된 타임스탬프가 업데이트됩니다.

표준 ext4 Linux 파일 시스템은 또한 내부 파일 시스템 구조에서 파일 생성 타임스탬프를 위한 공간을 할당하지만 아직 구현되지 않았습니다. 때때로 이 타임스탬프가 채워지지만 그 값에 의존할 수 없습니다.

타임스탬프의 해부

Linux 타임스탬프는 날짜와 시간이 아닌 숫자를 보유합니다. 이 숫자는 유닉스 시대, 1970년 1월 1일 자정(00:00:00) 협정 세계시(UTC). 윤초는 Linux 타임스탬프에서 무시되므로 실시간과 유사하지 않습니다.

Linux가 타임스탬프를 표시해야 할 때 초 수를 날짜 및 시간으로 변환합니다. 이것은 인간이 이해하기 쉽게 만듭니다. 파일을 보고 있는 컴퓨터가 있는 위치와 시간대는 초 단위를 날짜와 시간으로 변환하는 데 도움이 됩니다. 또한 해당 월이 올바른 언어로 되어 있는지 확인합니다.

그렇다면 타임스탬프에 몇 초를 저장할 수 있습니까? 많이—정확히 말하면 2,147,483,647입니다. 그것은 큰 숫자이지만 충분합니까? 이를 Unix epoch에 추가한 다음 날짜와 시간으로 변환하면 2038년 1월 19일 화요일 오전 03:14:07이 됩니다. 하지만 그 전에는 타임스탬프에 대해 다른 체계가 필요합니다.

타임스탬프 보기

아래와 같이 -l(긴 목록) 옵션을 ls와 함께 사용하면, 수정된 타임스탬프를 볼 수 있습니다.:

ls -l dp.c

액세스 타임스탬프를 보려면 다음과 같이 -lu(액세스 시간) 옵션을 사용하십시오.

ls -lu dp.c

마지막으로 변경 타임스탬프를 보려면 -lc(변경 시간) 옵션을 사용할 수 있습니다. 다음을 입력하십시오.

ls -lc dp.c

그만큼

위의 타임스탬프는 파일 내용이 2019년 4월 21일에 마지막으로 수정되었음을 보여줍니다. 액세스 및 변경된 타임스탬프는 파일이 2020년 1월 20일에 다른 컴퓨터에서 이 컴퓨터로 복사되었고 두 타임스탬프가 모두 해당 시점에 업데이트되었기 때문에 동일합니다.

  더 나은 배터리 수명을 위한 5가지 최고의 Linux 배포판

에게 모든 타임스탬프를 동시에 보기, 다음과 같이 stat 명령을 사용합니다.

stat dp.c

그만큼

시간대는 디스플레이 하단에 나열됩니다. 보시다시피 매우 정확한 소수 초 구성 요소가 있습니다. 각 타임스탬프의 끝에 -0500 또는 -0400 도 표시됩니다.

이것은 시간대 오프셋입니다. 파일 시스템은 타임스탬프를 UTC로 기록하고 stat에 의해 표시될 때 현지 시간대로 변환합니다. 이 기사를 조사하는 데 사용한 컴퓨터는 마치 미국 동부 표준시(EST) 시간대에 있는 것처럼 구성되어 있습니다.

해당 시간대는 EST가 시행될 때 UTC보다 5시간 늦습니다. 그러나 동부 일광 절약 시간(EDT)이 시행되는 경우 UTC보다 4시간 늦습니다. 2019년 4월 수정된 타임스탬프가 변경되었을 때 EDT가 적용되었습니다. 그렇기 때문에 타임스탬프 중 2개에는 5시간 오프셋이 있지만 수정된 타임스탬프에는 4시간 오프셋이 있습니다.

오프셋과 시간대는 어디에도 저장되지 않습니다. 이러한 값을 유지하는 데 사용되는 inode나 파일 시스템 공간이 없습니다. 타임스탬프(항상 UTC 시간), 파일을 표시하는 컴퓨터의 현지 표준 시간대 및 DST가 적용되었는지 여부를 사용하여 즉시 계산해야 합니다.

또한 파일 생성 날짜로 예약된 “Birth” 타임스탬프가 표시됩니다. 이것은 구현되지 않았으며 타임스탬프 대신 하이픈 “-“이 표시됩니다.

타임스탬프 변경

원하는 경우 파일의 타임스탬프를 변경할 수 있습니다. 터치 명령을 사용하여 액세스 또는 수정된 타임스탬프를 변경할 수 있습니다. 아니면 둘다:

touch -a dp.c

새 액세스 타임스탬프를 설정하려면 -a(액세스 시간) 옵션을 사용합니다. 이 명령은 액세스 타임스탬프를 컴퓨터의 현재 시간으로 설정합니다.

stat dp.c

그만큼

예상대로 액세스 타임스탬프가 변경되었습니다. 그러나 변경된 타임스탬프도 업데이트되었습니다. 이것은 정상입니다.

수정된 타임스탬프를 변경하려면 -m(수정된 시간) 옵션을 사용할 수 있습니다.

touch -m dp.c
stat dp.c

그만큼

이번에는 수정 및 변경된 타임스탬프가 업데이트되었습니다.

액세스 및 수정된 타임스탬프를 동시에 변경하려는 경우 -d(날짜) 옵션을 사용할 수 있습니다. 시간과 날짜를 지정할 수도 있습니다. 타임스탬프를 현재로 변경하는 데 제한이 없습니다.

다음 명령을 사용하여 액세스 및 수정된 타임스탬프를 2020년 1월 15일 10:30:45로 설정합니다.

touch -d "2020-01-15 10:30:45" dp.c
stat dp.c

이제 액세스 및 수정된 타임스탬프를 과거 날짜로 설정했습니다. 변경된 타임스탬프도 컴퓨터의 현재 시간으로 업데이트되었습니다.

  Sound Juicer를 사용하여 Linux PC에 음악 CD를 저장하는 방법

한 파일의 타임스탬프를 다른 파일의 타임스탬프 값으로 설정하려면 아래와 같이 -r(참조) 옵션을 사용할 수도 있습니다.

touch dp.c -r dice_words.sl3
stat dp.c

그만큼

그런 다음 -0400과 -0500 타임스탬프가 혼합된 상태로 시작했던 위치로 거의 돌아갑니다.

변경된 타임스탬프에만 영향을 주는 작업을 수행해 보겠습니다. chmod 명령을 사용하여 실행 파일을 제공합니다. 모든 사용자에 대한 실행 권한:

chmod +x dp
stat dp

그만큼

변경된 타임스탬프만 업데이트되었습니다. 이는 파일 자체가 변경되지 않았기 때문입니다. 액세스하거나 수정하지 않았기 때문입니다. 그러나 파일에 대한 메타데이터가 변경되었습니다.

파일 시스템이 타임스탬프를 업데이트하는 방법

파일 시스템이 마운트되면 해당 파일 시스템이 작동하거나 처리되는 방식을 지정하는 데 사용할 수 있는 옵션이 있습니다. 이들은 부팅 시 읽고 처리되는 /etc/fstab 파일에 저장됩니다. 또한 액세스 타임스탬프를 업데이트하는 데 사용해야 하는 체계를 지정하는 옵션을 설정할 수 있습니다.

다음은 가장 일반적인 옵션 중 일부입니다.

strictatime(strict time): 이 옵션은 파일에 액세스할 때마다 파일의 액세스 타임스탬프를 업데이트합니다. 이 접근 방식에는 오버헤드가 추가되지만 일부 서버는 이 체계의 이점을 얻을 수 있습니다. 데스크탑이나 랩탑 컴퓨터에서는 장점이 거의 없습니다.
noatime(no atime): 이 옵션은 파일 및 디렉토리에 대한 액세스 타임스탬프가 업데이트되지 않도록 완전히 비활성화합니다. 그러나 수정된 ​​타임스탬프는 계속 업데이트됩니다.
nodiratime(no dir atime): 이 옵션은 업데이트할 파일에 대한 액세스 타임스탬프를 활성화하지만 디렉토리에 대해서는 비활성화합니다.
relatime(상대 시간): 이 옵션은 액세스 타임스탬프가 24시간 이상 지난 경우 또는 이전 타임스탬프가 현재 수정 또는 변경된 타임스탬프보다 오래된 경우에만 액세스 타임스탬프를 업데이트합니다. 이렇게 하면 액세스 타임스탬프가 너무 자주 업데이트되거나 전혀 업데이트되지 않는 균형이 잘 맞습니다.

이 컴퓨터의 /etc/fstab 파일을 보고 어떤 옵션이 설정되어 있는지 살펴보겠습니다.

less /etc/fstab

그만큼

/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

항목은 두 개뿐이며 그 중 하나는 무시할 수 있는 스왑 파일입니다. 다른 하나는 파일 시스템( / )의 루트에 마운트되고 설치 당시 장치 /dev/sda1에 있었습니다. 이것이 첫 번째 하드 드라이브의 첫 번째 파티션이며 ext4 파일 시스템이 포함되어 있습니다.

  Linux 터미널을 사용자 정의하는 방법

전달된 유일한 옵션은 errors=remount-ro이며, 이는 운영 체제에 이 파일 시스템을 읽기 및 쓰기 파일 시스템으로 마운트하려고 할 때 오류가 있는 경우 이 파일 시스템을 읽기 전용으로 다시 마운트하도록 지시합니다.

따라서 액세스 타임스탬프가 처리되는 방식에 대한 언급은 없습니다. 더 깊이 파고들어 /proc/mounts가 알려줄 수 있는 것을 확인해보자. /proc/mounts의 출력을 grep을 통해 파이프합니다. 검색 문자열은 “sda”입니다., 하드 드라이브 식별자.

다음을 입력합니다.

cat /proc/mounts | grep "sda"

이제 다음 옵션이 표시됩니다.

rw: 파일 시스템이 읽기 및 쓰기 파일 시스템으로 마운트됩니다.
relatime: 파일 시스템은 “상대 시간” 체계를 사용하여 액세스 타임스탬프를 업데이트합니다.

어디에서 왔습니까? 음, relatime 방식은 다음과 같은 상황에서 사용됩니다.

기본 /etc/fstab 옵션이 사용되는 경우.
relatime /etc/fstab 옵션이 사용되는 경우.
/etc/fstab에서 액세스 타임스탬프 옵션이 사용되지 않고 Linux 커널 2.6.30 이상을 사용하는 경우.

ext4 파일 시스템에 대한 /etc/fstab 항목은 액세스 타임스탬프 업데이트 옵션을 지정하지 않았으므로 Linux는 합리적인 선택을 하고 relatime을 사용했습니다.

타임스탬프가 중요합니다

타임스탬프를 사용하면 파일이 액세스, 수정 또는 변경된 시점을 쉽게 확인할 수 있습니다. 그러나 더 중요한 것은 백업해야 할 파일을 결정하기 위해 소프트웨어를 백업하고 동기화하는 방법을 제공한다는 것입니다.

타임스탬프를 조작하는 기능은 파일 또는 파일 세트를 포함하거나 무시하도록 프로그램을 강제로 설득해야 할 때마다 유용할 것입니다.