Linux-filtidsstempler forklart: atime, mtime og ctime

Når betyr ikke «endret» «endret»? Når vi snakker om Linux-filtidsstempler. I denne veiledningen vil vi forklare hvordan systemet oppdaterer dem, og hvordan du endrer dem selv.

Forskjellen mellom atime, mtime og ctime

Hver Linux-fil har tre tidsstempler: tilgangstidstemplet (atime), det modifiserte tidsstempelet (mtime) og det endrede tidsstempelet (ctime).

Tilgangstidsstemplet er siste gang en fil ble lest. Dette betyr at noen brukte et program for å vise innholdet i filen eller lese noen verdier fra den. Ingenting ble redigert eller lagt til filen. Dataene ble referert, men uendret.

Et modifisert tidsstempel angir forrige gang innholdet i en fil ble endret. Et program eller en prosess enten redigerte eller manipulerte filen. «Endret» betyr at noe i filen ble endret eller slettet, eller nye data ble lagt til.

Endrede tidsstempler refererer ikke til endringer som er gjort i innholdet i en fil. Det er snarere tidspunktet da metadataene knyttet til filen ble endret. Endringer i filtillatelsen vil for eksempel oppdatere det endrede tidsstemplet.

Standard ext4 Linux-filsystemet tildeler også plass for et tidsstempel for filoppretting i sine interne filsystemstrukturer, men dette har ikke blitt implementert ennå. Noen ganger er dette tidsstemplet fylt ut, men du kan ikke stole på verdiene i det.

Anatomien til et tidsstempel

Linux-tidsstempler inneholder et tall i stedet for en dato og klokkeslett. Dette tallet er antall sekunder siden Unix-epokesom var midnatt (00:00:00) 1. januar 1970, i Coordinated Universal Time (UTC). Sprangsekunder ignoreres i Linux-tidsstempler, så de er ikke analoge med sanntid.

Når Linux trenger å vise et tidsstempel, oversetter det antall sekunder til en dato og et klokkeslett. Dette gjør det lettere for mennesker å forstå. Plasseringen og tidssonen datamaskinen som ser på filen befinner seg i, veileder konverteringen av antall sekunder til en dato og et klokkeslett. Det sikrer også at måneden er på riktig språk.

Så, hvor mange sekunder kan lagres i et tidsstempel? Mye – 2.147.483.647, for å være presis. Det er et stort tall, men er det nok? Hvis du legger det til i Unix-epoken, og deretter oversetter det til en dato og et klokkeslett, får du tirsdag 19. januar 2038 kl. 03:14:07. Vi trenger imidlertid et annet skjema for tidsstempler før da.

  Hvordan spille GreedFall på Linux

Viser tidsstempler

Når du bruker alternativet -l (lang liste) med ls, som vist nedenfor, du kan se det endrede tidsstemplet:

ls -l dp.c

Hvis du vil se tilgangstidstemplet, bruk -lu (tilgangstid)-alternativet slik:

ls -lu dp.c

Og til slutt, for å se endringstidsstempelet, kan du bruke alternativet -lc (endre tid); skriv inn følgende:

ls -lc dp.c

De

Tidsstemplene ovenfor viser at filens innhold sist ble endret 21. april 2019. Tilgang og endrede tidsstempler er identiske fordi filen ble kopiert fra en annen datamaskin til denne 20. januar 2020, og begge tidsstemplene ble oppdatert på det tidspunktet.

Til se alle tidsstempler samtidigbruk stat-kommandoen som følger:

stat dp.c

De

Tidssonene vises nederst på skjermen. Som du kan se, har de en veldig nøyaktig, brøkdelssekunderskomponent. På slutten av hvert tidsstempel ser du også en -0500 eller -0400.

Dette er tidssoneforskyvninger. Filsystemet registrerer tidsstemplene i UTC og konverterer dem til den lokale tidssonen når de vises av stat. Datamaskinen vi brukte til å undersøke denne artikkelen er konfigurert som om den var i Eastern Standard Time (EST) sonen i USA

Den tidssonen er fem timer bak UTC når EST er i kraft. Det er imidlertid fire timer bak UTC når Eastern Daylight Time (EDT) er i kraft. I april 2019, da det endrede tidsstemplet ble endret, var EDT i kraft. Det er derfor to av tidsstemplene har en femtimers offset, men den modifiserte har en firetimers offset.

Forskyvningene og tidssonene lagres ikke noe sted. Det er verken en inode eller en filsystemplass viet til å holde disse verdiene. Du må beregne disse på flukt ved å bruke tidsstemplet (som alltid er i UTC-tid), den lokale tidssonen til datamaskinen som viser filen, og om sommertid var i kraft.

Du ser også et «Fødselstidsstempel», som er reservert for opprettelsesdatoen for filen. Dette er ikke implementert, og du ser en bindestrek «-» i stedet for et tidsstempel.

Endre tidsstempler

Hvis du vil, kan du endre tidsstemplene på en fil. Du kan bruke berøringskommandoen til å endre tilgang eller endrede tidsstempler, eller begge:

touch -a dp.c

For å sette et nytt tidsstempel for tilgang, bruker du alternativet -a (tilgangstid). Denne kommandoen setter tilgangstidsstemplet til datamaskinens gjeldende tid:

stat dp.c

De

Tilgangstidsstemplet ble endret, som forventet. Det endrede tidsstempelet ble imidlertid også oppdatert; dette er normalt.

  Hvordan installere Sublime Merge på Linux

For å endre det modifiserte tidsstemplet kan du bruke alternativet -m (modifisert tid):

touch -m dp.c
stat dp.c

De

Denne gangen ble de endrede og endrede tidsstemplene oppdatert.

Du kan bruke alternativet -d (dato) hvis du vil endre både tilgang og endrede tidsstempler samtidig. Du kan også spesifisere et klokkeslett og en dato – du er ikke begrenset til å endre tidsstemplene til nåtiden.

Vi bruker følgende kommando for å sette tilgang og endrede tidsstempler til 10:30:45 15. januar 2020:

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

Vi har nå satt tilgang og endrede tidsstempler til en dato i fortiden. Det endrede tidsstemplet ble også oppdatert til gjeldende tid på datamaskinen.

Du kan også bruke alternativet -r (referanse), som vist nedenfor, hvis du vil sette tidsstemplene til en fil til tidsstempelverdiene til en annen:

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

De

Og så er vi ganske mye tilbake der vi startet, med en blanding av -0400 og -0500 tidsstempler.

La oss gjøre noe som bare påvirker det endrede tidsstemplet. Vi bruker chmod-kommandoen for å gi en kjørbar fil utføre tillatelser for alle brukere:

chmod +x dp
stat dp

De

Det endrede tidsstempelet var det eneste som ble oppdatert. Dette er fordi selve filen ikke ble endret – den ble verken åpnet eller endret. Metadataene om filen ble imidlertid endret.

Hvordan filsystemet oppdaterer tidsstempler

Når et filsystem er montert, er det alternativer du kan bruke til å spesifisere hvordan det filsystemet skal fungere eller behandles. Disse lagres i filen /etc/fstab, som leses og behandles ved oppstart. Du kan også angi alternativer for å diktere skjemaet de skal bruke for å oppdatere tilgangstidstemplet.

Følgende er noen av de vanligste alternativene:

strictatime (strictatime): Dette alternativet oppdaterer tilgangstidsstemplet til filene hver gang de åpnes. Det er en overhead knyttet til denne tilnærmingen, men noen servere kan dra nytte av denne ordningen. Den har liten fortjeneste på en stasjonær eller bærbar datamaskin.
noatime (ingen tid): Dette alternativet deaktiverer fullstendig tilgangstidstemplene for filer og kataloger fra å oppdateres. De endrede tidsstemplene vil imidlertid fortsatt oppdateres.
nodiratime (ingen dir atime): Dette alternativet aktiverer tilgangstidsstempler for filer som skal oppdateres, men deaktiverer det for kataloger.
relatime (relativ tid): Dette alternativet oppdaterer tilgangstidstemplet bare hvis det var mer enn 24 timer gammelt, eller det forrige var eldre enn gjeldende modifiserte eller endrede tidsstempler. Dette gir en god balanse mellom tilgangstidstempler som oppdateres for ofte eller ikke oppdateres i det hele tatt.

  Hvordan bruke på og batch på Linux for å planlegge kommandoer

La oss se på /etc/fstab-filen for denne datamaskinen og se hvilke alternativer som er satt:

less /etc/fstab

De

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

De

Her er innholdet i filen uten 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

Det er bare to oppføringer, og en av dem er en byttefil, som vi kan ignorere. Den andre blir montert i roten av filsystemet ( / ) og var på enheten /dev/sda1 på installasjonstidspunktet. Det er den første partisjonen på den første harddisken, og den inneholder tilfeldigvis et ext4-filsystem.

Det eneste alternativet som sendes til den er errors=remount-ro, som forteller operativsystemet å remontere dette filsystemet som skrivebeskyttet hvis det oppstår feil når du prøver å montere det som et lese- og skrivefilsystem.

Så det er ingen omtale av hvordan tilgangstidsstemplet vil bli håndtert. La oss grave dypere og sjekke ut hva /proc/mounts kan fortelle oss. Vi sender utdataene fra /proc/mounts gjennom grep. Vår søkestreng vil være «sda»harddiskidentifikatoren.

Vi skriver følgende:

cat /proc/mounts | grep "sda"

Nå ser vi følgende alternativer:

rw: Filsystemet vil bli montert som et lese- og skrivefilsystem.
relatime: Filsystemet vil bruke «relativ tid»-skjemaet for å oppdatere tilgangstidstemplene.

Hvor kom det fra? Vel, relatime-ordningen brukes i følgende situasjoner:

Når standardalternativet /etc/fstab brukes.
Når alternativet relatime /etc/fstab brukes.
Når ingen alternativer for tilgangstidsstempel brukes i /etc/fstab, og du bruker Linux-kjerne 2.6.30 eller nyere.

Vår /etc/fstab-oppføring for ext4-filsystemet spesifiserte ingen oppdateringsalternativer for tilgangstidsstempel, så Linux tok det fornuftige valget og brukte relatime.

Tidsstempler er viktige

Tidsstempler gir oss en enkel måte å se når en fil ble åpnet, endret eller endret. Men enda viktigere, de gir en måte å sikkerhetskopiere og synkronisere programvare for å finne ut hvilke filer som må sikkerhetskopieres.

Evnen til å manipulere tidsstempler vil vise seg nyttig når du trenger å tvinge et program til å inkludere eller ignorere en fil eller et sett med filer.