चेकसम के साथ एक टार फाइल बनाना शामिल है


16

यहाँ मेरी समस्या है: मुझे बड़ी फ़ाइलों (आमतौर पर 30 से 40 जीबी प्रत्येक) के लिए बहुत सारी (60 टीबी तक) फ़ाइलों को संग्रहीत करने की आवश्यकता है। मैं संग्रह करने से पहले इन फ़ाइलों के चेकसम (md5, sha1, जो भी हो) बनाना चाहूंगा; हालाँकि , हर फ़ाइल को दो बार नहीं पढ़ना (एक बार चेकसमिंग के लिए, दो बार tar'ing के लिए) बहुत अधिक संग्रहणीय प्रदर्शन प्राप्त करने के लिए कम-से-कम एक आवश्यकता है (LTO-4 120 MB / s निरंतर चाहता है, और बैकअप विंडो सीमित है)।

इसलिए मुझे एक फ़ाइल पढ़ने के लिए किसी तरह की आवश्यकता होगी, एक तरफ चेकसमिंग उपकरण खिलाना, और दूसरी तरफ टेप करने के लिए एक टार का निर्माण करना, कुछ साथ:

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

सिवाय इसके कि मैं पूरे संग्रह का चेकसम नहीं चाहता (यह नमूना शेल कोड सिर्फ यही करता है) लेकिन संग्रह में प्रत्येक व्यक्तिगत फ़ाइल के लिए एक चेकसम।

मैंने जीएनयू टार, पैक्स, स्टार विकल्पों का अध्ययन किया है। मैंने पुरालेख से स्रोत को देखा है :: टार । मैं इसे प्राप्त करने का कोई स्पष्ट तरीका नहीं देखता। ऐसा लगता है कि मुझे सी या कुछ इसी तरह की चीज़ों को हाथ से तैयार करना होगा। पर्ल / पायथन / आदि बस इसे प्रदर्शन-वार नहीं काटेंगे, और विभिन्न टार प्रोग्राम आवश्यक "प्लगइन आर्किटेक्चर" को याद करते हैं। क्या मुझे कोड-मंथन शुरू करने से पहले किसी को इसके मौजूदा समाधान का पता है?


3
निश्चित रूप से एक उपयोगी जोड़ की तरह लगता है tarअगर आप इसे लिखने का फैसला करते हैं;)

1
आपका प्रश्न नहीं, लेकिन 7zआप हैश का चयन कर सकते हैं और इसे इस तरह से प्रिंट कर सकते हैं sha1sumऔर sha256sumसमझ सकते हैं: 7zip.bugaco.com/7zip/7zip_15_09/MANUAL/cmdline/commands/… (और sami-lehtinen.net/blog/… ) इसे आज़माएँ: 7z h -scrcsha256 mydir/* | sed --regexp-extended 's, +[0-9]+ +, ,g' > mydir.sha256sum ; sha256sum -c mydir.sha256sum(p7zip संस्करण 15.09 बीटा के साथ परीक्षण किया गया)
निमो

जवाबों:


15

आगे जाने और टार पुनर्लेखन करने से पहले, आप डेटा को दो बार पढ़ने की त्वरित-और-आसान विधि को प्रोफ़ाइल करना चाह सकते हैं, क्योंकि यह एक पास में करने की तुलना में बहुत धीमा नहीं हो सकता है।

दो पास विधि यहाँ प्रस्तुत है:

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

एक-लाइनर के साथ:

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

हालांकि यह सच है कि md5sum डिस्क को टार के साथ समानांतर में प्रत्येक फ़ाइल को पढ़ रहा है, इसके बजाय पाइप के माध्यम से डेटा प्रवाहित होने के बजाय, लिनक्स डिस्क कैशिंग को मेमोरी बफर से इस दूसरे रीड को एक साधारण रीड बनाना चाहिए, जो वास्तव में धीमा नहीं होना चाहिए एक स्टडिन पढ़ा। आपको बस यह सुनिश्चित करने की आवश्यकता है कि आपके पास प्रत्येक फ़ाइल के लिए पर्याप्त डिस्क स्टोर करने के लिए आपके डिस्क कैश में पर्याप्त स्थान है जो कि 2 वाचक हमेशा कैश से पढ़ रहा है और डिस्क से पुनर्प्राप्त करने के लिए बहुत पीछे नहीं जा रहा है।


3
यह वास्तव में काफी ठीक काम करता है, यह सीपीयू द्वारा क्रंच md5 (एक कोर पर ~ 280 एमबी / एस) तक सीमित दिखता है।
वज़ोक्स

4

यहाँ एक उदाहरण पायथन लिपि है। यह फ़ाइल के चेकसम की गणना करता है क्योंकि इसे आर्काइव में जोड़ा जा रहा है। स्क्रिप्ट के अंत में, चेकसम फाइल को आर्काइव में जोड़ा जाता है।

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

जब आप अनटार करते हैं, तो चेकसम को सत्यापित करने के लिए chksum_file का उपयोग करें


1
हाँ यह कुछ ऐसा है, जिसके बारे में मैंने सोचा था, लेकिन आमतौर पर इस प्रकार की लाइब्रेरीज़ फ़ाइल को रैम में हेरफेर करने से पहले लोड कर देती हैं, और मेरी फाइलें कम से कम 20 जीबी की होती हैं ....
wazoox

1

मुझे लगता है कि आपकी समस्या टार का एक डिज़ाइन मुद्दा है क्योंकि टार सामग्री तालिका के माध्यम से संग्रह फ़ाइल के अंदर यादृच्छिक अभिगम / स्थिति की अनुमति नहीं देता है, इस प्रकार सभी प्रोटोकॉल फ़ाइल होंगे और बफर आधारित नहीं होंगे।
इस प्रकार आप PAX या DAR जैसे विभिन्न स्वरूपों को देख सकते हैं जो यादृच्छिक पहुँच की अनुमति देते हैं।


1
दुर्भाग्य से टार आउटपुट अनिवार्य है, क्योंकि यह वही है जो वर्कफ़्लो पर आधारित है।
वज़ोक्स

0

आम तौर पर हाल के अभिलेखों के प्रारूप में फ़ाइल सत्यापन के लिए कुछ हैश शामिल हैं, लेकिन उनके पास एक समान मुद्दा है: आप हमेशा अपने स्वयं के हैशिंग फ़ंक्शन का चयन नहीं कर सकते हैं, न ही हैश की एक स्थानीय प्रतिलिपि रख सकते हैं।

आप हैश की एक स्थानीय प्रतिलिपि को सहेजना चाहते हैं, जो संग्रह में एम्बेडेड एक से अलग है: उदाहरण के लिए यदि संग्रह ऑफ़लाइन संग्रहीत है (टेप या डेटा केंद्र जो पढ़ने के लिए महंगा है) और आप सत्यापित करना चाहते हैं एक फ़ाइल / निर्देशिका की स्थानीय प्रतिलिपि।

7zip में 7z hकस्टम हैश के साथ और 7z l -sltसभी हैश और व्हाट्सएप को सूचीबद्ध करने के लिए कई विकल्प हैं, लेकिन क्या होगा यदि आप md5 या sha1 हैश की सूची चाहते हैं? आप स्वीकार जवाब में उल्लिखित जॉर्ज नोटारस विधि का उपयोग कर सकते हैं -bbऔर-bs क्रियाशीलता को नियंत्रित कर सकते हैं :

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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.