Questa risposta è una combinazione di quella di @lechlukasz e @ db48x , incorporando anche alcuni punti espressi nei commenti e alcuni dei miei pensieri.
Il semplice percorso da seguire è un approccio combinato di file system e metadati separati.
Utilizzando un file system che esegue l'hashing e la convalida dei dati al volo, come ZFS o Btrfs (si noti che sebbene siano stati fatti grandi progressi, Btrfs non è considerato pronto per l'uso in produzione in questo momento), si può essere ragionevolmente sicuro che se i dati possono essere letti dal disco senza errori del sistema operativo, i dati letti sono stati scritti sul disco nel modo previsto dal file system. Eseguendo periodiche operazioni di "scrub", tutti i dati vengono letti e verificati rispetto all'idea del file system di ciò che dovrebbe essere.
Tuttavia, ciò protegge solo dalla corruzione su disco (blocchi illeggibili, errori di scrittura dell'hardware, scritture non valide che danneggiano parti dei dati direttamente sul dispositivo a blocchi, ecc.). Non protegge da un bug del software, da un funzionamento errato dell'utente o da software dannoso che funziona attraverso le funzionalità del sistema operativo previste per lavorare con i file, supponendo che tali strutture siano prive di tali bug.
Per proteggerti da quest'ultimo, hai bisogno di un altro livello di protezione. I dati di checksum o hashing dal punto di vista di un'applicazione utente aiuteranno a proteggere da molti dei rischi sopra menzionati, ma devono essere eseguiti separatamente (sia come azione di processo integrata nel software, sia come processo completamente separato).
Con l'hardware di oggi e ciò che è pratico per l'archiviazione di grandi quantità di dati (dischi rigidi del disco rotante rispetto ai dischi / SSD a stato solido), anche gli algoritmi di hashing complessi come SHA1 saranno in gran parte legati all'I / O - cioè alla velocità a cui i dati vengono sottoposti a hash sarà una funzione della velocità di lettura del sistema di archiviazione, piuttosto che la capacità del processore del computer di calcolare l'hash. Ho fatto un esperimento con l'esecuzione di un processo di hashing MD5 nello spazio utente su circa 150 GB di dati su quello che nel 2012 era un PC consumer di livello intermedio e si è concluso dopo aver esercitato il disco praticamente senza interruzioni per circa 40 minuti. Scalando quelle cifre di 100 volte, otterresti gli hash MD5 di una raccolta da 15 TB in circa tre giorni sullo stesso hardware. Aggiungendo la velocità di trasferimento in lettura (che può essere facilmente raggiunta ad esRAID 0, ad esempio, sta eseguendo lo striping senza ridondanza, comunemente utilizzato per ottenere prestazioni di lettura / scrittura più elevate, possibilmente in combinazione con RAID 1 che forma RAID 10 ), il tempo di completamento può essere ridotto per la stessa quantità di dati.
Combinando i due, ottieni il meglio da entrambi i mondi: il file system ti dà la certezza che ciò che hai ricevuto durante la lettura del file è ciò che è stato effettivamente scritto, e un processo separato di verifica della fissità può essere eseguito su tutta la raccolta assicurando che i dati memorizzato corrisponde ancora a ciò che è stato ingerito nell'archivio. Qualsiasi incoerenza tra i due (il file system dice che il file è OK, il controllo di fissità dice che non lo è) indicherà un file che è stato modificato al di fuori della modalità di funzionamento prevista dell'archivio ma all'interno delle strutture del sistema operativo, richiedendo un ripristino da un secondario copia (backup). Il controllo di fissità può quindi essere eseguito a un intervallo di tempo più lungo, il che diventa essenziale per archivi molto grandi, ma è comunque garantito che eventuali accessi online non vengano danneggiati sull'hardware se le letture hanno esito positivo. In linea di principio, il software di archiviazione potrebbe fare affidamento sul file system per segnalare incoerenze come errori di lettura ed eseguire un controllo di fissità separato in background mentre l'utente sta lavorando con il file e visualizzando un messaggio appropriato che dovrebbe indicare che il file non corrisponde a ciò che è stato ingerito nell'archivio. Utilizzando un file system con hashing a blocchi, un tale schema avrebbe un impatto minimo sulle prestazioni percepite, garantendo comunque che il contenuto sia corretto.