Creazione di un file tar con checksum incluso


16

Ecco il mio problema: ho bisogno di archiviare per tarare molti file (fino a 60 TB) di file di grandi dimensioni (di solito da 30 a 40 GB ciascuno). Vorrei fare checksum (md5, sha1, qualunque cosa) di questi file prima dell'archiviazione; tuttavia non leggere ogni file due volte (una volta per il checksum, due volte per il tar) è più o meno una necessità per ottenere prestazioni di archiviazione molto elevate (LTO-4 richiede 120 MB / s sostenuti e la finestra di backup è limitata).

Quindi avrei bisogno di un modo per leggere un file, alimentare uno strumento di checksum da un lato e costruire un tar su nastro dall'altro lato, qualcosa lungo:

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

Solo che non voglio il checksum dell'intero archivio (questo codice di shell di esempio fa proprio questo) ma un checksum per ogni singolo file nell'archivio.

Ho studiato le opzioni GNU tar, Pax, Star. Ho guardato la fonte da Archive :: Tar . Non vedo alcun modo ovvio per raggiungere questo obiettivo. Sembra che dovrò costruire a mano qualcosa in C o simile per ottenere ciò di cui ho bisogno. Perl / Python / etc semplicemente non lo taglieranno dal punto di vista delle prestazioni, e ai vari programmi tar manca la necessaria "architettura plug-in". Qualcuno conosce qualche soluzione esistente prima di iniziare a modificare il codice?


3
Certamente sembra un'aggiunta utile a tarse decidi di scriverlo;)

1
Non tua domanda, ma con 7zè possibile scegliere l'hash e stamparlo in un modo che sha1sume sha256sumin grado di capire: 7zip.bugaco.com/7zip/7zip_15_09/MANUAL/cmdline/commands/... (e sami-lehtinen.net/blog/... ) Provalo: 7z h -scrcsha256 mydir/* | sed --regexp-extended 's, +[0-9]+ +, ,g' > mydir.sha256sum ; sha256sum -c mydir.sha256sum(testato con p7zip Versione 15.09 beta)
Nemo

Risposte:


15

Prima di andare avanti e riscrivere tar, potresti voler profilare il metodo rapido e semplice di leggere i dati due volte, poiché potrebbe non essere molto più lento rispetto a farlo in un passaggio.

Qui viene impiantato il metodo a due passaggi:

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

con il one-liner:

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

Mentre è vero che md5sum sta leggendo ogni file dal disco in parallelo con tar, invece di ottenere i dati in streaming attraverso la pipe, la cache del disco Linux dovrebbe rendere questo secondo una lettura semplice da un buffer di memoria, che non dovrebbe essere più lento di una lettura stdin. Devi solo assicurarti di avere abbastanza spazio nella cache del disco per archiviare abbastanza di ogni file che il secondo lettore legge sempre dalla cache e non si allontana abbastanza da dover recuperare dal disco


3
In realtà funziona abbastanza bene, sembra limitato dalla capacità della CPU di sgranocchiare md5 (~ 280 MB / s su un core).
Wazoox,

4

Ecco un esempio di script Python. Calcola il checksum del file mentre viene aggiunto all'archivio. Alla fine dello script, il file checksum viene aggiunto all'archivio.

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()

Quando si annulla l'avvio, utilizzare il file chksum_ per verificare il checksum


1
Sì, è qualcosa del genere a cui ho pensato, ma di solito questo tipo di librerie carica il file nella RAM prima di manipolarlo e i miei file sono almeno 20 GB ....
wazoox

1

Penso che il tuo problema sia un problema di progettazione di tar poiché tar non consente l'accesso / posizionamento casuale all'interno del file di archivio tramite una tabella dei contenuti, quindi tutti i protocolli saranno basati su file e non basati su buffer.
Quindi puoi guardare diversi formati come PAX o DAR che consentono l'accesso casuale.


1
Sfortunatamente l'output tar è obbligatorio, perché è su questo che si basa il flusso di lavoro.
Wazoox,

0

I formati di archivi recenti generalmente includono alcuni hash per la verifica dei file, ma hanno un problema simile: non è sempre possibile scegliere la propria funzione di hashing, né conservare una copia locale degli hash.

Potresti voler salvare una copia locale degli hash, distinta da quella incorporata nell'archivio stesso: ad esempio se l'archivio è archiviato offline (su nastri o un data center che è costoso da leggere) e vuoi verificare un copia locale di un file / directory.

7zip ha diverse opzioni come 7z hcon l'hash personalizzato e 7z l -sltper elencare tutti gli hash e quant'altro, ma cosa succede se si desidera un elenco di hash md5 o sha1? È possibile utilizzare -bbe-bs controllare la verbosità e riutilizzare il metodo George Notaras menzionato nella risposta accettata:

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.