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?
tar
jika Anda memutuskan untuk menulisnya;)7z
Anda dapat memilih hash dan mencetaknya dengan cara yangsha1sum
dansha256sum
dapat 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)Jawaban:
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:
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
sumber
Berikut ini contoh skrip Python. Ini menghitung checksum file sebagai yang ditambahkan ke arsip. Di akhir skrip, file checksum ditambahkan ke arsip.
Ketika Anda menghapus, gunakan chksum_file untuk memverifikasi checksum
sumber
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.
sumber
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 h
dengan hash kustom dan7z l -slt
untuk daftar semua hash dan yang lainnya, tetapi bagaimana jika Anda ingin daftar hash md5 atau sha1? Anda dapat menggunakan-bb
dan-bs
untuk mengendalikan verbositas dan menggunakan kembali metode George Notaras yang disebutkan dalam jawaban yang diterima:sumber