USN Journal: la cronologia nascosta di Windows che traccia le modifiche ai file

Windows usa USN Journal per registrare in modo incrementale le modifiche ai file su NTFS senza scansionare continuamente l'intero disco. Ecco come funziona.

Windows non deve rileggere milioni di file per capire che cosa è cambiato su un volume NTFS. Il filesystem mantiene infatti un registro incrementale chiamato USN Change Journal, nel quale annota eventi come creazione, eliminazione, rinomina, modifica dei dati, variazione degli attributi e cambiamenti ai permessi. Ogni nuovo evento è aggiunto in coda e associato a un USN, Update Sequence Number: Microsoft descrive il Change Journal come un meccanismo molto più efficiente rispetto al controllo ripetuto dei timestamp o alla registrazione di notifiche sui singoli file.

È un componente poco visibile di Windows, ma estremamente utile per software di indicizzazione, backup, replica e sincronizzazione. La parte interessante è che il journal può essere interrogato anche direttamente dall’amministratore con gli strumenti integrati nel sistema operativo. In questo modo si può osservare concretamente che cosa registra NTFS, quanto indietro arriva la cronologia disponibile e perché un programma può scoprire poche centinaia di modifiche senza essere costretto ad avviare una nuova scansione di un intero volume.

Che cosa registra Windows con il suo USN Journal

Il Change Journal non conserva copie dei file e non permette di recuperare le vecchie versioni: registra piuttosto eventi associati agli oggetti NTFS.

Tra i motivi che possono comparire nei record troviamo, ad esempio:

  • FILE_CREATE, alla creazione di un file o di una directory;
  • FILE_DELETE, alla rimozione di un file;
  • DATA_OVERWRITE, quando una parte dei dati viene sovrascritta;
  • DATA_EXTEND, quando il contenuto viene esteso;
  • DATA_TRUNCATION, quando il file system rileva la riduzione della lunghezza di un file;
  • RENAME_OLD_NAME e RENAME_NEW_NAME, descrivono un’operazione di rinomina;
  • SECURITY_CHANGE, quando cambiano i permessi;
  • HARD_LINK_CHANGE, quando viene aggiunto o eliminato un hard link (secondo nome o percorso che punta allo stesso identico file sul disco);
  • BASIC_INFO_CHANGE, per modifiche alle informazioni di base dell’oggetto.

Microsoft definisce questi valori nella struttura usata per richiedere i record del journal. Una rinomina, in particolare, può produrre due eventi distinti: uno contiene il vecchio nome e l’altro quello nuovo.

NTFS ragiona per oggetti, non soltanto per percorsi

Nei record USN, il filesystem NTFS prevede l’uso di identificatori come FileReferenceNumber e ParentFileReferenceNumber: il primo individua l’oggetto NTFS interessato; il secondo la directory che lo contiene.

Un programma che volesse estrarre il percorso di un file dal journal, può ricostruire la gerarchia attraverso gli identificatori NTFS oppure tentare di risolvere l’ID dell’oggetto presente nel filesystem.

Provate, ad esempio, a impartire la seguente istruzione dal prompt dei comandi (cmd) per ottenere l’ID del file specificato:

fsutil file queryfileid C:\Windows\notepad.exe

È possibile anche mettere in campo l’operazione inversa in modo da ottenere il nome del file associato allo specifico ID:

fsutil file queryfilenamebyid C: 0x<ID>

Non bisogna però confonderlo con il “percorso ufficiale” del file: NTFS consente più hard link verso lo stesso oggetto e Microsoft specifica che queryfilenamebyid può restituire uno qualsiasi dei nomi di collegamento disponibili. È per questo che specificando l’ID di C:\Windows\notepad.exe si può ottenere un percorso sotto WinSxS: i due nomi possono puntare allo stesso oggetto NTFS.

Come vedere il Change Journal del proprio PC Windows

Da un prompt dei comandi aperto con privilegi amministrativi si può interrogare lo stato del journal dell’unità C: con il comando seguente:

fsutil usn queryjournal C:

L’output contiene valori particolarmente interessanti. In particolare, Primo Usn indica il primo record ancora leggibile nel journal mentre USN successivo rappresenta il valore che sarà assegnato al prossimo record. Dimensioni massime indica invece la dimensione obiettivo del journal.

USN journal, modifiche file in tempo reale

Per leggere i record presenti nel journal è possibile usare il comando che segue. Tuttavia, esso genera una vera valanga di informazioni: un PC Windows continuamente in uso produce infatti modifiche a cache, log, database, file temporanei, profili applicativi e numerose altre strutture.

fsutil usn readjournal C:

È molto più utile partire da un determinato punto nel tempo. Ad esempio, specificando un ID di partenza (startusn), si comunica a Windows di voler estrarre solo le informazioni NTFS successivo a uno specifico evento. È possibile iniziare, ad esempio, specificando il valore di USN successivo, letto utilizzando il primo comando presentato in precedenza:

fsutil usn readjournal C: startusn=0x0000001aba7ce798

Si può ad esempio creare un file prova.txt, scriverci qualcosa, rinominarlo documento.txt e cancellarlo. Ripetendo il comando precedente, si vedranno apparire le indicazioni nel journal.

Perché il journal non conserva tutti gli eventi per sempre

USN Change Journal deve essere abbastanza grande da permettere alle applicazioni di recuperare le modifiche, ma non può crescere senza limite. NTFS usa quindi una struttura simile a un log nel quale la coda avanza e i dati più vecchi sono progressivamente eliminati.

All’arrivo di nuovi eventi, il valore USN successivo continua a cambiare; quando serve recuperare spazio, Primo Usn si sposta in avanti.

È proprio per questo che un programma non può attendere indefinitamente prima di leggere il journal: se l’USN da cui voleva riprendere è diventato più vecchio di Primo Usn, quella parte della cronologia non è più disponibile.

L’utilità di sistema fsutil mette a disposizione i comandi per creare, modificare ed eliminare il journal. Microsoft avverte esplicitamente che la sua eliminazione può costringere le applicazioni che ne dipendono a effettuare nuove scansioni complete e che l’operazione può avere impatto sui servizi che lo utilizzano.

Leggere USN Journal in modo più intelligente

Un’istruzione come fsutil usn readjournal è pensata soprattutto come strumento amministrativo e diagnostico. Le applicazioni che vogliono usare seriamente il Change Journal lavorano a un livello inferiore.

Microsoft espone due controlli principaliFSCTL_READ_USN_JOURNAL, che permette di leggere selettivamente i record; FSCTL_ENUM_USN_DATA, per enumerare dati associati agli oggetti del volume.

Un programma di backup, per esempio, potrebbe concentrarsi su eventi quali FILE_CREATE, FILE_DELETE, DATA_OVERWRITE, DATA_EXTEND, DATA_TRUNCATION e RENAME, ignorando altre modifiche non rilevanti.

Un filesystem moderno deve infatti permettere ad applicazioni esterne di sapere che cosa è cambiato senza obbligarle a scansionare continuamente tutto il volume. Come abbiamo visto, NTFS risolve il problema mantenendo una sequenza incrementale di eventi, identificando gli oggetti tramite File ID e lasciando alle applicazioni il compito di gestire le elaborazioni successive. È un meccanismo che consente di risparmiare quantità enormi di I/O quando si lavora con milioni di file.

Monitorare in tempo reale le modifiche registrate da USN Journal

Lo script PowerShell scaricabile da qui (va rinominato con l’estensione .ps1) automatizza una prova molto utile: legge dapprima il valore Usn successivo del volume C:, lo usa come punto di partenza e poi interroga periodicamente il Change Journal mostrando soltanto gli eventi comparsi da quel momento in avanti.

Per ciascun record estrae timestamp, tipo di operazione, nome del file e percorso, tentando di risolvere quest’ultimo attraverso il File ID NTFS con fsutil file queryfilenamebyid.

Per usarlo, basta avviare PowerShell come amministratore, incollare lo script e lasciarlo in esecuzione mentre si creano, modificano, rinominano o eliminano file. L’output si aggiorna automaticamente e permette di osservare eventi come creazione, estensione dei dati, modifica degli attributi e rinomina.

Nel caso di un file già eliminato, il percorso completo può non essere più risolvibile: il record USN conserva comunque il nome e il tipo di operazione, mostrando bene la differenza tra la cronologia delle modifiche registrata da NTFS e lo stato corrente del filesystem.

Ti consigliamo anche

Link copiato negli appunti