Crear un archivo tar con sumas de verificación incluidas

16

Este es mi problema: necesito archivar en archivos tar muchos (hasta 60 TB) de archivos grandes (generalmente de 30 a 40 GB cada uno). Me gustaría hacer sumas de verificación (md5, sha1, lo que sea) de estos archivos antes de archivarlos; sin embargo, no leer cada archivo dos veces (una para suma de verificación, dos para tar'ing) es más o menos una necesidad para lograr un rendimiento de archivo muy alto (LTO-4 quiere 120 MB / s sostenidos, y la ventana de copia de seguridad es limitada).

Entonces, necesitaría alguna forma de leer un archivo, alimentando una herramienta de suma de verificación en un lado y construyendo un alquitrán para grabar en el otro lado, algo así:

tar cf - files | tee tarfile.tar | md5sum -

Excepto que no quiero la suma de verificación de todo el archivo (este código de shell de muestra hace exactamente esto) sino una suma de verificación para cada archivo individual en el archivo.

He estudiado las opciones de GNU tar, Pax, Star. He mirado la fuente de Archive :: Tar . No veo una manera obvia de lograr esto. Parece que tendré que construir a mano algo en C o similar para lograr lo que necesito. Perl / Python / etc simplemente no lo reducirá en términos de rendimiento, y los diversos programas tar pierden la "arquitectura de complementos" necesaria. ¿Alguien sabe de alguna solución existente para esto antes de comenzar el cambio de código?

wazoox
fuente
3
Ciertamente suena como una adición útil a tarsi decides escribirlo;)
1
No es su pregunta, pero con el 7zque puede elegir el hash e imprimirlo en una forma que sha1sumy sha256sumpuede comprender: 7zip.bugaco.com/7zip/7zip_15_09/MANUAL/cmdline/commands/... (y sami-lehtinen.net/blog/... ) Pruébelo: 7z h -scrcsha256 mydir/* | sed --regexp-extended 's, +[0-9]+ +, ,g' > mydir.sha256sum ; sha256sum -c mydir.sha256sum(probado con p7zip versión 15.09 beta)
Nemo

Respuestas:

15

Antes de continuar y reescribir el alquitrán, es posible que desee perfilar el método rápido y fácil de leer los datos dos veces, ya que puede que no sea mucho más lento que hacerlo de una sola vez.

El método de dos pasos se implementa aquí:

http://www.g-loaded.eu/2007/12/01/veritar-verify-checksums-of-files-within-a-tar-archive/

con el one-liner:

  tar -cvpf mybackup.tar myfiles/| xargs -I '{}' sh -c "test -f '{}' && 
  md5sum '{}'" | tee mybackup.md5

Si bien es cierto que md5sum está leyendo cada archivo del disco en paralelo con tar, en lugar de transmitir los datos a través de la tubería, el almacenamiento en caché del disco de Linux debería hacer que esta segunda lectura sea una lectura simple desde un búfer de memoria, que en realidad no debería ser más lento que Una lectura estándar. Solo necesita asegurarse de tener suficiente espacio en su caché de disco para almacenar suficiente de cada archivo que el segundo lector siempre está leyendo desde el caché y no está lo suficientemente atrás como para tener que recuperar del disco

bk.
fuente
3
En realidad funciona bastante bien, parece limitado por la capacidad de la CPU para procesar md5 (~ 280MB / s en un núcleo).
wazoox
4

Aquí hay un ejemplo de script Python. Calcula la suma de comprobación del archivo a medida que se agrega al archivo. Al final del script, el archivo de suma de verificación se agrega al archivo.

import hashlib,os
import tarfile
def md5(filename):
    ''' function to get md5 of file '''
    d = hashlib.md5()
    try:
        d.update(open(filename).read())
    except Exception,e:
        print e
    else:
        return d.hexdigest()

root="/home"
outtar=os.path.join(root,"path1","output.tar")
path = os.path.join(root,"path1")
chksum_file=os.path.join(root,"path","chksum.txt")
tar = tarfile.open(outtar, "w")
o_chksum=open(chksum_file,"w")
for r,d,f in os.walk(path):
    for files in f:
        filename=os.path.join(r,files)
        digest="%s:%s"%(md5(filename) , filename)
        o_chksum.write(digest+"\n")
        tar.add(os.path.join(r,files))

tar.add(chksum_file)
tar.close()
o_chksum.close()

Cuando descomprimas, usa el archivo chksum_file para verificar la suma de comprobación

usuario37841
fuente
1
Sí, eso es algo en lo que pensé, pero generalmente este tipo de bibliotecas cargan el archivo en la RAM antes de manipularlo, y mis archivos tienen al menos 20 GB ...
wazoox
1

Creo que su problema es un problema de diseño de tar, ya que tar no permite el acceso / posicionamiento aleatorio dentro del archivo de almacenamiento a través de una tabla de contenido, por lo tanto, todos los protocolos estarán basados ​​en archivos y no en búfer.
Por lo tanto, puede mirar diferentes formatos como PAX o DAR que permiten el acceso aleatorio.

weismat
fuente
1
Desafortunadamente, la salida de tar es obligatoria, porque es en lo que se basa el flujo de trabajo.
wazoox
0

Los formatos de archivos recientes generalmente incluyen algo de hash para la verificación de archivos, pero tienen un problema similar: no siempre puede elegir su propia función de hash, ni mantener una copia local de los hash.

Es posible que desee guardar una copia local de los hashes, distinta de la que está incrustada en el archivo en sí: por ejemplo, si el archivo se almacena sin conexión (en cintas o en un centro de datos que es caro de leer) y desea verificar un copia local de un archivo / directorio.

7zip tiene varias opciones, como 7z hcon hash personalizado y 7z l -sltpara enumerar todos los hash y otras cosas, pero ¿qué pasa si desea una lista de hash md5 o sha1? Puede usar -bby-bs controlar la verbosidad y reutilizar el método George Notaras mencionado en la respuesta aceptada:

7z a -bsp1 -bb3 dir.7z dir 2>&1 \
| grep "^+" | sed 's,^+ ,,g' | xargs -d "\n" -I § -P 1 sh -c "test -f '§' && sha1sum '§'" \
| tee dir.sha1
Nemo
fuente