Spiegazione dei timestamp dei file Linux: atime, mtime e ctime

Quando “cambiato” non significa “modificato”? Quando parliamo di timestamp dei file Linux. In questa guida spiegheremo come il sistema li aggiorna e come modificarli da solo.

La differenza tra atime, mtime e ctime

Ogni file Linux ne ha tre timestamp: il timestamp di accesso (atime), il timestamp modificato (mtime) e il timestamp modificato (ctime).

Il timestamp di accesso è l’ultima volta che un file è stato letto. Ciò significa che qualcuno ha utilizzato un programma per visualizzare il contenuto del file o leggere alcuni valori da esso. Niente è stato modificato o aggiunto al file. I dati sono stati referenziati ma invariati.

Un timestamp modificato indica l’ultima volta che il contenuto di un file è stato modificato. Un programma o un processo ha modificato o manipolato il file. “Modificato” significa che qualcosa all’interno del file è stato modificato o eliminato oppure sono stati aggiunti nuovi dati.

I timestamp modificati non si riferiscono alle modifiche apportate al contenuto di un file. Piuttosto, è il momento in cui i metadati relativi al file sono stati modificati. Le modifiche alle autorizzazioni dei file, ad esempio, aggiorneranno il timestamp modificato.

Il file system standard ext4 Linux alloca anche lo spazio per un timestamp di creazione del file nelle sue strutture di file system interne, ma questo non è stato ancora implementato. A volte, questo timestamp viene popolato, ma non puoi dipendere dai valori in esso contenuti.

L’anatomia di un timestamp

I timestamp di Linux contengono un numero anziché una data e un’ora. Questo numero è il numero di secondi trascorsi dal Epoca Unix, che era la mezzanotte (00:00:00) del 1 gennaio 1970, in Tempo coordinato universale (UTC). I secondi intercalari vengono ignorati nei timestamp di Linux, quindi non sono analoghi al tempo reale.

Quando Linux ha bisogno di visualizzare un timestamp, traduce il numero di secondi in una data e ora. Questo rende più facile la comprensione per gli esseri umani. La posizione e il fuso orario in cui si trova il computer che visualizza il file guida la conversione del numero di secondi in data e ora. Inoltre, garantisce che il mese sia nella lingua corretta.

Quindi, quanti secondi possono essere memorizzati in un timestamp? Molto — 2.147.483.647, per essere precisi. È un numero elevato, ma è sufficiente? Se lo aggiungi all’epoca Unix e poi lo traduci in una data e ora, ottieni martedì 19 gennaio 2038, alle 03:14:07. Avremo bisogno di uno schema diverso per i timestamp prima di allora, però.

Visualizzazione dei timestamp

Quando utilizzi l’opzione -l (elenco lungo) con ls, come mostrato di seguito, puoi vedere il timestamp modificato:

ls -l dp.c

Se vuoi vedere il timestamp di accesso, usa l’opzione -lu (orario di accesso) in questo modo:

ls -lu dp.c

Infine, per vedere il timestamp della modifica, puoi utilizzare l’opzione -lc (change time); digitare quanto segue:

ls -lc dp.c

Il

I timestamp sopra mostrano che il contenuto del file è stato modificato l’ultima volta il 21 aprile 2019. L’accesso e i timestamp modificati sono identici perché il file è stato copiato da un altro computer a questo il 20 gennaio 2020 ed entrambi i timestamp sono stati aggiornati in quel momento.

Per vedere tutti i timestamp contemporaneamente, usa il comando stat come segue:

stat dp.c

Il

I fusi orari sono elencati nella parte inferiore del display. Come puoi vedere, hanno una componente frazionaria dei secondi molto precisa. Alla fine di ogni timestamp, vedi anche -0500 o -0400.

Questi sono offset di fuso orario. Il file system registra i timestamp in UTC e li converte nel fuso orario locale quando viene visualizzato da stat. Il computer utilizzato per la ricerca in questo articolo è configurato come se fosse nella zona EST (Eastern Standard Time) degli Stati Uniti

Quel fuso orario è di cinque ore indietro rispetto all’UTC quando è in vigore l’EST. Tuttavia, sono quattro ore indietro rispetto a UTC quando è in vigore Eastern Daylight Time (EDT). Nell’aprile 2019, quando il timestamp modificato è stato modificato, EDT era in vigore. Ecco perché due dei timestamp hanno uno scostamento di cinque ore, ma quello modificato ha uno scostamento di quattro ore.

Gli offset e i fusi orari non vengono memorizzati da nessuna parte. Non c’è né un inode né uno spazio del file system dedicato a mantenere questi valori. Devi calcolarli al volo utilizzando il timestamp (che è sempre in ora UTC), il fuso orario locale del computer che visualizza il file e se l’ora legale era in vigore.

Viene inoltre visualizzato un timestamp “Nascita”, riservato alla data di creazione del file. Questo non è implementato e viene visualizzato un trattino “-” invece di un timestamp.

Modifica dei timestamp

Se lo desideri, puoi modificare i timestamp su un file. È possibile utilizzare il comando touch per modificare l’accesso o i timestamp modificati, o entrambi:

touch -a dp.c

Per impostare un nuovo timestamp di accesso, dovresti utilizzare l’opzione -a (orario di accesso). Questo comando imposta il timestamp di accesso sull’ora corrente del computer:

stat dp.c

Il

Il timestamp di accesso è cambiato, come previsto. Tuttavia, anche il timestamp modificato è stato aggiornato; E ‘normale.

Per cambiare il timestamp modificato, puoi utilizzare l’opzione -m (ora modificata):

touch -m dp.c
stat dp.c

Il

Questa volta, i timestamp modificati e modificati sono stati aggiornati.

È possibile utilizzare l’opzione -d (data) se si desidera modificare contemporaneamente sia l’accesso che i timestamp modificati. Puoi anche specificare un’ora e una data: non sei limitato a cambiare i timestamp al presente.

Useremo il seguente comando per impostare l’accesso e i timestamp modificati alle 10:30:45 del 15 gennaio 2020:

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

Il

Ora abbiamo impostato l’accesso e i timestamp modificati su una data nel passato. Anche il timestamp modificato è stato aggiornato all’ora corrente del computer.

Puoi anche utilizzare l’opzione -r (riferimento), come mostrato di seguito, se desideri impostare i timestamp di un file sui valori di timestamp di un altro:

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

Il

E poi, siamo praticamente tornati al punto di partenza, con una combinazione di timestamp -0400 e -0500.

Facciamo qualcosa che influisca solo sul timestamp modificato. Useremo il comando chmod per fornire un file eseguibile eseguire i permessi per tutti gli utenti:

chmod +x dp
stat dp

Il

Il timestamp modificato è stato l’unico ad essere aggiornato. Questo perché il file stesso non è stato modificato, non è stato né letta né modificata. Tuttavia, i metadati sul file sono stati modificati.

Modalità di aggiornamento dei timestamp del file system

Quando un file system è montato, ci sono opzioni che puoi usare per specificare come quel file system dovrebbe funzionare o essere trattato. Questi vengono memorizzati nel file / etc / fstab, che viene letto ed elaborato al momento dell’avvio. Puoi anche impostare le opzioni per dettare lo schema che dovrebbero utilizzare per aggiornare il timestamp di accesso.

Le seguenti sono alcune delle opzioni più comuni:

strictatime (strict atime): questa opzione aggiorna il timestamp di accesso dei file ogni volta che vi si accede. C’è un sovraccarico associato a questo approccio, ma alcuni server possono trarre vantaggio da questo schema. Ha poco merito su un computer desktop o laptop.
noatime (no atime): questa opzione disabilita completamente l’aggiornamento dei timestamp di accesso per file e directory. I timestamp modificati, tuttavia, verranno comunque aggiornati.
nodiratime (no dir atime): questa opzione abilita i timestamp di accesso per i file da aggiornare, ma la disabilita per le directory.
relatime (relative atime): questa opzione aggiorna il timestamp di accesso solo se era più vecchio di 24 ore o se il precedente era più vecchio dei timestamp modificati o modificati correnti. Ciò rappresenta un buon equilibrio tra i timestamp di accesso che si aggiornano troppo frequentemente o non si aggiornano affatto.

Diamo un’occhiata al file / etc / fstab per questo computer e vediamo quali opzioni sono impostate:

less /etc/fstab

Il

Il file / etc / fstab viene visualizzato per noi, come mostrato di seguito.

Il

Ecco il contenuto del file senza il wrap-around:

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

Ci sono solo due voci e una di queste è un file di scambio, che possiamo ignorare. L’altro viene montato alla radice del filesystem (/) ed era sul dispositivo / dev / sda1 al momento dell’installazione. Questa è la prima partizione sul primo disco rigido e sembra contenere un file system ext4.

L’unica opzione passata è errors = remount-ro, che dice al sistema operativo di rimontare questo file system come di sola lettura se ci sono errori quando si tenta di montarlo come file system di lettura e scrittura.

Quindi, non si fa menzione di come verrà gestito il timestamp di accesso. Scaviamo più a fondo e controlliamo cosa può dirci / proc / mounts. Metteremo in pipe l’output da / proc / mounts attraverso grep. La nostra stringa di ricerca sarà “sda”, l’identificatore del disco rigido.

Digitiamo quanto segue:

cat /proc/mounts | grep "sda"

Il

Ora vediamo le seguenti opzioni:

rw: il file system verrà montato come file system di lettura e scrittura.
relatime: il file system utilizzerà lo schema “relative atime” per aggiornare i timestamp di accesso.

Da dove viene? Ebbene, lo schema relatime viene utilizzato nelle seguenti situazioni:

Quando viene utilizzata l’opzione di default / etc / fstab.
Quando viene utilizzata l’opzione relatime / etc / fstab.
Quando non vengono utilizzate opzioni di timestamp di accesso in / etc / fstab e stai usando il kernel Linux 2.6.30 o più recente.

La nostra voce / etc / fstab per il file system ext4 non specificava alcuna opzione di aggiornamento del timestamp di accesso, quindi Linux ha fatto la scelta sensata e ha usato relatime.

I timestamp sono importanti

I timestamp ci offrono un modo semplice per vedere quando un file è stato eseguito, modificato o cambiato. Ma, cosa più importante, forniscono un modo per eseguire il backup e sincronizzare il software per determinare quali file devono essere sottoposti a backup.

La capacità di manipolare i timestamp si rivelerà utile ogni volta che è necessario convincere con la forza un programma a includere o ignorare un file o un insieme di file.