มีสคริปต์การคัดลอกซ้ำที่ใช้ btrfs CoW เป็น deduplication หรือไม่?


9

กำลังมองหาเครื่องมือการขจัดข้อมูลซ้ำซ้อนบน Linux มีมากมายให้ดูเช่นหน้าวิกินี้

สคริปต์ทั้งหมดจะทำการตรวจจับเพียงอย่างเดียวพิมพ์ชื่อไฟล์ซ้ำหรือลบไฟล์ที่ซ้ำกันออกโดยเชื่อมโยงไปยังสำเนาเดียว

ด้วยการเพิ่มขึ้นของ btrfs จะมีตัวเลือกอื่น: การสร้างสำเนา (คัดลอกเมื่อเขียน) ของไฟล์ (เช่นcp reflink=always) ฉันไม่พบเครื่องมือใด ๆ ที่ทำสิ่งนี้มีใครรู้บ้างเกี่ยวกับเครื่องมือที่ทำสิ่งนี้


ปรับปรุง: สาขาการพัฒนาของ rmlint และฉันเชื่อว่าหลักยังเพิ่มต่อไปนี้: 1) hashing ไฟล์ที่เพิ่มขึ้น มันจะไม่แฮชไฟล์อีกเว้นแต่ว่ามันจะมีการเปลี่ยนแปลงตั้งแต่การใช้งานครั้งล่าสุด [ที่ยิ่งใหญ่] 2) เพิ่มขึ้นdeduping มันเป็นเพียงไฟล์ซ้ำซ้อนที่ยังไม่เคยมีหรือมีการเปลี่ยนแปลง [นั่นคือ huger] รวมกับไฟล์ hashing เท่านั้นหลังจากวิธีการเปรียบเทียบอย่างรวดเร็วอื่น ๆ ทั้งหมดล้มเหลวทำให้ไม่สามารถเอาชนะได้ Bedup ถูกทอดทิ้งและเห็นได้ชัดว่าจะไม่รวบรวม ฉันทำการเปรียบเทียบโดยละเอียด: docs.google.com/spreadsheets/d/…
Jim

คำตอบ:


17

ฉันเขียนbedupเพื่อจุดประสงค์นี้ มันรวมการสแกน btree ที่เพิ่มขึ้นกับการขจัดความซ้ำซ้อน CoW ใช้งานได้ดีที่สุดกับ Linux 3.6 ซึ่งคุณสามารถเรียกใช้:

sudo bedup dedup

สวัสดี @Gririel ความคิดเห็นคำตอบของฉันด้านล่างระบุว่า "... bedup ... ใส่สิ่งต่าง ๆ ในถังขนาดและอ่านเฉพาะไฟล์ทั้งหมดเพื่อสร้าง checksums ถ้าจำเป็น" มันเป็นเรื่องจริงเหรอ? ถ้าเป็นเช่นนั้นฉันต้องการอัปเดตคำตอบของฉันด้านล่าง (และใช้ bedup ตัวเอง!) น่าเสียดายที่ฉันไม่สามารถยืนยันได้ทุกที่ ฉันลองใช้ Google ค้นหาหน้า Github ของคุณแล้วค้นหาด้วยรหัส ขอบคุณ
จิม

4

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

ซึ่งเจ็บปวดช้า

โปรแกรมอื่น ๆ ในทางกลับกันเช่น rdfind และ rmlint จะสแกนต่างกัน

rdfind มีคุณสมบัติ "ทดลอง" สำหรับการใช้ reflink btrfs (และตัวเลือก "แข็ง" สำหรับ hardlinks, symlinks ฯลฯ )

rmlint มีตัวเลือก "ทึบ" สำหรับ btrfs clone, reflink, hardlinks ปกติ, symlink, delete และคำสั่งที่คุณกำหนดเอง

แต่ที่สำคัญกว่า rdfind และ rmlint เป็นอย่างมีนัยสำคัญได้เร็วขึ้น ในขณะที่คำสั่งของขนาด แทนที่จะสแกนไฟล์เป้าหมายทั้งหมดสำหรับ checksums มันทำสิ่งนี้โดยประมาณ:

  • สแกนระบบไฟล์เป้าหมายทั้งหมดรวบรวมเพียงเส้นทางและขนาดไฟล์
  • ลบออกจากการพิจารณาไฟล์ที่มีขนาดไฟล์ไม่ซ้ำกัน เพียงอย่างเดียวนี้ช่วยประหยัดเวลาและกิจกรรมของดิสก์ ("Scads" เป็นฟังก์ชันเลขชี้กำลังอินเวอร์สแทนหรือสิ่งที่ตรงกันข้าม)
  • ของผู้สมัครที่เหลืออยู่ให้สแกน N ไบต์แรก ลบออกจากการพิจารณาไฟล์ที่มีขนาดเท่ากัน แต่ N ไบต์แรกต่างกัน
  • ทำเช่นเดียวกันสำหรับ N ไบต์สุดท้าย
  • เฉพาะส่วนที่เหลือ(โดยปกติจะเป็นเศษเล็ก ๆ ) ให้สแกนหาเช็คซัม

ข้อดีอื่น ๆ ของ rmlint ฉันรู้:

  • คุณสามารถระบุการตรวจสอบ md5 น่ากลัวเกินไปไหม ลอง sha256 หรือ 512 หรือเปรียบเทียบแบบบิตต่อบิต หรือฟังก์ชั่นคร่ำครวญของคุณเอง
  • มันให้ตัวเลือก Btrfs "clone" และ "reflink" ไม่ใช่แค่ reflink "cp --reflink = always" มีความเสี่ยงเพียงเล็กน้อยเนื่องจากไม่ใช่ปรมาณูจึงไม่ทราบว่าจะมีสิ่งใดเกิดขึ้นอีกในไฟล์นั้นในเคอร์เนลและจะไม่เก็บข้อมูลเมตาเสมอไป "Clone", OTOH (ซึ่งเป็นคำศัพท์สั้น ๆ ... ฉันกำลังลบชื่อที่เกี่ยวข้องกับ API อย่างเป็นทางการ) เป็นการเรียกระดับเคอร์เนลที่เป็นอะตอมและเก็บข้อมูลเมตา เกือบจะส่งผลให้เกิดสิ่งเดียวกันเสมอ แต่แข็งแรงกว่าและปลอดภัยกว่า (แม้ว่าโปรแกรมส่วนใหญ่จะฉลาดพอที่จะไม่ลบไฟล์ที่ซ้ำกัน แต่ถ้าไม่สามารถสร้าง reflink ชั่วคราวให้สำเร็จ)
  • มีตัวเลือกมากมายสำหรับการใช้งานหลายกรณี (ซึ่งเป็นข้อเสียเปรียบเช่นกัน)

ฉันเปรียบเทียบ rmlint กับ deduperemove - ซึ่งยังสแกนไฟล์เป้าหมายทั้งหมดสำหรับ checksums ด้วยเช่นกัน Duperemove ใช้เวลาหลายวันกับวอลลุ่มของฉันเพื่อให้เสร็จสมบูรณ์ (4 ฉันคิดว่า) เต็มเอียง fmlint ใช้เวลาสองสามชั่วโมงในการระบุรายการซ้ำจากนั้นใช้เวลาน้อยกว่าหนึ่งวันในการคัดลอกด้วย Btrfs

(ที่กล่าวว่าทุกคนที่พยายามเขียนและสนับสนุนคุณภาพซอฟต์แวร์ที่มีประสิทธิภาพและแจกฟรีขอสมควรได้รับความชื่นชมที่สำคัญ!)

Btw: คุณควรหลีกเลี่ยงการหักข้อมูลซ้ำโดยใช้การเชื่อมโยงแบบปกติเป็นวิธีการขจัดคำซ้ำซ้อน "ทั่วไป" โดยมีค่าใช้จ่ายทั้งหมด

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

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

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

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

แต่ข่าวดีก็คือการลบข้อมูลซ้ำด้วย Btrfs clone / reflink สามารถยกเลิกความเสียหายนั้นได้ (ฉันคิดว่า - ในระหว่างการสแกนคุณควรเห็นไฟล์ hardlinked เหมือนกัน ... ยกเว้นว่ามันมีเหตุผลที่จะไม่พิจารณา hardlink มันอาจจะขึ้นอยู่กับ ยูทิลิตีที่เฉพาะเจาะจงที่ทำการหักข้อมูล)


สิ่งนี้ไม่ถูกต้อง bedup ทำเช่นเดียวกันใส่สิ่งของในถังขนาดและอ่านเฉพาะไฟล์ทั้งหมดเพื่อสร้าง checksums หากจำเป็น นอกจากนี้ bedup จัดเก็บผลลัพธ์ของสิ่งนี้เพื่อให้การทำงานที่ตามมานั้นเร็วยิ่งขึ้น
ปีเตอร์ Smit

@PeterSmit ฉันต้องการอัปเดตคำตอบของฉัน (และลองเปลี่ยนกลับเป็น bedup ด้วยตัวเอง) หากฉันสามารถยืนยันส่วนแรกของความคิดเห็นของคุณได้ github readme ของ Bedup ไม่ได้พูดถึงและการค้นหา "ขนาดไฟล์" หรือ "ขนาดไฟล์" ไม่ได้คำตอบที่ชัดเจน ฉันจะยืนยันได้อย่างไร
จิม

นอกจากนี้ bedup ดูเหมือนจะถูกทอดทิ้งในช่วง 3 ปีที่ผ่านมา ซึ่งเป็นความอัปยศเพราะดูเหมือนว่าเป็นความคิดที่ยอดเยี่ยมจริงๆที่ฉันชอบที่จะใช้! ฉันหวังว่าคุณจะหยิบมันขึ้นมา
Jim
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.