Linux-filens tidsstämplar förklaras: atime, mtime och ctime

När betyder inte ”ändrad” ”modifierad”? När vi pratar om Linux-filtidsstämplar. I den här guiden kommer vi att förklara hur systemet uppdaterar dem och hur du själv ändrar dem.

Skillnaden mellan atime, mtime och ctime

Varje Linux-fil har tre tidsstämplar: åtkomsttidsstämpeln (atime), den modifierade tidsstämpeln (mtime) och den ändrade tidsstämpeln (ctime).

Åtkomsttidsstämpeln är sista gången en fil lästes. Det betyder att någon använde ett program för att visa innehållet i filen eller läsa några värden från den. Ingenting har redigerats eller lagts till i filen. Uppgifterna refererades men oförändrade.

En modifierad tidsstämpel anger sista gången innehållet i en fil ändrades. Ett program eller en process antingen redigerade eller manipulerade filen. ”Ändrad” betyder att något i filen har ändrats eller raderats, eller ny data har lagts till.

Ändrade tidsstämplar hänvisar inte till ändringar som gjorts i innehållet i en fil. Det är snarare tidpunkten då metadata relaterade till filen ändrades. Ändringar av filbehörighet kommer till exempel att uppdatera den ändrade tidsstämpeln.

Standardfilsystemet ext4 Linux allokerar också utrymme för en tidsstämpel för filskapande i dess interna filsystemstrukturer, men detta har inte implementerats ännu. Ibland är denna tidsstämpel ifylld, men du kan inte lita på värdena i den.

Tidsstämpelns anatomi

Linux-tidsstämplar innehåller ett nummer snarare än ett datum och tid. Detta nummer är antalet sekunder sedan Unix-epoksom var midnatt (00:00:00) den 1 januari 1970, i Coordinated Universal Time (UTC). Språngsekunder ignoreras i Linux-tidsstämplar, så de är inte analoga med realtid.

När Linux behöver visa en tidsstämpel översätter det antalet sekunder till ett datum och en tid. Detta gör det lättare för människor att förstå. Platsen och tidszonen som datorn som tittar på filen befinner sig i vägleder konverteringen av antalet sekunder till ett datum och en tid. Det säkerställer också att månaden är på rätt språk.

Så, hur många sekunder kan lagras i en tidsstämpel? Mycket — 2 147 483 647, för att vara exakt. Det är en stor siffra, men räcker det? Om du lägger till det i Unix-epoken och sedan översätter det till ett datum och en tid får du tisdagen den 19 januari 2038, kl. 03:14:07. Vi behöver dock ett annat schema för tidsstämplar innan dess.

Visa tidsstämplar

När du använder alternativet -l (lång lista) med ls, som visas nedan, du kan se den ändrade tidsstämpeln:

ls -l dp.c

Om du vill se åtkomsttidsstämpeln, använd alternativet -lu (åtkomsttid) så här:

ls -lu dp.c

Och slutligen, för att se förändringens tidsstämpel, kan du använda alternativet -lc (ändra tid); skriv följande:

ls -lc dp.c

De

Tidsstämplarna ovan visar att filens innehåll senast ändrades den 21 april 2019. Åtkomsten och ändrade tidsstämplar är identiska eftersom filen kopierades från en annan dator till denna den 20 januari 2020, och båda tidsstämplarna uppdaterades vid den tiden.

Till se alla tidsstämplar samtidigtanvänd kommandot stat enligt följande:

stat dp.c

De

Tidszonerna listas längst ner på displayen. Som du kan se har de en mycket exakt, bråkdelssekunderskomponent. I slutet av varje tidsstämpel ser du också en -0500 eller -0400.

Dessa är tidszonförskjutningar. Filsystemet registrerar tidsstämplarna i UTC och konverterar dem till den lokala tidszonen när de visas av stat. Datorn vi använde för att undersöka den här artikeln är konfigurerad som om den var i zonen Eastern Standard Time (EST) i USA

Den tidszonen är fem timmar efter UTC när EST är i kraft. Det är dock fyra timmar efter UTC när Eastern Daylight Time (EDT) är i kraft. I april 2019, när den ändrade tidsstämpeln ändrades, var EDT i kraft. Det är därför två av tidsstämplarna har en fem timmars offset, men den modifierade har en fyra timmars offset.

Offset och tidszoner lagras inte någonstans. Det finns varken en inod eller ett filsystemsutrymme som ägnas åt att hålla dessa värden. Du måste beräkna dessa i farten med hjälp av tidsstämpeln (som alltid är i UTC-tid), den lokala tidszonen för datorn som visar filen och om sommartid var i kraft.

Du ser också en ”födelse” tidsstämpel, som är reserverad för skapandet av filen. Detta är inte implementerat, och du ser ett bindestreck ”-” istället för en tidsstämpel.

Ändra tidsstämplar

Om du vill kan du ändra tidsstämplarna på en fil. Du kan använda pekkommandot för att ändra åtkomst eller ändrade tidsstämplar, eller båda:

touch -a dp.c

För att ställa in en ny åtkomsttidsstämpel använder du alternativet -a (åtkomsttid). Detta kommando ställer in åtkomsttidsstämpeln till datorns aktuella tid:

stat dp.c

De

Åtkomsttidsstämpeln ändrades som förväntat. Den ändrade tidsstämpeln uppdaterades dock också; det här är normalt.

För att ändra den modifierade tidsstämpeln kan du använda alternativet -m (modifierad tid):

touch -m dp.c
stat dp.c

De

Den här gången uppdaterades de ändrade och ändrade tidsstämplarna.

Du kan använda alternativet -d (datum) om du vill ändra både åtkomst och modifierade tidsstämplar samtidigt. Du kan också ange en tid och ett datum – du är inte begränsad till att ändra tidsstämplarna till nutid.

Vi använder följande kommando för att ställa in åtkomst och ändrade tidsstämplar till 10:30:45 den 15 januari 2020:

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

Vi har nu ställt in åtkomst och ändrade tidsstämplar till ett datum i det förflutna. Den ändrade tidsstämpeln uppdaterades också till datorns aktuella tid.

Du kan också använda alternativet -r (referens), som visas nedan, om du vill ställa in tidsstämplarna för en fil till tidsstämpelvärdena för en annan:

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

De

Och då är vi i stort sett tillbaka där vi började, med en blandning av -0400 och -0500 tidsstämplar.

Låt oss göra något som bara påverkar den ändrade tidsstämpeln. Vi använder kommandot chmod för att ge en körbar fil exekvera behörigheter för alla användare:

chmod +x dp
stat dp

De

Den ändrade tidsstämpeln var den enda som uppdaterades. Detta beror på att filen i sig inte ändrades – den var varken åtkomlig eller modifierad. Men metadata om filen ändrades.

Hur filsystemet uppdaterar tidsstämplar

När ett filsystem är monterat finns det alternativ som du kan använda för att specificera hur det filsystemet ska fungera eller behandlas. Dessa lagras i filen /etc/fstab, som läses och bearbetas vid uppstart. Du kan också ställa in alternativ för att diktera schemat de ska använda för att uppdatera åtkomsttidsstämpeln.

Följande är några av de vanligaste alternativen:

strictatime (strictatime): Det här alternativet uppdaterar åtkomsttidsstämpeln för filer varje gång de öppnas. Det finns en overhead kopplad till detta tillvägagångssätt, men vissa servrar kan dra nytta av detta schema. Det har liten förtjänst på en stationär eller bärbar dator.
noatime (ingen tid): Det här alternativet inaktiverar helt åtkomsttidsstämplarna för filer och kataloger från att uppdateras. De ändrade tidsstämplarna kommer dock fortfarande att uppdateras.
nodiratime (ingen dir atime): Det här alternativet möjliggör åtkomsttidsstämplar för filer att uppdatera, men inaktiverar det för kataloger.
relatime (relativ tid): Det här alternativet uppdaterar åtkomsttidsstämpeln endast om den var mer än 24 timmar gammal, eller om den föregående var äldre än de nuvarande ändrade eller ändrade tidsstämplarna. Detta ger en bra balans mellan åtkomsttidsstämplar som uppdateras för ofta eller inte uppdateras alls.

Låt oss titta på filen /etc/fstab för den här datorn och se vilka alternativ som är inställda:

less /etc/fstab

De

/etc/fstab-filen visas för oss, som visas nedan.

De

Här är innehållet i filen utan omslutningen:

# /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 finns bara två poster, och en av dem är en swap-fil, som vi kan ignorera. Den andra monteras i roten av filsystemet ( / ) och fanns på enheten /dev/sda1 vid installationstillfället. Det är den första partitionen på den första hårddisken, och den råkar innehålla ett ext4-filsystem.

Det enda alternativet som skickas till den är errors=remount-ro, som säger åt operativsystemet att montera om detta filsystem som skrivskyddat om det finns fel när man försöker montera det som ett läs- och skrivfilsystem.

Så det nämns inget om hur åtkomsttidsstämpeln kommer att hanteras. Låt oss gräva djupare och kolla in vad /proc/mounts kan berätta för oss. Vi skickar utdata från /proc/mounts genom grep. Vår söksträng kommer att vara ”sda”hårddiskens identifierare.

Vi skriver följande:

cat /proc/mounts | grep "sda"

Nu ser vi följande alternativ:

rw: Filsystemet kommer att monteras som ett läs- och skrivfilsystem.
relatime: Filsystemet kommer att använda schemat ”relativ tid” för att uppdatera åtkomsttidsstämplarna.

Var kom det där ifrån? Tja, relatime-schemat används i följande situationer:

När standardalternativet /etc/fstab används.
När alternativet relatime /etc/fstab används.
När inga alternativ för åtkomsttidsstämpel används i /etc/fstab och du använder Linux-kärnan 2.6.30 eller senare.

Vår /etc/fstab-post för ext4-filsystemet angav inga uppdateringsalternativ för åtkomsttidsstämpel, så Linux gjorde det förnuftiga valet och använde relatid.

Tidsstämplar är viktiga

Tidsstämplar ger oss ett enkelt sätt att se när en fil öppnades, ändrades eller ändrades. Men ännu viktigare, de ger ett sätt att säkerhetskopiera och synkronisera programvara för att avgöra vilka filer som behöver säkerhetskopieras.

Möjligheten att manipulera tidsstämplar kommer att visa sig användbar närhelst du behöver tvinga ett program att inkludera eller ignorera en fil eller en uppsättning filer.