
¿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 md5sum
el md5 almacenado. Esto lee el archivo del disco sólo una vez.
Suponiendo que haya generado un check.md5
con
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/chkcopy
y 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 dd
con funcionalidad extendida llamadadcfldd
que he estado usando durante años o una dd
versión parcheada llamadadc3dd
con 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 hashlog
pará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 cp
y mv
con suma de comprobación: