Quando “cambiato” non significa “modificato”? Quando parliamo di timestamp dei file Linux. In questa guida spiegheremo come il sistema li aggiorna e come modificarli tu stesso.
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 leggerne alcuni valori. 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. Si tratta piuttosto del momento in cui i metadati relativi al file sono stati modificati. Le modifiche alle autorizzazioni dei file, ad esempio, aggiorneranno il timestamp modificato.
Lo standard filesystem Linux ext4 alloca anche spazio per un timestamp di creazione del file nelle strutture interne del file system, ma questo non è stato ancora implementato. A volte, questo timestamp è 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 Unixche era la mezzanotte (00:00:00) del 1 gennaio 1970, a Tempo universale coordinato (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. Ciò 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 guidano la conversione del numero di secondi in una data e un’ora. Garantisce inoltre che il mese sia nella lingua corretta.
Quindi, quanti secondi possono essere memorizzati in un timestamp? Moltissimi: 2.147.483.647, per la precisione. È un numero elevato, ma è sufficiente? 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. Tuttavia, prima di allora avremo bisogno di uno schema diverso per i timestamp.
Visualizzazione dei timestamp
Quando usi 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 (ora di accesso) in questo modo:
ls -lu dp.c E infine, per vedere il timestamp della modifica, puoi utilizzare l’opzione -lc (cambia ora); digitare quanto segue:
ls -lc dp.c I timestamp sopra mostrano che i contenuti del file sono stati modificati l’ultima volta il 21 aprile 2019. I timestamp di accesso e quelli 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.
A vedere tutti i timestamp contemporaneamenteutilizzare il comando stat come segue:
stat dp.c I fusi orari sono elencati nella parte inferiore del display. Come puoi vedere, hanno una componente di secondi frazionari molto precisa. Alla fine di ogni timestamp, vedi anche -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 visualizzato da stat. Il computer che abbiamo utilizzato per ricercare questo articolo è configurato come se fosse nella zona dell’ora standard orientale (EST) degli Stati Uniti
Quel fuso orario è cinque ore indietro rispetto all’UTC quando è in vigore l’EST. Tuttavia, sono quattro ore indietro rispetto all’UTC quando è in vigore l’ora legale orientale (EDT). Nell’aprile 2019, quando è stato cambiato il timestamp modificato, era in vigore l’EDT. Ecco perché due timestamp hanno un offset di cinque ore, ma quello modificato ha un offset di quattro ore.
Gli offset e i fusi orari non vengono memorizzati da nessuna parte. Non c’è nessuno dei due un inode né uno spazio nel file system dedicato a contenere questi valori. Devi calcolarli al volo utilizzando il timestamp (che è sempre nell’ora UTC), il fuso orario locale del computer che visualizza il file e se l’ora legale era in vigore.
Vedi anche un timestamp “Nascita”, riservato alla data di creazione del file. Questo non è implementato e vedi un trattino “-” invece di un timestamp.
Modifica dei timestamp
Se lo desideri, puoi modificare i timestamp su un file. Puoi usare il comando touch modificare l’accesso o la data e l’ora modificate, o entrambi:
touch -a dp.c Per impostare un nuovo timestamp di accesso, dovresti utilizzare l’opzione -a (ora 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’opzione -m (ora modificata):
touch -m dp.c stat dp.c Questa volta, i timestamp modificati e modificati sono stati aggiornati.
È possibile utilizzare l’opzione -d (data) se si desidera modificare contemporaneamente sia il timestamp di accesso che quello modificato. 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 passata. 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 E poi, siamo praticamente tornati al punto di partenza, con un misto di timestamp -0400 e -0500.
Facciamo qualcosa che influenzi solo il timestamp modificato. Utilizzeremo il comando chmod per fornire un file eseguibile eseguire le autorizzazioni per tutti gli utenti:
chmod +x dp stat dp Il timestamp modificato è stato l’unico aggiornato. Ciò è dovuto al fatto che il file stesso non è stato modificato: non è stato effettuato l’accesso né è stato modificato. Tuttavia, i metadati del file sono stati modificati.
Come il file system aggiorna i timestamp
Quando un file system è montato, sono disponibili opzioni che è possibile utilizzare per specificare come tale file system deve funzionare o essere trattato. Questi sono memorizzati nel file /etc/fstab, che viene letto ed elaborato al momento dell’avvio. Puoi anche impostare opzioni per dettare lo schema da utilizzare per aggiornare il timestamp di accesso.
Di seguito sono riportate alcune delle opzioni più comuni:
- strictatime(orario rigoroso): questa opzione aggiorna il timestamp di accesso dei file ogni volta che viene effettuato l’accesso. Questo approccio comporta un sovraccarico, ma alcuni server possono trarre vantaggio da questo schema. Ha poco merito su un computer desktop o portatile.
- noatime(nessuna ora): 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 lo disabilita per le directory.
- relatime (atime relativo): Questa opzione aggiorna il timestamp di accesso solo se risale a più di 24 ore o se quello precedente era più vecchio dell’attuale timestamp modificato o modificato. Ciò costituisce un buon equilibrio tra i timestamp di accesso che si aggiornano troppo frequentemente o che non si aggiornano affatto.
Andiamo guarda il file /etc/fstab per questo computer e vedere quali opzioni sono impostate:
less /etc/fstab Viene visualizzato il file /etc/fstab, come mostrato di seguito.
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 è error=remount-ro, che dice al sistema operativo di rimontare questo file system in sola lettura se si verificano errori durante il tentativo di montarlo come file system di lettura e scrittura.
Pertanto, non viene menzionato come verrà gestito il timestamp di accesso. Scaviamo più a fondo e vediamo cosa può dirci /proc/mounts. Indirizzeremo l’output da /proc/mounts tramite 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.
- relativi: Il file system utilizzerà lo schema “atime relativo” per aggiornare i timestamp di accesso.
Da dove viene? Ebbene, lo schema relatime viene utilizzato nelle seguenti situazioni:
- Quando il valori predefiniti Viene utilizzata l’opzione /etc/fstab.
- Quando il relativi Viene utilizzata l’opzione /etc/fstab.
- Quando non vengono utilizzate opzioni di timestamp di accesso in /etc/fstab e si utilizza il kernel Linux 2.6.30 o successivo.
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 utilizzato relatime.
I timestamp sono importanti
I timestamp ci offrono un modo semplice per vedere quando è stato effettuato l’accesso, la modifica o il cambiamento di un file. Ma, cosa ancora più importante, forniscono un modo per eseguire il backup e sincronizzare il software per determinare di quali file è necessario eseguire il 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.