Membuat file tar dengan checksum disertakan

16

Inilah masalah saya: Saya perlu mengarsipkan file tar banyak (hingga 60 TB) file besar (biasanya masing-masing 30 hingga 40 GB). Saya ingin membuat checksum (md5, sh1, apa pun) dari file-file ini sebelum pengarsipan; namun tidak membaca setiap file dua kali (satu kali untuk checksumming, dua kali untuk tar'ing) lebih atau kurang suatu keharusan untuk mencapai kinerja pengarsipan yang sangat tinggi (KPP-4 menginginkan 120 MB / s berkelanjutan, dan jendela cadangan terbatas).

Jadi saya perlu beberapa cara untuk membaca file, memberi makan alat checksumming di satu sisi, dan membangun tar untuk ditempelkan di sisi lain, sesuatu bersama:

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

Kecuali bahwa saya tidak ingin checksum dari seluruh arsip (kode shell sampel ini hanya melakukan ini) tetapi checksum untuk setiap file individu dalam arsip.

Saya telah mempelajari opsi GNU tar, Pax, Star. Saya telah melihat sumber dari Archive :: Tar . Saya tidak melihat cara yang jelas untuk mencapai ini. Sepertinya saya harus membangun sendiri sesuatu dalam C atau serupa untuk mencapai apa yang saya butuhkan. Perl / Python / etc tidak akan memotong kinerja-bijaksana, dan berbagai program tar kehilangan "arsitektur plugin" yang diperlukan. Adakah yang tahu solusi yang ada untuk ini sebelum saya mulai kode-churning?

wazoox
sumber
3
Tentunya terdengar seperti tambahan yang berguna tarjika Anda memutuskan untuk menulisnya;)
1
Bukan pertanyaan Anda, tetapi dengan 7zAnda dapat memilih hash dan mencetaknya dengan cara yang sha1sumdan sha256sumdapat memahami: 7zip.bugaco.com/7zip/7zip_15_09/MANUAL/cmdline/commands/… (dan sami-lehtinen.net/blog/… ) Cobalah: 7z h -scrcsha256 mydir/* | sed --regexp-extended 's, +[0-9]+ +, ,g' > mydir.sha256sum ; sha256sum -c mydir.sha256sum(diuji dengan p7zip Versi 15.09 beta)
Nemo

Jawaban:

15

Sebelum melanjutkan dan menulis ulang tar, Anda mungkin ingin membuat profil metode membaca data yang cepat dan mudah dua kali, karena mungkin tidak jauh lebih lambat daripada melakukannya dalam satu kali jalan.

Metode dua pass diterapkan di sini:

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

dengan one-liner:

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

Walaupun benar bahwa md5sum membaca setiap file dari disk secara paralel dengan tar, alih-alih mendapatkan data yang dialirkan melalui pipa, cache disk Linux harus membuat bacaan kedua ini menjadi pembacaan sederhana dari buffer memori, yang seharusnya tidak lebih lambat daripada a stdin baca. Anda hanya perlu memastikan Anda memiliki cukup ruang dalam cache disk Anda untuk menyimpan cukup setiap file sehingga pembaca ke-2 selalu membaca dari cache dan tidak mendapatkan cukup jauh di belakang untuk harus mengambil dari disk

bk.
sumber
3
Ini benar-benar berfungsi dengan sangat baik, terlihat dibatasi oleh kemampuan CPU untuk menggeret md5 (~ 280MB / s pada satu inti).
wazoox
4

Berikut ini contoh skrip Python. Ini menghitung checksum file sebagai yang ditambahkan ke arsip. Di akhir skrip, file checksum ditambahkan ke arsip.

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

Ketika Anda menghapus, gunakan chksum_file untuk memverifikasi checksum

pengguna37841
sumber
1
Ya itu sesuatu seperti ini yang saya pikirkan, tetapi biasanya perpustakaan semacam ini memuat file dalam RAM sebelum memanipulasinya, dan file saya setidaknya 20 GB ....
wazoox
1

Saya pikir masalah Anda adalah masalah desain tar karena tar tidak memungkinkan akses / posisi acak di dalam file arsip melalui tabel konten, sehingga semua protokol akan berupa file dan bukan berbasis buffer.
Dengan demikian Anda dapat melihat berbagai format seperti PAX atau DAR yang memungkinkan akses acak.

weismat
sumber
1
Sayangnya output tar adalah wajib, karena itu alur kerjanya berdasarkan.
wazoox
0

Format arsip terbaru umumnya menyertakan beberapa hash untuk verifikasi file, tetapi mereka memiliki masalah serupa: Anda tidak selalu dapat memilih fungsi hashing Anda sendiri, atau menyimpan salinan hash lokal.

Anda mungkin ingin menyimpan salinan hash lokal, berbeda dari yang tertanam di arsip itu sendiri: misalnya jika arsip disimpan offline (pada kaset atau pusat data yang mahal untuk dibaca) dan Anda ingin memverifikasi salinan lokal dari suatu file / direktori.

7zip memiliki beberapa opsi seperti 7z hdengan hash kustom dan 7z l -sltuntuk daftar semua hash dan yang lainnya, tetapi bagaimana jika Anda ingin daftar hash md5 atau sha1? Anda dapat menggunakan -bbdan-bs untuk mengendalikan verbositas dan menggunakan kembali metode George Notaras yang disebutkan dalam jawaban yang diterima:

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
sumber