Esta respuesta es una combinación de la de @ lechlukasz y @ db48x , que también incorpora algunos puntos hechos en los comentarios, así como algunos de mis propios pensamientos.
El camino simple hacia adelante es un enfoque combinado de sistema de archivos y metadatos separados.
Al utilizar un sistema de archivos que realiza el hash y la validación de datos sobre la marcha, como ZFS o Btrfs (tenga en cuenta que aunque se han hecho grandes avances, Btrfs no se considera listo para el uso de producción en este momento), puede estar razonablemente asegúrese de que si los datos se pueden leer del disco sin que el sistema operativo produzca errores, la lectura de datos se escribió en el disco de la manera prevista por el sistema de archivos. Al ejecutar operaciones periódicas de "fregado", todos los datos se leen y verifican contra la idea del sistema de archivos de lo que debería ser.
Sin embargo, eso solo protege contra la corrupción en el disco (bloques ilegibles, errores de escritura de hardware, escrituras inválidas que corrompen partes de los datos directamente en el dispositivo de bloque, etc.). No protege contra un error de software, operación incorrecta del usuario o software malicioso que funciona a través de las instalaciones del sistema operativo para trabajar con archivos, suponiendo que esas instalaciones estén libres de tales errores.
Para protegerse contra este último, necesita otra capa de protección. Los datos de suma de comprobación o hash desde la perspectiva de una aplicación de usuario ayudarán a proteger contra muchos de los riesgos mencionados anteriormente, pero deben realizarse por separado (ya sea como una acción de proceso incorporada en el software o como un proceso completamente separado).
Con el hardware actual y lo que es práctico para almacenar grandes cantidades de datos (discos duros de disco giratorio en lugar de discos de estado sólido / SSD), incluso los algoritmos de hash complejos como SHA1 estarán en gran medida vinculados a E / S, es decir, la velocidad en el que los datos se procesan en función del hash será una función de la velocidad de lectura del sistema de almacenamiento, en lugar de la capacidad del procesador de la computadora para calcular el hash. Hice un experimento ejecutando un proceso de hash MD5 en el espacio de usuario de aproximadamente 150 GB de datos sobre lo que en 2012 era una PC de consumo de nivel medio, y terminó después de ejercer el disco básicamente sin interrupción durante unos 40 minutos. Al aumentar esas cifras hasta 100 veces, obtendría los hash MD5 de una colección de 15 TB en aproximadamente tres días en ese mismo hardware. Al agregar la velocidad de transferencia de lectura (que se puede lograr fácilmente, p. Ej.RAID 0, por ejemplo, es una franja sin redundancia, comúnmente utilizada para lograr un mayor rendimiento de lectura / escritura, posiblemente en combinación con RAID 1 formando RAID 10 ), el tiempo de finalización puede reducirse para la misma cantidad de datos.
Al combinar los dos, obtienes lo mejor de ambos mundos: el sistema de archivos te garantiza que lo que recibiste al leer el archivo es lo que realmente se escribió, y un proceso de comprobación de la fijación por separado puede ejecutarse en toda la colección para garantizar que los datos almacenado aún coincide con lo que se ingirió en el archivo. Cualquier inconsistencia entre los dos (el sistema de archivos dice que el archivo está bien, la comprobación de la fijación dice que no) indicará un archivo que ha sido modificado fuera del modo de operación previsto del archivo pero desde dentro de las instalaciones del sistema operativo, lo que provocará una restauración desde un secundario copia (copia de seguridad). Por lo tanto, la comprobación de la fijación puede ejecutarse en un intervalo de tiempo más largo, que se vuelve esencial para archivos muy grandes, pero se garantiza que los accesos en línea no se corromperán en el hardware si las lecturas tienen éxito. En principio, el software de archivo podría confiar en el sistema de archivos para informar inconsistencias como errores de lectura, y realizar una verificación de fijación por separado en segundo plano, ya que el usuario está trabajando con el archivo y muestra un mensaje apropiado si eso indica que el archivo no coincide con lo que se ingirió en el archivo Al utilizar un sistema de archivos de hash de bloques, dicho esquema tendría un impacto mínimo en el rendimiento percibido y al mismo tiempo garantizaría que el contenido es correcto.