diff / patch แบบไบนารีสำหรับไฟล์ขนาดใหญ่บน linux?


13

ฉันมีสองพาร์ติชั่นอิมเมจ (A และ B) และต้องการใช้มันเพื่อสร้างแพตช์ที่ฉันสามารถนำไปใช้กับ A บนคอมพิวเตอร์เครื่องอื่นเพื่อรับอิมเมจ B ใหม่โดยไม่ทำให้เครือข่ายท่วม ฉันมีข้อกำหนดดังต่อไปนี้:

  • ทำงานบน Linux
  • สามารถสร้างความแตกต่าง
  • สามารถใช้ diffs เพื่อแก้ไขไฟล์
  • สามารถจัดการกับไฟล์ไบนารี
  • สามารถจัดการไฟล์ขนาดใหญ่ได้ (ไม่กี่ร้อย GB ควรใช้งานได้)
  • ไม่ต้องมีการโต้ตอบกับผู้ใช้ (เพียงแอปพลิเคชันคอนโซล)
  • นึกคิดควรจะสามารถอ่านจาก / เขียนไปยังไพพ์ (เพื่อให้ฉันสามารถไพพ์ลงในไฟล์บีบอัด gzip และเขียนไปที่หนึ่ง)

มีบางอย่างที่มีอยู่จริงเหรอ?


ฉันกดปุ่ม Enter เร็วเกินไปเมื่อเริ่มการรับรางวัล นี่คือข้อความที่ฉันต้องการเพิ่ม:
Basj

คำตอบที่มีตัวอย่างที่ง่ายต่อการทำซ้ำrdiffจะมีประโยชน์สำหรับการอ้างอิงในอนาคต ตัวอย่าง: พูด Let 's file1และfile2มีสองไฟล์ที่คล้ายกันของแต่ละ 1GB 1) วิธีคำนวณ rdiff? 2) วิธีบันทึก rdiff นี้เป็นpatchไฟล์ได้อย่างไร 3) วิธีใช้patchไฟล์นี้กับfile1การกู้คืนfile2?
Basj

คำตอบ:


13

คุณอาจจะดูที่เครื่องมือ rsync ที่เกี่ยวข้องกับการนี้: rdiffและrdiff สำรอง rdiffคำสั่งช่วยให้คุณผลิตไฟล์แพทช์และใช้มันไปยังไฟล์อื่น ๆ บาง

rdiff-backupคำสั่งใช้วิธีการนี้ในการจัดการกับไดเรกทอรีทั้งหมด แต่ฉันคาดเดาคุณกำลังทำงานกับภาพดิสก์ไฟล์เดียวดังนั้นrdiffจะเป็นหนึ่งในการใช้งาน


1
"ลายเซ็น" และ "เดลต้า" หมายถึงอะไรสำหรับ rdiff? หน้าคนไม่พูด
Tor Klingberg

1
เพื่อตอบคำถามของฉันการสร้าง delta ด้วย rdiff เป็นกระบวนการสองขั้นตอน ขั้นแรกให้สร้างไฟล์ลายเซ็นจากไฟล์เก่าจากนั้นใช้ลายเซ็นและไฟล์ใหม่เพื่อสร้างเดลต้า พวกเขาสามารถทำงานร่วมกับrdiff signature oldfile | rdiff delta - newfile deltafile
Tor Klingberg

1
@TorKlingberg คุณช่วยโพสต์คำตอบใหม่ด้วยตัวอย่างได้ไหม? สมมติว่าfile1และfile2มีสองไฟล์ที่คล้ายกันของแต่ละ 1GB 1) วิธีคำนวณความต่าง 2) วิธีการบันทึกสิ่งนี้ลงในไฟล์แพทช์? 3) วิธีการใช้ไฟล์แพทช์นี้กับfile1การกู้คืนfile2?
Basj

7

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

bsdiffเป็นตัวเลือกอื่น แต่มันมาก RAM หิวและไม่เหมาะสมอย่างสมบูรณ์สำหรับอะไรขนาดของภาพดิสก์

bsdiffค่อนข้างหิวความจำ มันต้องใช้max(17*n,9*n+m)+O(1)หน่วยความจำไบต์ซึ่งnเป็นขนาดของไฟล์เก่าและmขนาดของไฟล์ใหม่ bspatchต้องใช้n+m+O(1)ไบต์


3

คำตอบที่ยอมรับได้

เกี่ยวกับrdiffโพสต์librsync 2.0.1 เป็นสิ่งที่ดีอ่านสำหรับการชี้แจงการทำงานของคำสั่งดังนั้นฉันได้อ้างอิงที่ด้านล่างเพื่อรักษาเนื้อหาในคำตอบนี้ถ้าไม่มีอะไรอื่น

มันเป็นสิ่งสำคัญเพื่อให้ได้รับความเข้าใจที่ดีของ rdiff สามขั้นตอนเพื่ออัปเดตไฟล์: ลายเซ็น , เดลต้าและแพทช์เป็นพูดคุยเกี่ยวกับในrdiffหน้าคน ฉันได้พบrdiffสคริปต์ตัวอย่างคำสั่งบน GitHub ที่เป็นประโยชน์ซึ่งฉันจะอ้างอิงและพูด

เป็นหลัก ...

  1. ด้วย "เริ่มต้น" หรือไฟล์ฐาน [ file1] และคุณสร้างไฟล์ลายเซ็นจากมัน
    • ซึ่งมักจะเล็กกว่าไฟล์ฐาน / ต้นฉบับมาก
  2. ด้วยไฟล์ลายเซ็นคุณเปรียบเทียบกับไฟล์อื่น [ file2] คล้ายกับไฟล์ฐานของคุณ แต่แตกต่างกัน ( เช่นอัปเดตล่าสุด ) และสร้างไฟล์เดลต้าที่มีเพียงความแตกต่างระหว่างสองไฟล์
  3. ใช้ "ความแตกต่างเท่านั้น" หรือไฟล์เดลต้าและเปรียบเทียบกับไฟล์ฐาน [ file1] เพื่อสร้างไฟล์ใหม่ที่มีการเปลี่ยนแปลงจากไฟล์อื่น [ file2] ที่ตรงกับทั้งสอง

คำสั่งด่วน (ต่อrdiff-example.sh)

rdiff signature file1 signature-file            ## signature base file1
rdiff delta signature-file file2 delta-file     ## delta differences file2
rdiff patch file1 delta-file gen-file           ## compare delta to file1 to create matching file2

rdiff-example.sh

# $ rdiff --help
# Usage: rdiff [OPTIONS] signature [BASIS [SIGNATURE]]
#              [OPTIONS] delta SIGNATURE [NEWFILE [DELTA]]
#              [OPTIONS] patch BASIS [DELTA [NEWFILE]]

# Options:
#   -v, --verbose             Trace internal processing
#   -V, --version             Show program version
#   -?, --help                Show this help message
#   -s, --statistics          Show performance statistics
# Delta-encoding options:
#   -b, --block-size=BYTES    Signature block size
#   -S, --sum-size=BYTES      Set signature strength
#       --paranoia            Verify all rolling checksums
# IO options:
#   -I, --input-size=BYTES    Input buffer size
#   -O, --output-size=BYTES   Output buffer size

# create signature for old file
rdiff signature old-file signature-file
# create delta using signature file and new file
rdiff delta signature-file new-file delta-file
# generate new file using old file and delta
rdiff patch old-file delta-file gen-file
# test
diff -s gen-file new-file
# Files gen-file and new-file are identical

บทนำ

rdiff เป็นโปรแกรมสำหรับคำนวณและใช้งาน delta เครือข่าย rdiff delta คือเดลต้าระหว่างไฟล์ไบนารีอธิบายว่าไฟล์พื้นฐาน (หรือเก่า) สามารถแก้ไขได้โดยอัตโนมัติเพื่อสร้างไฟล์ผลลัพธ์ (หรือใหม่)

แตกต่างจากโปรแกรม diff ส่วนใหญ่ librsync ไม่ต้องการการเข้าถึงไฟล์ทั้งสองเมื่อมีการคำนวณ diff การคำนวณเดลต้าต้องการเพียงแค่ "ลายเซ็น" สั้น ๆ ของไฟล์เก่าและเนื้อหาทั้งหมดของไฟล์ใหม่ ลายเซ็นต์ประกอบด้วย checksums สำหรับบล็อกของไฟล์เก่า การใช้ checksums เหล่านี้ rdiff ค้นหาบล็อกที่ตรงกันในไฟล์ใหม่แล้วคำนวณเดลต้า

rdiff deltas มักจะมีขนาดเล็กลงและช้ากว่าในการสร้างกว่า xdeltas หรือ diffs ข้อความปกติ หากเป็นไปได้ที่จะมีทั้งไฟล์เก่าและใหม่อยู่ในขณะที่คำนวณเดลต้า xdelta โดยทั่วไปจะสร้างไฟล์ที่เล็กกว่ามาก หากไฟล์ที่ถูกเปรียบเทียบเป็นข้อความล้วนแล้ว GNU diff จะเป็นทางเลือกที่ดีกว่าเนื่องจากมนุษย์สามารถดูได้และนำไปใช้กับการจับคู่แบบไม่แน่นอน

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

สัญลักษณ์

signature(basis-file) -> sig-file

delta(sig-file, new-file) -> delta-file

patch(basis-file, delta-file) -> recreated-file

ใช้รูปแบบ

แอปพลิเคชันทั่วไปของอัลกอริทึม rsync คือการถ่ายโอนไฟล์ A2 จากเครื่อง A ไปยังเครื่อง B ซึ่งมีไฟล์ A1 ที่คล้ายกัน สามารถทำได้ดังนี้:

  1. B สร้างลายเซ็น rdiff ของ A1 เรียกสิ่งนี้ว่า S1 B ส่งลายเซ็นไปที่ A. (โดยทั่วไปลายเซ็นจะเล็กกว่าไฟล์ที่อธิบาย)
  2. คำนวณเดลต้า rdiff ระหว่าง S1 และ A2 เรียกเดลต้านี้ D. A ส่งเดลต้าไปที่ B
  3. B ใช้เดลต้าเพื่อสร้าง A2 ในกรณีที่ A1 และ A2 มีจำนวนไบต์เท่ากัน rdiff ควรให้การประหยัดพื้นที่อย่างมีนัยสำคัญ

แหล่ง


1
ขอบคุณมาก!
Basj

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