md5 o sha1 al copiar un archivo

md5 o sha1 al copiar un archivo

¿Hay alguna forma en alguna distribución de Linux de realizar una verificación md5sum o sha1 mientras el archivo se transfiere de una partición local a una NFS?

Ejemplo:

Tengo una unidad montada en NFS y un archivo muy grande en mi unidad local. Me gustaría transferir ese archivo a la unidad montada en NFS y, al mismo tiempo, hacer una verificación md5. Encontré muchos scripts que harían md5 después de copiar el archivo en la unidad remota, pero como es un archivo muy grande de más de 100 GB, me gustaría saber si hay una manera de aprovechar el hecho de que el archivo ya se está rojo mientras se transfiere.

Respuesta1

No conozco ninguna utilidad estándar de Linux que pueda hacer esto. Si el archivo cabe en su memoria caché, no sería tan ineficiente hacer primero la suma md5 y luego copiar (la copia obtendría los datos de la memoria).

Puedes utilizar la siguiente combinación:

cat filename | tee remote_output_name | md5sum

que podría modificar para verificar directamente la suma impresa con md5sumel md5 almacenado. Esto lee el archivo del disco sólo una vez.

Suponiendo que haya generado un check.md5con

cd dir_with_big_files
md5sum * > check.md5

, el siguiente programa Python copiaría y verificaría un solo archivo, leyendo/escribiendo en 64 Mb a la vez. Guárdelo como /usr/local/bin/chkcopy chmod +x /usr/local/chkcopyy llámelo conchkcopy file_name check.md5 destination_filename_or_dir

#! /usr/bin/env python

import sys, os, hashlib

m = hashlib.md5()
file_name = sys.argv[1]
md5_name = sys.argv[2]
out_name = sys.argv[3]
if os.path.isdir(out_name):
    out_name = os.path.join(out_name, file_name)
BUF_SIZE = 64 * (1024 ** 2)

with open(file_name, 'rb') as ifp:
    with open(out_name, 'wb') as ofp:
        buf = ifp.read(BUF_SIZE)
        while buf:
            m.update(buf)
            ofp.write(buf)
            buf = ifp.read(BUF_SIZE)
with open(md5_name) as fp:
    for line in fp:
        md5, fn = line.rstrip().split('  ', 1)
        if fn == file_name:
            assert m.hexdigest() == md5
            break
    else:
        print('no md5 found for ' + file_name)

Respuesta2

Existe una bifurcación del conocido ddcon funcionalidad extendida llamadadcflddque he estado usando durante años o una ddversión parcheada llamadadc3ddcon una funcionalidad algo similar.

Ambas herramientas pueden realizar hash (incluso con múltiples tipos de hash simultáneamente si se desea) durante la copia. Los hashes se pueden calcular sobre fragmentos y/o sobre todo el conjunto de datos.

algunas distribuciones como debian ofrecen directamente paquetes en sus repositorios, los paquetes para fedora están disponibles a través del sitio externorepositorios de certificadosPor ejemplo.

Para copiar un archivo en fragmentos de 8MiB y calcular la suma MD5 de todos los datos que se imprime en STDERR:

dcfldd if=/path/to/input bs=8M hash=md5 of=/path/to/outputfile

Para copiar un archivo en fragmentos de 8MiB calculando el hash SHA256 de todos los datos más la suma SHA256 sobre cada bloque de 64MiB:

dcfldd if=/path/to/input bs=8M hash=SHA256 hashwindow=64M of=/path/to/outputfile

También se puede proporcionar un archivo de salida para el hash calculado especificando un archivo a través del hashlogparámetro. Al calcular múltiples hashes, se pueden especificar salidas separadas mediante, por ejemplo md5log=FILE1.log sha256log=FILE2.log, .

Respuesta3

Puedes utilizar un programa externo ( crcsum), que extiende cpy mvcon suma de comprobación:

https://sourceforge.net/projects/crcsum/

información relacionada