Checksum'ları içeren bir tar dosyası oluşturma


16

İşte benim sorunum: Ben bir sürü (60 TB kadar) büyük dosyaları (genellikle her biri 30 ila 40 GB) tar dosyaları arşivlemek gerekir. Arşivlemeden önce bu dosyaların sağlama toplamlarını (md5, sha1, neyse) yapmak istiyorum; Ancak değil (tar'ing iki kez, checksumming kez) çok yüksek bir arşivleme performansı elde etmek veya daha az bir zorunluluktur iki kez her dosyayı okuma (LTO-4 120 MB / sürekli s istiyor ve yedekleme pencere sınırlıdır).

Bu yüzden bir dosyayı okumak, bir taraftaki bir sağlama toplamı aracını beslemek ve diğer taraftaki banda bir katran oluşturmak için bir yol bulmalıyım:

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

Dışında tüm arşiv checksum istemiyorum (bu örnek kabuk kodu sadece bunu yapar) ama arşivdeki her bir dosya için bir sağlama toplamı.

GNU katranı, Pax, Yıldız seçenekleri üzerine çalıştım. Archive :: Tar'dan kaynağa baktım . Bunu başarmanın açık bir yolu yok. İhtiyacım olanı elde etmek için C veya benzeri bir şeyi elle inşa etmem gerekecek gibi görünüyor. Perl / Python / etc sadece performans açısından kesmeyecek ve çeşitli katran programları gerekli "eklenti mimarisini" kaçırıyor. Kod karmaşasına başlamadan önce bunun için mevcut herhangi bir çözüm bilen var mı?


3
Kesinlikle taryazmaya karar verirseniz yararlı bir ek gibi görünüyor;)

1
Değil bir soru, ama ile 7zsize karma seçip bir şekilde yazdırabilirsiniz sha1sumve sha256sumanlayabiliyorum: 7zip.bugaco.com/7zip/7zip_15_09/MANUAL/cmdline/commands/... (ve sami-lehtinen.net/blog/... ) Deneyin: 7z h -scrcsha256 mydir/* | sed --regexp-extended 's, +[0-9]+ +, ,g' > mydir.sha256sum ; sha256sum -c mydir.sha256sum(p7zip Sürüm 15.09 beta ile test edildi)
Nemo

Yanıtlar:


15

Devam etmeden ve tar'ı yeniden yazmadan önce, verileri bir geçişte yapmaktan çok daha yavaş olmayabileceğinden, verileri hızlı ve kolay bir şekilde iki kez okumak için profil oluşturmak isteyebilirsiniz.

İki geçiş yöntemi buraya implant edilir:

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

tek astarlı:

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

Md5sum'un her dosyayı tar ile paralel olarak diskten okuduğu doğru olsa da, veriyi kanaldan akışa almak yerine, Linux disk önbelleklemesi, bu ikinci okumayı gerçekten daha yavaş olmaması gereken bir bellek arabelleğinden basit bir okuma yapmalıdır. bir stdin okudu. Disk okuyucunuzda, 2. okuyucunun her zaman önbellekten okuduğu ve diskten almak için yeterince geriye gitmediği her dosyadan yeterince depolamak için yeterli alana sahip olduğunuzdan emin olmanız gerekir.


3
Aslında oldukça iyi çalışıyor, md5'i (bir çekirdekteki ~ 280MB / s) crunch etme yeteneği ile sınırlı görünüyor.
wazoox

4

Örnek bir Python betiği. Dosyanın sağlama toplamını arşive eklenirken hesaplar. Komut dosyasının sonunda, sağlama toplamı dosyası arşive eklenir.

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

Yıldız işaretini kaldırdığınızda, sağlama toplamını doğrulamak için chksum_file dosyasını kullanın


1
Evet bu düşündüğüm gibi bir şey, ama genellikle bu tür kütüphaneler dosyayı işlemeden önce RAM'e yükler ve dosyalarım en az 20 GB'dir ....
wazoox

1

Tar'ın arşiv dosyası içinde rasgele erişime / konumlandırmaya izin vermediğinden, tar'ın bir tasarım sorunu olduğunu düşünüyorum, bu nedenle tüm protokoller dosya ve tampon tabanlı olmayacaktır.
Böylece, rasgele erişime izin veren PAX veya DAR gibi farklı biçimlere bakabilirsiniz.


1
Ne yazık ki katran çıktısı zorunludur, çünkü iş akışı buna dayanır.
wazoox

0

Son arşiv biçimleri genellikle dosya doğrulaması için bazı karma içerir, ancak benzer bir sorunu vardır: her zaman kendi karma işlevinizi seçemez veya karmaların yerel bir kopyasını tutamazsınız.

Arşivin kendisine gömülü olandan farklı olarak karmaların yerel bir kopyasını kaydetmek isteyebilirsiniz: örneğin, arşiv çevrimdışı olarak saklanmışsa (bantlarda veya okunması pahalı bir veri merkezinde) ve bir dosyanın / dizinin yerel kopyası.

7zip , 7z hözel karma ve 7z l -slttüm karmaları listelemek gibi çeşitli seçeneklere sahiptir ve ne olmasa da md5 veya sha1 karmalarının bir listesini isterseniz? Sen kullanabilirsiniz -bbve-bs kontrol ayrıntı ve kabul cevapta belirtildiği George Notaras yöntemini yeniden:

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.