Când spunem „schimbat”, dar de fapt nu ne referim la „modificat”? Răspunsul se află în marcajele temporale ale fișierelor Linux. Acest ghid va explora modul în care sistemul le actualizează și cum le poți modifica și tu.
Diferențierea între atime, mtime și ctime
Fiecare fișier Linux deține trei marcaje temporale: timpul de ultim acces (atime), timpul ultimei modificări (mtime) și timpul ultimei schimbări de stare (ctime).
Timpul de acces (atime) indică momentul în care fișierul a fost citit ultima dată. Asta înseamnă că un program a deschis fișierul pentru a vizualiza conținutul sau a accesa anumite valori. Datele au fost consultate, dar nu s-au produs modificări.
Un marcaj temporal de modificare (mtime) semnalează ultima dată când conținutul unui fișier a fost alterat. Un program sau proces a editat, modificat sau adăugat date noi în fișier. „Modificat” înseamnă că s-a intervenit asupra conținutului prin adăugare, eliminare sau modificare.
Marcajele de timp de schimbare (ctime) nu se referă la conținutul fișierului. Ele marchează momentele când au fost modificate metadatele asociate fișierului, cum ar fi permisiunile. Modificarea permisiunilor unui fișier va actualiza, de exemplu, marca temporală ctime.
Sistemul de fișiere ext4 standard Linux rezervă spațiu pentru un marcaj temporal de creare a fișierului, dar acesta nu este încă implementat pe deplin. Deși uneori acest marcaj poate fi populat, nu te poți baza pe valorile afișate.
Anatomia unui marcaj temporal
În loc de o dată și o oră, marcajele temporale Linux conțin un număr. Acesta reprezintă numărul de secunde scurse de la Epoca Unix, adică de la miezul nopții (00:00:00) din 1 ianuarie 1970, în Timpul Universal Coordonat (UTC). Fracțiunile de secundă nu sunt relevante pentru marcajele temporale Linux.
Când Linux afișează un marcaj temporal, transformă numărul de secunde într-o dată și o oră ușor de interpretat. Această conversie ține cont de locația și fusul orar al computerului unde se află fișierul, asigurând afișarea corectă a datei și orei și a limbii lunii.
Cât de multe secunde pot fi stocate într-un marcaj temporal? Foarte multe – mai exact, 2.147.483.647. Pare mult, dar este suficient? Dacă adaugi acest număr la Epoca Unix și îl convertești, obții marți, 19 ianuarie 2038, ora 03:14:07. Așadar, va fi nevoie de o schemă diferită pentru marcajele temporale viitoare.
Vizualizarea marcajelor temporale
Folosind opțiunea -l
(listă detaliată) cu comanda ls
, vei vedea timpul ultimei modificări (mtime):
ls -l dp.c
Pentru a vedea timpul de acces (atime), folosește opțiunea -lu
:
ls -lu dp.c
Pentru a vizualiza timpul de modificare (ctime), folosește opțiunea -lc
:
ls -lc dp.c
Marcajele temporale de mai sus indică faptul că fișierul a fost modificat ultima dată pe 21 aprilie 2019. Timpii de acces și modificare sunt identici deoarece fișierul a fost copiat de pe un alt computer pe 20 ianuarie 2020, actualizând ambele marcaje temporale.
Pentru a vizualiza toate marcajele temporale simultan, folosește comanda stat
:
stat dp.c
Fusurile orare sunt indicate în partea de jos a rezultatului. Acestea includ o componentă precisă, fracționată de secundă. La finalul fiecărui marcaj temporal, se observă o valoare de tip -0500
sau -0400
.
Acestea sunt decalajele de fus orar. Sistemul de fișiere înregistrează marcajele temporale în UTC și le transformă în fusul orar local la afișarea cu stat
. Calculatorul folosit pentru redactarea acestui articol este configurat pentru fusul orar Eastern Standard Time (EST) din SUA.
EST este cu cinci ore în urma UTC în timpul iernii. În timpul verii, ora de vară (EDT) este cu patru ore în urmă UTC. În aprilie 2019, când a fost modificat marcajul temporal mtime, EDT era în vigoare. De aceea, unele marcaje au o compensare de cinci ore, iar mtime are o compensare de patru ore.
Compensările și fusurile orare nu sunt stocate fizic în sistem. Ele sunt calculate dinamic, folosind marcajul temporal (care este mereu în UTC), fusul orar al computerului care afișează fișierul și informații despre ora de vară.
Veți observa, de asemenea, un marcaj temporal „Naștere”, rezervat pentru data creării fișierului. Acesta nu este încă implementat, fiind afișat un caracter minus -
în loc de marcajul temporal.
Modificarea marcajelor temporale
Poți modifica marcajele temporale ale unui fișier folosind comanda touch
. Aceasta poate schimba timpii de acces sau de modificare, sau ambele:
touch -a dp.c
Opțiunea -a
(timp de acces) stabilește un nou marcaj temporal de acces, setându-l la ora curentă a computerului:
stat dp.c
Timpul de acces a fost actualizat, dar, în mod normal, timpul de modificare a fost actualizat și el.
Pentru a modifica timpul de modificare (mtime), folosește opțiunea -m
(ora modificată):
touch -m dp.c
stat dp.c
De această dată, ambele marcaje, cel de modificare și cel de schimbare, au fost actualizate.
Poți utiliza opțiunea -d
(data) pentru a modifica simultan atât timpii de acces, cât și cei de modificare. Aceasta îți permite să specifici o oră și o dată particulară, nu doar ora curentă.
Pentru a seta timpii de acces și de modificare la 10:30:45 pe 15 ianuarie 2020, folosește comanda:
touch -d "2020-01-15 10:30:45" dp.c
stat dp.c
Acum am setat timpii de acces și modificare la o dată din trecut. Timpul de schimbare a fost actualizat la ora curentă a sistemului.
Opțiunea -r
(referință) permite setarea marcajelor temporale ale unui fișier la valorile unui alt fișier:
touch dp.c -r dice_words.sl3
stat dp.c
În acest fel, ne-am întors aproape de punctul de pornire, cu un amestec de marcaje temporale de tip -0400
și -0500
.
Să efectuăm o acțiune care afectează doar marcajul temporal de modificare (ctime). Vom folosi comanda chmod
pentru a acorda permisiuni de execuție pentru toți utilizatorii:
chmod +x dp
stat dp
Doar timpul de schimbare a fost actualizat. Aceasta se întâmplă deoarece fișierul în sine nu a fost modificat, accesat sau editat. Doar metadatele despre fișier au fost alterate.
Modul în care sistemul de fișiere actualizează marcajele temporale
La montarea unui sistem de fișiere, se pot specifica opțiuni pentru a controla modul în care sistemul de fișiere ar trebui să funcționeze. Aceste opțiuni sunt stocate în fișierul /etc/fstab
, care este citit la pornire. De asemenea, poți configura schemele de actualizare a marcajelor temporale de acces.
Câteva opțiuni comune sunt:
strictatime
: Actualizează timpul de acces de fiecare dată când un fișier este accesat. Deși această abordare presupune o suprasarcină, unele servere o pot utiliza cu succes. Nu este foarte utilă pentru desktop-uri sau laptop-uri.noatime
: Dezactivează complet actualizarea timpilor de acces pentru fișiere și directoare. Totuși, timpii de modificare se vor actualiza în continuare.nodiratime
: Actualizează timpii de acces pentru fișiere, dar îi dezactivează pentru directoare.relatime
: Actualizează timpul de acces doar dacă acesta are o vechime de peste 24 de ore sau dacă este mai vechi decât timpii de modificare și schimbare actuali. Această abordare oferă un echilibru între actualizarea prea frecventă a timpului de acces și lipsa actualizării.
Să consultăm fișierul /etc/fstab
al acestui computer pentru a vedea ce opțiuni sunt setate:
less /etc/fstab
Fișierul /etc/fstab
afișat:
Conținutul fișierului:
# /etc/fstab: informații statice despre sistemul de fișiere. # # Folosiți 'blkid' pentru a afișa identificatorul unic universal pentru un # dispozitiv; acesta poate fi folosit cu UUID= ca o modalitate mai robustă de a denumi dispozitivele # care funcționează chiar dacă discurile sunt adăugate și eliminate. Consultați fstab(5). # ## / a fost pe /dev/sda1 în timpul instalării UUID=4a143d08-8695-475b-8243-b13b56050fc2 / ext4 errors=remount-ro 0 1 /swapfile none swap sw 0 0
Există doar două intrări, una dintre ele fiind un fișier swap, pe care o putem ignora. Cealaltă este montată la rădăcina sistemului de fișiere (/
) și se afla pe dispozitivul /dev/sda1
la instalare. Aceasta este prima partiție a primului hard disk și conține un sistem de fișiere ext4.
Singura opțiune specificată este errors=remount-ro
, care îi spune sistemului de operare să remonteze sistemul de fișiere ca fiind doar citire dacă apar erori la montare ca sistem de fișiere de citire și scriere.
Prin urmare, nu se menționează modul de gestionare a timpului de acces. Pentru a aprofunda, vom verifica fișierul /proc/mounts
. Vom canaliza ieșirea din /proc/mounts
prin comanda grep
. Șirul nostru de căutare va fi „sda”, identificatorul hard disk-ului.
Introducem următoarea comandă:
cat /proc/mounts | grep "sda"
Acum vedem următoarele opțiuni:
rw
: Sistemul de fișiere va fi montat ca sistem de citire și scriere.relatime
: Sistemul de fișiere va folosi schema „relative atime” pentru actualizarea timpilor de acces.
De unde a apărut aceasta? Ei bine, schema relatime
este folosită în următoarele situații:
- Când se folosește opțiunea implicită în
/etc/fstab
. - Când se folosește explicit opțiunea
relatime
în/etc/fstab
. - Când nu sunt specificate opțiuni pentru marcarea temporală a accesului în
/etc/fstab
și se folosește kernel-ul Linux 2.6.30 sau o versiune mai nouă.
În cazul nostru, intrarea din /etc/fstab
pentru sistemul de fișiere ext4 nu a specificat nicio opțiune pentru actualizarea timpului de acces, deci Linux a ales relatime
.
Importanța marcajelor temporale
Marcajele temporale ne oferă un mod simplu de a vedea când un fișier a fost accesat, modificat sau schimbat. Mai important, ele oferă o metodă utilă pentru programele de backup și sincronizare pentru a determina ce fișiere trebuie să fie incluse în backup.
Posibilitatea de a manipula marcajele temporale se va dovedi utilă atunci când trebuie să forțezi un program să includă sau să ignore un anumit fișier sau grup de fișiere.