Linux-fil tidsstempler forklaret: atime, mtime og ctime

Hvornår betyder “ændret” ikke “ændret”? Når vi taler om Linux-filtidsstempler. I denne vejledning forklarer vi, hvordan systemet opdaterer dem, og hvordan du selv ændrer dem.

Forskellen mellem atime, mtime og ctime

Hver Linux-fil har tre tidsstempler: adgangstidsstemplet (atime), det ændrede tidsstempel (mtime) og det ændrede tidsstempel (ctime).

Adgangstidsstemplet er sidste gang en fil blev læst. Det betyder, at nogen brugte et program til at vise indholdet af filen eller læse nogle værdier fra den. Intet blev redigeret eller tilføjet til filen. Dataene blev refereret, men uændrede.

Et ændret tidsstempel angiver sidste gang, indholdet af en fil blev ændret. Et program eller en proces enten redigerede eller manipulerede filen. “Ændret” betyder, at noget i filen blev ændret eller slettet, eller nye data blev tilføjet.

Ændrede tidsstempler refererer ikke til ændringer foretaget i indholdet af en fil. Det er snarere det tidspunkt, hvor metadataene relateret til filen blev ændret. Ændringer i filtilladelser vil f.eks. opdatere det ændrede tidsstempel.

Standard ext4 Linux-filsystemet tildeler også plads til et filoprettelsestidsstempel i dets interne filsystemstrukturer, men dette er ikke blevet implementeret endnu. Nogle gange er dette tidsstempel udfyldt, men du kan ikke stole på værdierne i det.

Et tidsstempels anatomi

Linux-tidsstempler indeholder et tal i stedet for en dato og et klokkeslæt. Dette tal er antallet af sekunder siden Unix epoke, som var midnat (00:00:00) den 1. januar 1970, i Koordineret universaltid (UTC). Springsekunder ignoreres i Linux-tidsstempler, så de er ikke analoge med realtid.

Når Linux skal vise et tidsstempel, omsætter det antallet af sekunder til en dato og et klokkeslæt. Dette gør det lettere for mennesker at forstå. Placeringen og tidszonen, som computeren, der ser filen, befinder sig i, guider konverteringen af ​​antallet af sekunder til en dato og et klokkeslæt. Det sikrer også, at måneden er på det korrekte sprog.

Så hvor mange sekunder kan der gemmes i et tidsstempel? En masse – 2.147.483.647, for at være præcis. Det er et stort tal, men er det nok? Hvis du føjer det til Unix-epoken og derefter oversætter det til en dato og et klokkeslæt, får du tirsdag den 19. januar 2038 kl. 03:14:07. Vi har dog brug for et andet skema for tidsstempler inden da.

  Sådan repareres en Linux-pc, der ikke starter

Visning af tidsstempler

Når du bruger muligheden -l (lang liste) med ls, som vist nedenfor, du kan se det ændrede tidsstempel:

ls -l dp.c

Hvis du vil se adgangstidsstemplet, skal du bruge -lu (adgangstid) muligheden sådan:

ls -lu dp.c

Og endelig, for at se ændringstidsstemplet, kan du bruge -lc (ændre tid) mulighed; skriv følgende:

ls -lc dp.c

Det

Tidsstemplerne ovenfor viser, at filens indhold sidst blev ændret den 21. april 2019. Adgangen og de ændrede tidsstempler er identiske, fordi filen blev kopieret fra en anden computer til denne den 20. januar 2020, og begge tidsstempler blev opdateret på det tidspunkt.

Til se alle tidsstempler samtidigt, brug stat-kommandoen som følger:

stat dp.c

Det

Tidszonerne er vist nederst på displayet. Som du kan se, har de en meget nøjagtig, brøkdele sekunders komponent. I slutningen af ​​hvert tidsstempel ser du også en -0500 eller -0400.

Disse er tidszoneforskydninger. Filsystemet registrerer tidsstemplerne i UTC og konverterer dem til den lokale tidszone, når de vises med stat. Computeren, vi brugte til at undersøge denne artikel, er konfigureret, som om den var i Eastern Standard Time (EST) zone i USA

Denne tidszone er fem timer efter UTC, når EST er i kraft. Det er dog fire timer efter UTC, når Eastern Daylight Time (EDT) er i kraft. I april 2019, da det ændrede tidsstempel blev ændret, var EDT i kraft. Derfor har to af tidsstemplerne en fem-timers offset, men den modificerede har en fire-timers offset.

Forskydninger og tidszoner er ikke gemt nogen steder. Der er hverken en inode eller en filsystemplads dedikeret til at holde disse værdier. Du skal beregne disse på farten ved hjælp af tidsstemplet (som altid er i UTC-tid), den lokale tidszone på den computer, der viser filen, og om sommertid var i kraft.

Du ser også et “Fødselstidsstempel”, som er reserveret til oprettelsesdatoen for filen. Dette er ikke implementeret, og du ser en bindestreg “-” i stedet for et tidsstempel.

Ændring af tidsstempler

Hvis du vil, kan du ændre tidsstemplerne på en fil. Du kan bruge berøringskommandoen til at ændre adgangen eller ændrede tidsstempler, eller begge:

touch -a dp.c

For at indstille et nyt adgangstidsstempel, skal du bruge muligheden -a (adgangstid). Denne kommando indstiller adgangstidsstemplet til computerens aktuelle tid:

stat dp.c

Det

Adgangstidsstemplet ændrede sig som forventet. Det ændrede tidsstempel blev dog også opdateret; dette er normalt.

  Sådan bruges xargs-kommandoen på Linux

For at ændre det ændrede tidsstempel kan du bruge muligheden -m (modificeret tid):

touch -m dp.c
stat dp.c

Det

Denne gang blev de ændrede og ændrede tidsstempler opdateret.

Du kan bruge -d (dato), hvis du vil ændre både adgangs- og ændrede tidsstempler samtidigt. Du kan også angive et klokkeslæt og en dato – du er ikke begrænset til at ændre tidsstemplerne til nutiden.

Vi bruger følgende kommando til at indstille adgangen og de ændrede tidsstempler til 10:30:45 den 15. januar 2020:

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

Vi har nu indstillet adgangen og ændret tidsstempler til en dato i fortiden. Det ændrede tidsstempel blev også opdateret til det aktuelle tidspunkt på computeren.

Du kan også bruge indstillingen -r (reference), som vist nedenfor, hvis du ønsker at indstille tidsstempler for en fil til tidsstempler for en anden:

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

Det

Og så er vi stort set tilbage, hvor vi startede, med en blanding af -0400 og -0500 tidsstempler.

Lad os gøre noget, der kun påvirker det ændrede tidsstempel. Vi bruger chmod-kommandoen til at give en eksekverbar fil eksekvere tilladelser for alle brugere:

chmod +x dp
stat dp

Det

Det ændrede tidsstempel var det eneste, der blev opdateret. Dette skyldes, at selve filen ikke blev ændret – den blev hverken tilgået eller ændret. Men metadataene om filen blev ændret.

Hvordan filsystemet opdaterer tidsstempler

Når et filsystem er monteret, er der muligheder, du kan bruge til at specificere, hvordan dette filsystem skal fungere eller behandles. Disse er gemt i filen /etc/fstab, som læses og behandles ved opstart. Du kan også indstille indstillinger for at diktere det skema, de skal bruge til at opdatere adgangstidsstemplet.

Følgende er nogle af de mest almindelige muligheder:

strictatime (strictatime): Denne mulighed opdaterer adgangstidsstemplet for filer, hver gang de tilgås. Der er en overhead forbundet med denne tilgang, men nogle servere kan drage fordel af denne ordning. Det har ringe værdi på en stationær eller bærbar computer.
noatime (ingen tid): Denne mulighed deaktiverer fuldstændig opdatering af adgangstidsstempler for filer og mapper. De ændrede tidsstempler vil dog stadig opdateres.
nodiratime (ingen dir atime): Denne mulighed aktiverer adgangstidsstempler for filer at opdatere, men deaktiverer den for mapper.
relatime (relativ tid): Denne mulighed opdaterer kun adgangstidsstemplet, hvis det var mere end 24 timer gammelt, eller det forrige var ældre end de aktuelle ændrede eller ændrede tidsstempler. Dette skaber en god balance mellem adgangstidsstempler, der opdateres for ofte eller slet ikke opdateres.

  Sådan opdateres Telegram Linux desktop-appen

Lad os se på filen /etc/fstab for denne computer og se, hvilke indstillinger der er indstillet:

less /etc/fstab

Det

/etc/fstab-filen vises for os, som vist nedenfor.

Det

Her er indholdet af filen uden omslaget:

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

Der er kun to poster, og en af ​​dem er en swap-fil, som vi kan ignorere. Den anden bliver monteret i roden af ​​filsystemet ( / ) og var på enheden /dev/sda1 på installationstidspunktet. Det er den første partition på den første harddisk, og den indeholder tilfældigvis et ext4-filsystem.

Den eneste mulighed, der sendes til det, er errors=remount-ro, som fortæller operativsystemet at genmontere dette filsystem som skrivebeskyttet, hvis der er fejl, når det forsøges at montere det som et læse- og skrivefilsystem.

Så der er ingen omtale af, hvordan adgangstidsstemplet vil blive håndteret. Lad os grave dybere og se, hvad /proc/mounts kan fortælle os. Vi sender outputtet fra /proc/mounts gennem grep. Vores søgestreng vil være “sda”, harddisk-id’en.

Vi skriver følgende:

cat /proc/mounts | grep "sda"

Nu ser vi følgende muligheder:

rw: Filsystemet vil blive monteret som et læse- og skrivefilsystem.
relatime: Filsystemet vil bruge “relativ tid”-skemaet til at opdatere adgangstidsstemplerne.

Hvor kom det fra? Nå, relatime-ordningen bruges i følgende situationer:

Når standardindstillingerne /etc/fstab bruges.
Når relatime /etc/fstab-indstillingen bruges.
Når der ikke bruges adgangstidsstempelindstillinger i /etc/fstab, og du bruger Linux-kerne 2.6.30 eller nyere.

Vores /etc/fstab-indgang for ext4-filsystemet specificerede ikke nogen adgangstidsstempelopdateringsindstillinger, så Linux tog det fornuftige valg og brugte relatime.

Tidsstempler er vigtige

Tidsstempler giver os en nem måde at se, hvornår en fil blev åbnet, ændret eller ændret. Men endnu vigtigere, de giver en måde at sikkerhedskopiere og synkronisere software for at bestemme, hvilke filer der skal sikkerhedskopieres.

Evnen til at manipulere tidsstempler vil vise sig nyttig, når du har brug for at tvinge et program til at inkludere eller ignorere en fil eller et sæt filer.