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 soli.
Ogni file Linux 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. Nulla è 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 o che 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 spazio per un timestamp di creazione 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 dall’epoca Unix , che era la mezzanotte (00:00:00) del 1 gennaio 1970, in Coordinated Universal Time (UTC) . I secondi intercalari vengono ignorati nei timestamp di Linux, quindi non sono analoghi al tempo reale.
Quando Linux deve visualizzare un timestamp, traduce il numero di secondi in una data e un’ora. Questo rende più facile la comprensione per gli 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. Assicura inoltre che il mese sia nella lingua corretta.
Quindi, quanti secondi possono essere memorizzati in un timestamp? Molto—2.147.483.647, per la precisione. È un numero grande, ma è abbastanza? Se lo aggiungi all’epoca Unix e poi lo traduci in una data e un’ora, ottieni martedì 19 gennaio 2038, alle 03:14:07. Avremo bisogno di uno schema diverso per i timestamp prima di allora.
Visualizzazione dei timestamp
Quando utilizzi l’ -l
opzione (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’ -lu
opzione (orario di accesso) in questo modo:
ls -lu dp.c
E infine, per vedere il cambio di data e ora, puoi usare l’ -lc
opzione (cambia ora); digitare quanto segue:
ls -lc dp.c
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 stat
comando come segue:
stat dp.c
I fusi orari sono elencati nella parte inferiore del display. Come puoi vedere, hanno una componente di secondi frazionaria molto accurata. Alla fine di ogni timestamp, vedi anche un -0500
o -0400
.
Queste sono le differenze 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 che abbiamo utilizzato per la ricerca di questo articolo è configurato come se si trovasse nella zona dell’Eastern Standard Time (EST) degli Stati Uniti
Quel fuso orario è cinque ore indietro rispetto all’UTC quando è in vigore l’EST. Tuttavia, è quattro ore indietro rispetto all’UTC quando è in vigore l’Eastern Daylight Time (EDT). Nell’aprile 2019, quando il timestamp modificato è stato modificato, l’EDT era in vigore. Ecco perché due dei timestamp hanno un offset di cinque ore, ma il modificato ha un offset 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 contenere questi valori. Devi calcolarli al volo usando il timestamp (che è sempre nell’ora UTC), il fuso orario locale del computer che visualizza il file e se era in vigore l’ora legale.
Vedrai anche un timestamp “Nascita”, che è 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 touch
comando per modificare l’accesso o i timestamp modificati o entrambi:
touch -a dp.c
Per impostare un nuovo timestamp di accesso, utilizzerai l’ -a
opzione (orario di accesso). Questo comando imposta il timestamp di accesso sull’ora corrente del computer:
stat dp.c
Il timestamp di accesso è cambiato, come previsto. Tuttavia, anche il timestamp modificato è stato aggiornato; E ‘normale.
Per modificare il timestamp modificato, puoi utilizzare l’ -m
opzione (ora modificata):
touch -m dp.c
stat dp.c
Questa volta, i timestamp modificati e modificati sono stati aggiornati.
È possibile utilizzare l’ -d
opzione (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 modificare i timestamp al presente.
Utilizzeremo 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
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.
È inoltre possibile utilizzare l’ -r
opzione (riferimento), come mostrato di seguito, se si desidera impostare i timestamp di un file sui valori dei timestamp di un altro:
touch dp.c -r dice_words.sl3
stat dp.c
E poi, siamo praticamente tornati al punto di partenza, con un misto di -0400
e -0500
timestamp.
Facciamo qualcosa che influisca solo sul timestamp modificato. Useremo il chmod
comando per dare a un file eseguibile le autorizzazioni di esecuzione per tutti gli utenti :
chmod +x dp
dp statistica
Il timestamp modificato è stato l’unico ad essere aggiornato. Questo perché il file stesso non è stato modificato, non è stato né consultato né modificato. Tuttavia, i metadati relativi al file sono stati modificati.
Come il file system aggiorna i timestamp
Quando un file system è montato, ci sono opzioni che puoi usare per specificare come quel file system dovrebbe funzionare o essere trattato. Questi sono memorizzati nel /etc/fstab
file, che viene letto ed elaborato al momento dell’avvio. È inoltre possibile impostare le opzioni per dettare lo schema da utilizzare per aggiornare il timestamp di accesso.
Di seguito sono riportate alcune delle opzioni più comuni:
- strictatime (strict atime) : questa opzione aggiorna il timestamp di accesso dei file ogni volta che si accede. C’è un sovraccarico legato 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 i timestamp di accesso per file e directory dall’aggiornamento. 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 (atime relativo): questa opzione aggiorna il timestamp di accesso solo se era più vecchio di 24 ore o se quello precedente era più vecchio dei timestamp modificati o modificati. Questo trova un buon equilibrio tra i timestamp di accesso che si aggiornano troppo frequentemente o non si aggiornano affatto.
Diamo un’occhiata al /etc/fstab
file per questo computer e vediamo quali opzioni sono impostate:
less /etc/fstab
Il /etc/fstab
file viene visualizzato per noi, come mostrato di seguito.
Ecco il contenuto del file senza il wrap-around:
# /etc/fstab: informazioni sul file system statico. # # Usa 'blkid' per stampare l'identificatore univoco universale per a # dispositivo; questo può essere usato con UUID= come un modo più robusto per nominare i dispositivi # che funziona anche se i dischi vengono aggiunti e rimossi. Vedere fstab(5). # # <file system> <punto di montaggio> <tipo> <opzioni> <dump> <pass> # / era su /dev/sda1 durante l'installazione UUID=4a143d08-8695-475b-8243-b13b56050fc2 / errori ext4=remount-ro 0 1 /swapfile nessuno 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 ext4
file system.
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 un file system di lettura e scrittura.
Quindi, non si fa menzione di come verrà gestito il timestamp di accesso. Scaviamo più a fondo e /proc/mounts
vediamo cosa può dirci. Invieremo l’output da /proc/mounts
through grep
. La nostra stringa di ricerca sarà “sda” , l’identificatore del disco rigido.
Digitiamo quanto segue:
cat /proc/mounts | grep "sda"
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 “atime relativo” per aggiornare i timestamp di accesso.
Da dove viene? Bene, lo relatime
schema viene utilizzato nelle seguenti situazioni:
- Quando viene utilizzata l’ opzione predefinita
/etc/fstab
. - Quando il relatime
/etc/fstab
viene utilizzata l’opzione. - Quando non vengono utilizzate opzioni di timestamp di accesso in
/etc/fstab
e stai utilizzando il kernel Linux 2.6.30 o successivo.
La nostra /etc/fstab
voce per il ext4
file system non specificava alcuna opzione di aggiornamento del timestamp di accesso, quindi Linux ha fatto la scelta sensata e ha utilizzato relatime
.
I timestamp sono importanti
I timestamp ci offrono un modo semplice per vedere quando è stato effettuato l’accesso, modificato o modificato un file. 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.