Pregunta Cómo verificar y verificar todos los archivos en un sistema de archivos


Me gustaría ejecutar sha1sum o md5sum en todos mis archivos recursivamente, almacenar los resultados en un archivo (o un par de archivos) y luego poder escanear los archivos nuevamente para verificar la integridad de los archivos.

herramientas como sha1sum / md5sum no permiten recursivas, y también me gustaría distribuir la carga para que use más de un núcleo de CPU.

Todavía no me siento seguro poniendo mis archivos en BTRFS y además BTRFS aún no funciona correctamente en raid5 / 6, así que estoy buscando una forma "rápida" de verificar todos mis archivos y verificarlos cuando quiera. De esa forma, al menos sabría si la corrupción silenciosa de datos ha obstaculizado alguno de mis archivos.

¿Existen herramientas diseñadas para este propósito? (Sí, estoy al tanto de SnapRAID)


0


origen


¿Qué hay de ZFS? Está disponible en Linux, también, por lo que he escuchado. Quiero decir, evitaría los guiones periódicos manuales. Esto no es muy confiable. - Martin Sugioarto
Qué pasa find -f / - exec md5sum {} \; > logfile.md5sum ? y usar ese archivo después? - Hastur
@Hastur: en Debian tu comando no funciona. En todo caso tiene que verse así: 'find -type f / path / -exec md5sum {} \; > sumas de comprobación 'y para verificarlo puede usar' md5sum -c checksums | grep ": FAILED"> checksumfailures ' - Waxhead


Respuestas:


Estas herramientas están destinadas para más o menos este caso de uso:

http://md5deep.sourceforge.net/


1



Hashdeep es especialmente útil. ¡Gracias por compartir! - MariusMatutiae


O podrías escribir algo por tu cuenta;) Escribí este script en Python fusionando fragmentos de otras personas de la web. Puede ser un punto de partida.

#! / usr / bin / python

importación os
importar hashlib
de joblib import Parallel, delay
importar json

BASE_DIR = "/ home / p / music"
NUM_PROC = 2
OUT_FILE = "hashes.json"

# lista de archivos para procesar
file_list = []
para root, dir, archivos en os.walk (BASE_DIR):
    para el nombre en los archivos:
        file_list.append (os.path.join (root, name))


# - md5sum cálculo para un solo archivo
def hashOne (f):
    BLOCKSIZE = 65536
    hasher = hashlib.md5 ()
    con abierto (f, 'rb') como afile:
        imprimir f
        buf = afile.read (BLOCKSIZE)
        mientras len (buf)> 0:
            hasher.update (buf)
            buf = afile.read (BLOCKSIZE)
    return hasher.hexdigest ()

# cálculo paralelo de md5sum
md5 = Paralelo (n_jobs = NUM_PROC) (retrasado (hashOne) (f) para f en file_list)

# hacer un hash de file_names -> md5sum
out_hash = {}
para i en el rango (len (file_list)):
    out_hash [file_list [i]] = md5 [i]

# escribe el hash "nombre de archivo -> md5sum" en el disco para el futuro
dump = json.dumps (out_hash)
con open (OUT_FILE, "wb") como archivo:
    archivo.write (volcado)


1