Hva betyr det når «endret» ikke er det samme som «endret»? Dette spørsmålet dukker opp når vi diskuterer Linux-filers tidsstempler. I denne artikkelen skal vi se nærmere på hvordan disse tidsstemplene oppdateres av systemet, og hvordan du selv kan endre dem.
Forskjellen mellom atime, mtime og ctime
I Linux har hver fil tre distinkte tidsstempler: atime (access time, tilgangstid), mtime (modification time, endringstid) og ctime (change time, statusendringstid).
Tilgangstidstemplet, eller atime, angir tidspunktet da filen sist ble lest. Det betyr at et program har lest innholdet i filen eller hentet ut data fra den. Selve filen er uendret, bare dataene er referert.
Endringstidstemplet, mtime, viser når filens innhold sist ble endret. Dette kan skje når et program redigerer, manipulerer eller legger til ny data i filen. «Endret» betyr her at noe i filen er lagt til, fjernet eller endret.
Statusendringstidstemplet, ctime, viser derimot ikke endringer i filinnhold, men når metadataene knyttet til filen ble endret. Endringer i filrettigheter er et eksempel på en hendelse som oppdaterer ctime.
Standard ext4-filsystemet i Linux reserverer også plass for et filopprettelsestidsstempel i sine interne strukturer, men denne funksjonen er ennå ikke fullstendig implementert. Det kan forekomme verdier i dette stempelet, men de er ikke alltid pålitelige.
Tidsstempelstruktur
I stedet for en tradisjonell dato og klokkeslett, lagrer Linux-tidsstempler et tall. Dette tallet representerer antall sekunder som har gått siden Unix-epoken, som startet ved midnatt (00:00:00) 1. januar 1970 i Koordinert Universell Tid (UTC). Merk at sprangsekunder ikke tas med i betraktning, så det er ikke en direkte korrelasjon med den faktiske tiden.
Når Linux presenterer et tidsstempel, konverteres dette sekundantallet til en dato og klokkeslett, noe som gjør det lettere for mennesker å forstå. Datamaskinens plassering og tidssone er avgjørende for å konvertere sekundene til et lettleselig format, og sikrer at månedene vises på riktig språk.
Hvor mange sekunder kan et tidsstempel inneholde? Svaret er 2 147 483 647. Dette er et betydelig tall, men det er ikke uendelig. Omregnet til dato og klokkeslett, tilsvarer dette tirsdag 19. januar 2038 kl. 03:14:07. Vi trenger dermed en ny løsning for tidsstempler før dette punktet.
Visning av tidsstempler
Ved bruk av ls-kommandoen med -l (lang liste) vises endringstidstempelet, som vist nedenfor:
ls -l filnavn.txt
For å se tilgangstidstemplet, bruk alternativet -lu (tilgangstid) slik:
ls -lu filnavn.txt
For å vise statusendringstidstemplet, bruk alternativet -lc (endringstid):
ls -lc filnavn.txt
Tidsstemplene over viser at filens innhold sist ble endret 21. april 2019. Tilgangs- og endringstidsstemplene er identiske fordi filen ble kopiert fra en annen datamaskin 20. januar 2020, og begge stemplene ble oppdatert samtidig.
For å se alle tidsstempler samtidig, bruk stat-kommandoen slik:
stat filnavn.txt
Nederst på skjermen vises tidssonene. Som du kan se, har de en svært nøyaktig komponent med brøkdeler av sekunder. I tillegg ser du en -0500 eller -0400 på slutten av hvert tidsstempel.
Dette er tidssoneforskyvninger. Filsystemet lagrer tidsstemplene i UTC og konverterer dem til lokal tidssone når stat viser dem. Datamaskinen som ble brukt til denne artikkelen er konfigurert til Eastern Standard Time (EST) i USA.
Denne tidssonen er fem timer bak UTC når EST er i kraft. Den er derimot fire timer bak UTC når Eastern Daylight Time (EDT) er i kraft. I april 2019, da endringstidstempelet ble endret, var EDT i kraft. Det forklarer hvorfor to av tidsstemplene har en fem timers forskyvning, mens endringstidstempelet har en fire timers forskyvning.
Forskyvningene og tidssonene lagres ikke noe sted. Det finnes verken en inode eller en filsystemplass som holder disse verdiene. De må beregnes fortløpende ved hjelp av tidsstempelet (som alltid er i UTC-tid), datamaskinens lokale tidssone og hvorvidt sommertid er i kraft.
Du vil også se et «fødselstidstempel», som er reservert for filens opprettelsesdato. Dette er ikke implementert, og en bindestrek («-») vises i stedet for et tidsstempel.
Endring av tidsstempler
Det er mulig å endre tidsstemplene til en fil. Touch-kommandoen kan endre tilgangs- og endringstidsstempler, eller begge:
touch -a filnavn.txt
For å sette et nytt tidsstempel for tilgang, bruker du alternativet -a (tilgangstid). Denne kommandoen setter tilgangstidstemplet til datamaskinens nåværende tid:
stat filnavn.txt
Tilgangstidstemplet er endret som forventet. Det endrede tidsstemplet ble også oppdatert, noe som er normalt.
For å endre det endrede tidsstemplet, bruk alternativet -m (endret tid):
touch -m filnavn.txt
stat filnavn.txt
Denne gangen ble både de endrede og statusendringstidsstemplene oppdatert.
Du kan bruke alternativet -d (dato) hvis du vil endre både tilgangs- og endringstidsstemplene samtidig. Du kan også oppgi et klokkeslett og en dato – du er ikke begrenset til å endre tidsstemplene til nåværende tid.
Følgende kommando setter tilgangs- og endringstidstemplene til 10:30:45 den 15. januar 2020:
touch -d "2020-01-15 10:30:45" filnavn.txt
stat filnavn.txt
Vi har nå satt tilgangs- og endringstidsstemplene til en dato i fortiden. Statusendringstidstemplet ble imidlertid også oppdatert til datamaskinens gjeldende tid.
Alternativet -r (referanse) kan brukes til å sette en fils tidsstempelverdier til de samme som en annen fil:
touch filnavn.txt -r annenfil.txt
stat filnavn.txt
Dette setter oss tilbake til utgangspunktet med en blanding av -0400 og -0500 tidsstempler.
La oss gjøre noe som kun påvirker statusendringstidstemplet. Vi bruker chmod-kommandoen for å gi en fil utførelsestillatelse for alle brukere:
chmod +x filnavn
stat filnavn
Kun statusendringstidstemplet ble oppdatert. Dette er fordi selve filen ikke ble endret, hverken åpnet eller redigert. Derimot ble metadataene endret.
Hvordan filsystemet oppdaterer tidsstempler
Når et filsystem monteres, kan du bruke alternativer som angir hvordan filsystemet skal oppføre seg. Disse er lagret i /etc/fstab, som leses og behandles ved oppstart. Du kan også angi alternativer for hvordan tilgangstidstemplet skal oppdateres.
Her er noen av de vanligste alternativene:
- strictatime: Dette alternativet oppdaterer filenes tilgangstidstempel hver gang de åpnes. Det kan være en ulempe med tanke på ressurser, men noen servere kan dra nytte av denne ordningen. Det har derimot liten nytte for stasjonære og bærbare datamaskiner.
- noatime: Dette alternativet deaktiverer all oppdatering av filers og katalogers tilgangstidstempler. Endringstidstemplene vil derimot fortsatt oppdateres.
- nodiratime: Dette alternativet tillater oppdatering av filers tilgangstidstempler, men ikke katalogenes.
- relatime: Dette alternativet oppdaterer tilgangstidstempelet kun hvis det er mer enn 24 timer gammelt, eller hvis det forrige er eldre enn det gjeldende endrings- eller statusendringstidstempelet. Dette gir en god balanse mellom hyppige og manglende oppdateringer av tilgangstidstemplene.
La oss se på /etc/fstab-filen for denne datamaskinen og se hvilke alternativer som er satt:
less /etc/fstab
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). # # <file system> <mount point> <type> <options> <dump> <pass> # / 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 kun to oppføringer, hvorav den ene er en byttefil. Den andre er montert i roten av filsystemet ( / ) og befant seg på enheten /dev/sda1 ved installasjon. Dette er den første partisjonen på den første harddisken, og den inneholder et ext4-filsystem.
Det eneste alternativet som benyttes er errors=remount-ro, som instruerer operativsystemet om å remontere dette filsystemet som skrivebeskyttet hvis det oppstår feil under forsøk på å montere det som et lese- og skrivefilsystem.
Det er dermed ingen spesifikk informasjon om hvordan tilgangstidstemplet skal håndteres. La oss grave dypere og se hva /proc/mounts kan fortelle oss. Vi sender utdataene fra /proc/mounts gjennom grep. Søkestrengen vår er «sda», som identifiserer harddisken.
Vi skriver følgende:
cat /proc/mounts | grep "sda"
Nå ser vi følgende alternativer:
- rw: Filsystemet monteres som et lese- og skrivefilsystem.
- relatime: Filsystemet vil bruke «relativ tid»-skjemaet for å oppdatere tilgangstidstemplene.
Hvor kommer relatime fra? Jo, relatime brukes i følgende situasjoner:
- Når standardalternativet /etc/fstab brukes.
- Når alternativet relatime brukes i /etc/fstab.
- Når ingen alternativer for tilgangstidstempler brukes i /etc/fstab, og du bruker Linux-kjerne 2.6.30 eller nyere.
Vår /etc/fstab-oppføring for ext4-filsystemet angav ingen oppdateringsalternativer for tilgangstidstempelet, dermed tok Linux det fornuftige valget og brukte relatime.
Viktigheten av tidsstempler
Tidsstempler gir en enkel måte å se når en fil ble åpnet, endret eller endret status. De er også viktige for sikkerhetskopiering og synkronisering av programvare, da de hjelper med å bestemme hvilke filer som skal sikkerhetskopieres.
Muligheten til å manipulere tidsstempler kan være nyttig når du trenger å tvinge et program til å inkludere eller ignorere en fil eller en gruppe filer.