Marcaje temporale ale fișierelor Linux explicate: atime, mtime și ctime

Când „schimbat” nu înseamnă „modificat”? Când vorbim despre marcajele temporale ale fișierelor Linux. În acest ghid, vom explica cum le actualizează sistemul și cum să le modificați singur.

Diferența dintre atime, mtime și ctime

Fiecare fișier Linux are trei marcaje temporale: marcajul de timp de acces (atime), marcajul de timp modificat (mtime) și marcajul de timp modificat (ctime).

Timpul de acces este ultima dată când a fost citit un fișier. Aceasta înseamnă că cineva a folosit un program pentru a afișa conținutul fișierului sau pentru a citi unele valori din acesta. Nimic nu a fost editat sau adăugat la fișier. Datele au fost referite, dar neschimbate.

Un marcaj temporal modificat indică ultima dată când conținutul unui fișier a fost modificat. Un program sau un proces a editat sau a manipulat fișierul. „Modificat” înseamnă că ceva din interiorul fișierului a fost modificat sau șters, sau au fost adăugate date noi.

Marcajele de timp modificate nu se referă la modificările aduse conținutului unui fișier. Mai degrabă, este momentul în care au fost modificate metadatele legate de fișier. Modificările de permisiuni pentru fișiere, de exemplu, vor actualiza marca temporală modificată.

Sistemul de fișiere standard ext4 Linux alocă, de asemenea, spațiu pentru un marcaj temporal de creare a fișierelor în structurile sale interne ale sistemului de fișiere, dar acest lucru nu a fost încă implementat. Uneori, acest marcaj de timp este populat, dar nu puteți depinde de valorile din acesta.

Anatomia unui marcaj de timp

Marcajele de timp Linux conțin un număr mai degrabă decât o dată și oră. Acest număr este numărul de secunde de la Epoca Unix, care era miezul nopții (00:00:00) pe 1 ianuarie 1970, în Ora universală coordonată (UTC). Secundele intermitente sunt ignorate în marcajele de timp Linux, deci nu sunt analoge cu timpul real.

Când Linux trebuie să afișeze un marcaj de timp, acesta traduce numărul de secunde într-o dată și oră. Acest lucru face ca oamenii să înțeleagă mai ușor. Locația și fusul orar în care se află computerul în care se află fișierul ghidează conversia numărului de secunde într-o dată și oră. De asemenea, se asigură că luna este în limba corectă.

Deci, câte secunde pot fi stocate într-un marcaj de timp? O mulțime — 2.147.483.647, mai exact. Este un număr mare, dar este suficient? Dacă adaugi asta la epoca Unix și apoi îl traduci într-o dată și oră, vei primi marți, 19 ianuarie 2038, la 03:14:07 am. Vom avea nevoie de o schemă diferită pentru marcajele de timp înainte, totuși.

  Cum se instalează SABnzbd pe Linux

Vizualizarea marcajelor de timp

Când utilizați opțiunea -l (lista lungă) cu ls, așa cum se arată mai jos, puteți vedea marcajul de timp modificat:

ls -l dp.c

Dacă doriți să vedeți marcajul de timp al accesului, utilizați opțiunea -lu (timpul de acces) astfel:

ls -lu dp.c

Și, în sfârșit, pentru a vedea marcajul de timp al modificării, puteți utiliza opțiunea -lc (modificare timp); tastați următoarele:

ls -lc dp.c

The

Marcajele de timp de mai sus arată că conținutul fișierului a fost modificat ultima dată pe 21 aprilie 2019. Marcajele de timp de acces și modificate sunt identice, deoarece fișierul a fost copiat de pe alt computer pe acesta pe 20 ianuarie 2020, iar ambele marcaje de timp au fost actualizate la acel moment.

La vedeți toate marcajele de timp simultan, utilizați comanda stat după cum urmează:

stat dp.c

The

Fusele orare sunt listate în partea de jos a afișajului. După cum puteți vedea, au o componentă foarte precisă, fracționată de secundă. La sfârșitul fiecărei mărci temporale, vedeți și un -0500 sau -0400 .

Acestea sunt decalaje ale fusului orar. Sistemul de fișiere înregistrează marcajele de timp în UTC și le convertește în fusul orar local atunci când sunt afișate de stat. Computerul pe care l-am folosit pentru a cerceta acest articol este configurat ca și cum s-ar afla în zona Eastern Standard Time (EST) din SUA

Acel fus orar este cu cinci ore în urmă UTC atunci când EST este în vigoare. Cu toate acestea, este cu patru ore în urmă UTC când este în vigoare Ora de vară de Est (EDT). În aprilie 2019, când marca temporală modificată a fost schimbată, EDT era în vigoare. De aceea, două dintre marcajele temporale au o compensare de cinci ore, dar cea modificată are o decalaj de patru ore.

Compensațiile și fusurile orare nu sunt stocate nicăieri. Nu există nici un inod, nici un spațiu de sistem de fișiere dedicat păstrării acestor valori. Trebuie să le calculați din mers folosind marcajul de timp (care este întotdeauna în ora UTC), fusul orar local al computerului care afișează fișierul și dacă DST era în vigoare.

Veți vedea, de asemenea, un marcaj de timp „Naștere”, care este rezervat pentru data creării fișierului. Acest lucru nu este implementat și vedeți o cratimă „-” în loc de un marcaj de timp.

Modificarea marcajelor de timp

Dacă doriți, puteți modifica marcajele de timp ale unui fișier. Puteți utiliza comanda tactilă pentru a schimba marcajele de timp de acces sau modificate, sau amândouă:

touch -a dp.c

Pentru a seta un nou marcaj temporal de acces, ar trebui să utilizați opțiunea -a (timp de acces). Această comandă setează marcajul de timp de acces la ora curentă a computerului:

stat dp.c

The

Timpul de acces s-a schimbat, așa cum era de așteptat. Cu toate acestea, marca temporală modificată a fost actualizată și; asta este normal.

  Cum să găzduiești un server TeamSpeak pe Linux

Pentru a schimba marcajul de timp modificat, puteți utiliza opțiunea -m (ora modificată):

touch -m dp.c
stat dp.c

The

De data aceasta, marcajele temporale modificate și modificate au fost actualizate.

Puteți utiliza opțiunea -d (data) dacă doriți să modificați simultan atât marcajele de acces, cât și marcajele de timp modificate. De asemenea, puteți specifica o oră și o dată – nu sunteți limitat să schimbați marcajele de timp în prezent.

Vom folosi următoarea comandă pentru a seta accesul și marcajele de timp modificate la 10:30:45 pe 15 ianuarie 2020:

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

Acum am setat accesul și am modificat marcajele de timp la o dată din trecut. Marca temporală modificată a fost, de asemenea, actualizată la ora curentă a computerului.

De asemenea, puteți utiliza opțiunea -r (referință), așa cum se arată mai jos, dacă doriți să setați marcajele temporale ale unui fișier la valorile marcajului temporal al altuia:

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

The

Și apoi, ne-am întors aproape de unde am început, cu un amestec de marcaje temporale -0400 și -0500.

Să facem ceva care afectează doar marcajul de timp modificat. Vom folosi comanda chmod pentru a oferi un fișier executabil executa permisiuni pentru toti utilizatorii:

chmod +x dp
stat dp

The

Timpul modificat a fost singurul care a fost actualizat. Acest lucru se datorează faptului că fișierul în sine nu a fost modificat – nu a fost nici accesat, nici modificat. Cu toate acestea, metadatele despre fișier au fost modificate.

Cum actualizează sistemul de fișiere marcajele de timp

Când un sistem de fișiere este montat, există opțiuni pe care le puteți utiliza pentru a specifica modul în care sistemul de fișiere ar trebui să funcționeze sau să fie tratat. Acestea sunt stocate în fișierul /etc/fstab, care este citit și procesat la pornire. De asemenea, puteți seta opțiuni pentru a dicta schema pe care ar trebui să o utilizeze pentru a actualiza marca temporală de acces.

Următoarele sunt câteva dintre cele mai comune opțiuni:

strictatime (strict atime): Această opțiune actualizează marcajul de timp de acces al fișierelor de fiecare dată când sunt accesate. Există o suprasarcină atașată cu această abordare, dar unele servere pot beneficia de această schemă. Are puțin merit pe un computer desktop sau laptop.
noatime (fără atime): Această opțiune dezactivează complet ștampilele temporale de acces pentru fișiere și directoare de la actualizare. Cu toate acestea, marcajele temporale modificate se vor actualiza în continuare.
nodiratime (fără dir atime): Această opțiune permite accesul marcajelor de timp pentru actualizarea fișierelor, dar o dezactivează pentru directoare.
relatime (atime relativă): Această opțiune actualizează marcajul de timp al accesului numai dacă acesta avea mai mult de 24 de ore sau cel anterior era mai vechi decât marcajele temporale actuale modificate sau modificate. Acest lucru atinge un echilibru bun între marcajele de timp de acces care se actualizează prea des sau nu se actualizează deloc.

  Cum să faci un USB Windows de la terminalul Linux

Să ne uităm la fișierul /etc/fstab pentru acest computer și să vedem ce opțiuni sunt setate:

less /etc/fstab

The

Fișierul /etc/fstab este afișat pentru noi, așa cum se arată mai jos.

The

Iată conținutul fișierului fără wrap-around:

# /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

Există doar două intrări, iar una dintre ele este un fișier swap, pe care îl putem ignora. Celălalt este montat la rădăcina sistemului de fișiere ( / ) și se afla pe dispozitivul /dev/sda1 în momentul instalării. Aceasta este prima partiție de pe primul hard disk și se întâmplă să conțină un sistem de fișiere ext4.

Singura opțiune care i-a fost transmisă este errors=remount-ro, care îi spune sistemului de operare să remonteze acest sistem de fișiere ca doar citire dacă există erori atunci când încearcă să-l monteze ca sistem de fișiere de citire și scriere.

Deci, nu se menționează cum va fi gestionată marcajul de timp al accesului. Să cercetăm mai profund și să vedem ce ne poate spune /proc/mounts. Vom canaliza ieșirea din /proc/mounts prin grep. Șirul nostru de căutare va fi „sda”, identificatorul hard diskului.

Introducem următoarele:

cat /proc/mounts | grep "sda"

Acum vedem următoarele opțiuni:

rw: Sistemul de fișiere va fi montat ca sistem de fișiere de citire și scriere.
relatime: sistemul de fișiere va folosi schema „relative atime” pentru a actualiza marcajele de timp de acces.

De unde a venit asta? Ei bine, schema relatime este utilizată în următoarele situații:

Când este utilizată opțiunea implicită /etc/fstab.
Când se utilizează opțiunea relatime /etc/fstab.
Când nu sunt utilizate opțiuni de marcare temporală a accesului în /etc/fstab și utilizați kernelul Linux 2.6.30 sau mai nou.

Intrarea noastră /etc/fstab pentru sistemul de fișiere ext4 nu a specificat nicio opțiune de actualizare a marcajului de timp de acces, așa că Linux a făcut alegerea rațională și a folosit relatime.

Marcajele de timp sunt importante

Marcajele temporale ne oferă o modalitate simplă de a vedea când un fișier a fost accesat, modificat sau schimbat. Dar, mai important, ele oferă o modalitate de a face copii de rezervă și de a sincroniza software-ul pentru a determina ce fișiere trebuie să facă backup.

Capacitatea de a manipula marcajele de timp se va dovedi utilă ori de câte ori trebuie să convingeți forțat un program să includă sau să ignore un fișier sau un set de fișiere.