การสร้างไฟล์ tar พร้อม checksums รวมอยู่ด้วย


16

นี่คือปัญหาของฉัน: ฉันต้องเก็บถาวรเพื่อ tar ไฟล์จำนวนมาก (สูงสุด 60 TB) ของไฟล์ขนาดใหญ่ (โดยปกติ 30 ถึง 40 GB ต่อไฟล์) ฉันต้องการทำการตรวจสอบไฟล์ (md5, sha1, อะไรก็ตาม) ของไฟล์เหล่านี้ก่อนทำการเก็บถาวร อย่างไรก็ตามการไม่อ่านทุกไฟล์สองครั้ง (หนึ่งครั้งสำหรับการตรวจสอบสองครั้งสำหรับ tar'ing) มีความจำเป็นมากหรือน้อยกว่าเพื่อให้ได้ประสิทธิภาพการเก็บถาวรที่สูงมาก (LTO-4 ต้องการ 120 MB / s อย่างยั่งยืนและหน้าต่างสำรองมี จำกัด )

ดังนั้นฉันต้องการวิธีการอ่านไฟล์ให้อาหารตรวจสอบเครื่องมือในด้านหนึ่งและสร้าง tar เพื่อเทปในด้านอื่น ๆ บางสิ่งตาม:

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

ยกเว้นว่าฉันไม่ต้องการให้เช็กซัมของไฟล์เก็บถาวรทั้งหมด (เชลล์โค้ดตัวอย่างทำแค่นี้) แต่เป็นเช็คซัมสำหรับไฟล์แต่ละไฟล์ในไฟล์เก็บถาวร

ฉันศึกษา GNU tar, Pax, Star options เราได้ตรวจสอบแหล่งที่มาจากเอกสารเก่า :: ต้า ฉันไม่เห็นวิธีที่ชัดเจนในการบรรลุเป้าหมายนี้ ดูเหมือนว่าฉันจะต้องสร้างบางสิ่งบางอย่างใน C หรือคล้ายกันเพื่อให้บรรลุสิ่งที่ฉันต้องการ Perl / Python / etc จะไม่ลดทอนประสิทธิภาพการทำงานและโปรแกรม tar ต่าง ๆ พลาด "สถาปัตยกรรมปลั๊กอิน" ที่จำเป็น ไม่มีใครรู้วิธีแก้ปัญหาที่มีอยู่ก่อนที่ฉันจะเริ่มการปั่นโค้ด?


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 เบต้า)
Nemo

คำตอบ:


15

ก่อนที่จะไปข้างหน้าและเขียน tar ใหม่คุณอาจต้องการทำโพรไฟล์วิธีที่รวดเร็วและง่ายต่อการอ่านข้อมูลสองครั้งเนื่องจากอาจไม่ช้ากว่าการทำในครั้งเดียว

วิธีการส่งผ่านสองวิธีถูกฝังที่นี่:

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 กำลังอ่านแต่ละไฟล์จากดิสก์ขนานกับ tar แทนที่จะรับข้อมูลที่ส่งผ่านไปป์ แต่การแคชดิสก์ของ Linux ควรทำให้วินาทีนี้อ่านง่าย ๆ อ่านจากบัฟเฟอร์หน่วยความจำซึ่งไม่ควรช้ากว่า อ่าน stdin คุณเพียงแค่ต้องแน่ใจว่าคุณมีพื้นที่ว่างเพียงพอในดิสก์แคชของคุณเพื่อจัดเก็บไฟล์แต่ละไฟล์ให้เพียงพอที่ตัวอ่านที่ 2 มักจะอ่านจากแคชและไม่ได้รับไกลพอที่จะต้องดึงจากดิสก์


3
มันใช้งานได้ดีจริง ๆ มันดูถูก จำกัด ด้วยความสามารถของซีพียูในการกระทืบ md5 (~ 280MB / s บนหนึ่งคอร์)
wazoox

4

นี่คือตัวอย่างของสคริปต์ Python มันจะคำนวณเช็กซัมของไฟล์เป็นการเพิ่มลงในไฟล์เก็บถาวร ในตอนท้ายของสคริปต์ไฟล์เช็คซัมจะถูกเพิ่มลงในไฟล์เก็บถาวร

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

เมื่อคุณ untar ใช้ chksum_file เพื่อตรวจสอบ checksum


1
ใช่นั่นคือสิ่งที่ฉันคิด แต่โดยปกติแล้วไลบรารีประเภทนี้จะโหลดไฟล์ใน RAM ก่อนจัดการและไฟล์ของฉันมีอย่างน้อย 20 GB ....
wazoox

1

ฉันคิดว่าปัญหาของคุณเป็นปัญหาการออกแบบของ tar เนื่องจาก tar ไม่อนุญาตการเข้าถึง / การวางตำแหน่งแบบสุ่มภายในไฟล์เก็บถาวรผ่านตารางเนื้อหาดังนั้นโปรโตคอลทั้งหมดจะเป็นไฟล์ไม่ใช่บัฟเฟอร์ตาม
ดังนั้นคุณอาจดูรูปแบบที่แตกต่างกันเช่น PAX หรือ DAR ซึ่งอนุญาตให้เข้าถึงแบบสุ่ม


1
น่าเสียดายที่การส่งออก tar เป็นสิ่งจำเป็นเนื่องจากเป็นสิ่งที่เวิร์กโฟลว์ยึดถือ
wazoox

0

รูปแบบที่เก็บถาวรล่าสุดมักจะมีแฮชบางส่วนสำหรับการตรวจสอบไฟล์ แต่มีปัญหาที่คล้ายกัน: คุณไม่สามารถเลือกฟังก์ชั่นการแฮ็กของคุณเองหรือเก็บสำเนาแฮชในเครื่องได้

คุณอาจต้องการบันทึกสำเนาของแฮชในเครื่องซึ่งแตกต่างจากสำเนาที่ฝังอยู่ในไฟล์เก็บถาวรของตัวเอง: ตัวอย่างเช่นหากไฟล์เก็บถาวรถูกเก็บไว้ออฟไลน์ (บนเทปหรือศูนย์ข้อมูลที่แพงในการอ่าน) และคุณต้องการตรวจสอบ สำเนาโลคัลของไฟล์ / ไดเร็กทอรี

7zipมีหลายตัวเลือกเช่นเดียว7z hกับแฮชที่กำหนดเองและ7z l -sltรายการแฮชทั้งหมดและอะไร แต่ถ้าคุณต้องการรายการของ md5 หรือ sha1 แฮช? คุณสามารถใช้-bbและ-bsควบคุมการใช้คำฟุ่มเฟื่อยและใช้วิธี George Notaras ที่กล่าวถึงในคำตอบที่ยอมรับได้:

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.