Објашњене временске ознаке Линук датотеке: атиме, мтиме и цтиме

Како то да „промењено“ не значи увек „измењено“? Одговор се крије у начину на који Линукс систем рукује временским ознакама датотека. У овом чланку ћемо разјаснити како се ове ознаке ажурирају и како их можете сами мењати.

Разлика између атиме, мтиме и цтиме

Свака датотека у Линук систему има три временске ознаке: ознаку последњег приступа (access time – атиме), ознаку последње измене (modification time – мтиме) и ознаку последње промене статуса (change time – цтиме).

Атиме бележи време када је датотека последњи пут прочитана. Ово се дешава када програм приступи садржају датотеке, било да је у питању њено приказивање или читање вредности из ње. Важно је напоменути да се датотека у овом случају не мења, већ се само приступа њеним подацима.

Мтиме бележи време када је садржај датотеке последњи пут измењен. То значи да је програм или процес вршио измене или манипулације над датотеком. „Измењено“ овде подразумева да је нешто у датотеци додато, обрисано или промењено.

Цтиме, с друге стране, не бележи промене садржаја датотеке, већ време када су промењени метаподаци повезани с њом. На пример, промена дозвола приступа датотеци довешће до ажурирања цтиме ознаке.

Стандардни ект4 систем датотека у Линук-у такође има резервисано место за временску ознаку креирања датотеке, али ова функција још увек није у потпуности имплементирана. Иако се понекад ова ознака попуни, не треба се ослањати на њену тачност.

Детаљније о временским ознакама

Линукс временске ознаке не представљају директно датум и време, већ број секунди протеклих од Уник епохе, која је почела 1. јануара 1970. године у 00:00:00 Координисаног универзалног времена (УТЦ). Преступне секунде се не узимају у обзир, што значи да ове ознаке не представљају „право“ време.

Када Линукс систем приказује временску ознаку, он претвара овај број секунди у разумљив датум и време. Локација и временска зона рачунара који приступа датотеци су кључни за ову конверзију. Такође, систем се стара да се месец прикаже на исправном језику.

Колики број секунди може да се сачува у временској ознаци? Много – тачно 2.147.483.647. Иако је то велики број, није неограничен. Када се овај број дода Уник епохи и претвори у датум и време, добијамо уторак, 19. јануар 2038. године у 03:14:07 ујутру. Због тога је неопходна другачија шема за будуће временске ознаке.

Како прегледати временске ознаке

Команда `ls -l` приказује измењену временску ознаку (мтиме). Пример:

ls -l dp.c

Да бисте видели атиме, користите опцију `-lu`:

ls -lu dp.c

За приказ цтиме користите опцију `-lc`:

ls -lc dp.c

Приказане ознаке показују да је садржај датотеке последњи пут измењен 21. априла 2019. Атиме и мтиме су идентичне јер је датотека копирана са другог рачунара 20. јануара 2020, када су обе ознаке ажуриране.

Команда `stat` приказује све три ознаке одједном:

stat dp.c

Временске зоне су наведене на дну екрана. Ознаке имају изузетно прецизну компоненту у делићима секунде. На крају сваке ознаке се такође види `-0500` или `-0400`, што представља одступање временске зоне.

Систем датотека бележи временске ознаке у УТЦ-у, а затим их конвертује у локалну временску зону када их приказује команда `stat`. Рачунар коришћен за истраживање овог чланка је био подешен на Источно стандардно време (ЕСТ), које је пет сати иза УТЦ-а. Међутим, када је на снази Источно летње време (ЕДТ), временска разлика је четири сата. У априлу 2019, када је измењена временска ознака (мтиме), ЕДТ је био на снази, што објашњава разлику у временским помацима.

Помаци и временске зоне се не чувају директно. Не постоји простор у иноде-у или систему датотека који је посвећен чувању ових вредности. Они се израчунавају на основу временске ознаке (увек у УТЦ-у), локалне временске зоне и тога да ли је летње време било активно у време приказа.

Такође се приказује и „Birth“ ознака, резервисана за датум креирања датотеке, али је још увек неимплементирана.

Промена временских ознака

Временске ознаке датотеке могу се мењати. Команда `touch` се користи за измене атиме и мтиме:

touch -a dp.c

Опција `-a` се користи за постављање атиме на тренутно време:

stat dp.c

Као што се очекивало, атиме је промењен. Међутим, и цтиме је ажуриран, што је нормално.

За промену мтиме користи се опција `-m`:

touch -m dp.c
stat dp.c

Овога пута, атиме и мтиме су ажурирани.

Опција `-d` омогућава промену атиме и мтиме на одређени датум и време:

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` (без времена): Потпуно онемогућава ажурирање атиме за датотеке и директоријуме. Мтиме ће се и даље ажурирати.
`nodiratime` (без дир атиме): Омогућава ажурирање атиме за датотеке, али не и за директоријуме.
`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

Постоје два уноса, од којих је један swap датотека. Други се монтира на коренски систем датотека (/) и био је на уређају `/dev/sda1` у време инсталације. То је прва партиција првог чврстог диска и садржи ект4 систем датотека.

Опција `errors=remount-ro` говори оперативном систему да поново монтира систем датотека као „само за читање“ у случају грешке. Не помиње се како ће се третирати атиме.

Погледајмо шта `/proc/mounts` може да нам каже. Користићемо `grep` за претрагу низа „sda“, који је идентификатор чврстог диска:

cat /proc/mounts | grep "sda"

Добијамо следеће опције:

`rw`: Систем датотека је монтиран у режиму за читање и писање.
`relatime`: Систем датотека користи „релативну“ шему за ажурирање атиме.

Одакле је то дошло? Релативна шема се користи у следећим случајевима:

Када се користи подразумевана опција у `/etc/fstab`.
Када се у `/etc/fstab` користи опција `relatime`.
Када се не користе опције за атиме у `/etc/fstab`, а користи се Линукс кернел 2.6.30 или новији.

Пошто унос у `/etc/fstab` за ект4 систем датотека не наводи никакву опцију за ажурирање атиме, Линукс је изабрао `relatime` као разуман избор.

Значај временских ознака

Временске ознаке омогућавају једноставан преглед времена приступа, измене и промене датотека. Што је још важније, оне су од кључног значаја за софтвер за прављење резервних копија и синхронизацију, који на основу њих одређује које датотеке треба обрадити.

Могућност манипулације временским ознакама је корисна када је потребно убедити програм да укључи или игнорише одређене датотеке.