Обяснение на времевите марки на файла на Linux: atime, mtime и ctime

Кога „променен“ не означава „променен“? Когато говорим за времеви печати на файлове в Linux. В това ръководство ще обясним как системата ги актуализира и как да ги промените сами.

Разликата между atime, mtime и ctime

Всеки Linux файл има три времеви печати: клеймото за време за достъп (atime), модифицираното времеви печат (mtime) и промененото времеви печат (ctime).

Печатът за време за достъп е последният път, когато файлът е бил прочетен. Това означава, че някой е използвал програма, за да покаже съдържанието на файла или да прочете някои стойности от него. Нищо не е редактирано или добавено към файла. Данните бяха посочени, но непроменени.

Променено времеви печат означава последния път, когато съдържанието на файл е променено. Програма или процес редактира или манипулира файла. „Променено“ означава, че нещо във файла е променено или изтрито, или са добавени нови данни.

Променените времеви печати не се отнасят до промени, направени в съдържанието на файл. По-скоро това е времето, в което са били променени метаданните, свързани с файла. Промените в разрешенията за файл, например, ще актуализират промененото времеви печат.

Стандартната файлова система ext4 Linux също разпределя място за времева марка за създаване на файл във вътрешните си структури на файлова система, но това все още не е внедрено. Понякога това клеймо за време се попълва, но не можете да разчитате на стойностите в него.

Анатомията на времевата марка

Времевите марки на Linux съдържат число, а не дата и час. Това число е броят на секундите след Unix епоха, което беше полунощ (00:00:00) на 1 януари 1970 г., в Координирано универсално време (UTC). Високосните секунди се игнорират в времевите марки на Linux, така че не са аналогични на реално време.

Когато Linux трябва да покаже времева марка, той превежда броя на секундите в дата и час. Това улеснява разбирането на хората. Местоположението и часовата зона, в която компютърът преглежда файла, насочва преобразуването на броя на секундите в дата и час. Освен това гарантира, че месецът е на правилния език.

И така, колко секунди могат да бъдат съхранени в времева марка? Много — 2 147 483 647, за да бъдем точни. Това е голяма цифра, но достатъчно ли е? Ако добавите това към епохата на Unix и след това го преведете в дата и час, ще получите вторник, 19 януари 2038 г., в 03:14:07 ч. Но преди това ще ни трябва различна схема за времеви отпечатъци.

  Как да използвате Pipes в Linux

Преглед на времеви отпечатъци

Когато използвате опцията -l (дълъг списък) с ls, както е показано по-долу, можете да видите модифицираната времева марка:

ls -l dp.c

Ако искате да видите времевата марка за достъп, използвайте опцията -lu (време за достъп) по следния начин:

ls -lu dp.c

И накрая, за да видите времевата марка за промяна, можете да използвате опцията -lc (време за промяна); въведете следното:

ls -lc dp.c

В

Печатите за време по-горе показват, че съдържанието на файла е последно променено на 21 април 2019 г. Достъпът и променените времеви печати са идентични, тъй като файлът е копиран от друг компютър на този на 20 януари 2020 г. и и двете времеви печати са актуализирани по това време.

Да се вижте всички времеви печати едновременно, използвайте командата stat, както следва:

stat dp.c

В

Часовите зони са изброени в долната част на дисплея. Както можете да видите, те имат много точен компонент за частични секунди. В края на всяко времеви печат също виждате -0500 или -0400.

Това са измествания на часовата зона. Файловата система записва времевите марки в UTC и ги преобразува в местната часова зона, когато се показва от stat. Компютърът, който използвахме за изследване на тази статия, е конфигуриран така, сякаш е в зоната на източното стандартно време (EST) на САЩ

Тази часова зона е пет часа след UTC, когато е в сила EST. Въпреки това е четири часа след UTC, когато е в сила източното лятно време (EDT). През април 2019 г., когато модифицираното времеви печат беше променен, EDT беше в сила. Ето защо две от времевите марки имат петчасово изместване, но модифицираното има четиричасово изместване.

Отместванията и часовите зони не се съхраняват никъде. Няма нито inode, нито пространство на файловата система, посветено на съхраняването на тези стойности. Трябва да ги изчислите в движение, като използвате клеймото за време (което винаги е в UTC), местната часова зона на компютъра, показващ файла, и дали е било в сила DST.

Виждате и времева марка „Раждане“, която е запазена за датата на създаване на файла. Това не е реализирано и виждате тире „-“ вместо времева марка.

Промяна на времеви отпечатъци

Ако желаете, можете да промените времевите марки на файл. Можете да използвате командата за докосване, за да промените достъпа или модифицираните времеви печати, или и двете:

touch -a dp.c

За да зададете нов времеви печат за достъп, ще използвате опцията -a (време за достъп). Тази команда задава времевата марка за достъп до текущото време на компютъра:

stat dp.c

В

Времевата марка за достъп се промени, както се очакваше. Въпреки това, промененото времеви печат също беше актуализиран; това е нормално.

  4-те най-добри Github клиента за Linux

За да промените модифицираното времеви печат, можете да използвате опцията -m (променено време):

touch -m dp.c
stat dp.c

В

Този път модифицираните и променените времеви печати бяха актуализирани.

Можете да използвате опцията -d (дата), ако искате да промените едновременно клеймото за достъп и модифицираното време. Можете също така да посочите час и дата – не сте ограничени до промяна на времевите марки към момента.

Ще използваме следната команда, за да зададем клеймите за достъп и модифицираните времеви печати на 10:30:45 на 15 януари 2020 г.:

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

Сега сме задали достъпа и модифицираните времеви печати на дата в миналото. Променената времева марка също беше актуализирана до текущото време на компютъра.

Можете също да използвате опцията -r (референтна), както е показано по-долу, ако искате да зададете клеймите за време на един файл към стойностите на времеви печат на друг:

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

В

И след това се върнахме почти откъдето започнахме, със смесица от времеви печати -0400 и -0500.

Нека направим нещо, което засяга само променената времева марка. Ще използваме командата chmod, за да дадем изпълним файл изпълнява разрешения за всички потребители:

chmod +x dp
stat dp

В

Промененото времеви печат беше единственият, който се актуализира. Това е така, защото самият файл не е променен — нито е бил достъпен, нито е променен. Метаданните за файла обаче бяха променени.

Как файловата система актуализира времеви печати

Когато файлова система е монтирана, има опции, които можете да използвате, за да укажете как тази файлова система трябва да работи или да се третира. Те се съхраняват във файла /etc/fstab, който се чете и обработва при стартиране. Можете също да зададете опции, които да диктуват схемата, която трябва да използват за актуализиране на времевата марка за достъп.

Следните са някои от най-често срещаните опции:

strictatime (строго време): Тази опция актуализира времевата марка за достъп на файловете при всеки достъп до тях. Този подход има допълнителни разходи, но някои сървъри могат да се възползват от тази схема. Той има малко предимства на настолен или преносим компютър.
noatime (без време): Тази опция напълно забранява актуализирането на времевите марки за достъп за файлове и директории. Променените времеви марки обаче все още ще се актуализират.
nodiratitime (без dir atime): Тази опция разрешава времеви печати за достъп за файлове за актуализиране, но я деактивира за директории.
relatime (относително време): Тази опция актуализира времевия печат за достъп само ако е бил на повече от 24 часа или предишният е бил по-стар от текущите модифицирани или променени времеви печати. Това постига добър баланс между времевите марки за достъп, които се актуализират твърде често или изобщо не се актуализират.

  Как да овърклокнете графични карти Nvidia на Linux

Нека да разгледаме файла /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.

Единствената опция, която му се предава, е errors=remount-ro, която казва на операционната система да монтира повторно тази файлова система като само за четене, ако има грешки при опит да я монтира като файлова система за четене и запис.

Така че, не се споменава как ще се обработва клеймото за време за достъп. Нека да копаем по-дълбоко и да проверим какво може да ни каже /proc/mounts. Ще прехвърлим изхода от /proc/mounts през grep. Нашият низ за търсене ще бъде „sda“, идентификаторът на твърдия диск.

Пишем следното:

cat /proc/mounts | grep "sda"

Сега виждаме следните опции:

rw: Файловата система ще бъде монтирана като файлова система за четене и запис.
relatime: Файловата система ще използва схемата „относително време“ за актуализиране на времевите марки за достъп.

откъде дойде това? Е, релативната схема се използва в следните ситуации:

Когато се използва опцията /etc/fstab по подразбиране.
Когато се използва опцията relatime /etc/fstab.
Когато в /etc/fstab не се използват опции за времеви отпечатъци за достъп и използвате ядрото на Linux 2.6.30 или по-нова версия.

Нашият запис /etc/fstab за файловата система ext4 не посочи никакви опции за актуализиране на времеви печати за достъп, така че Linux направи разумния избор и използва relatime.

Времевите марки са важни

Отпечатъците за време ни дават лесен начин да видим кога даден файл е бил достъпен, модифициран или променен. Но по-важното е, че те осигуряват начин за архивиране и синхронизиране на софтуер, за да се определи кои файлове трябва да бъдат архивирани.

Възможността за манипулиране на времеви печати ще се окаже полезна винаги, когато трябва насила да убедите програма да включи или игнорира файл или набор от файлове.