เครื่องมือหรือสคริปต์เพื่อตรวจจับไฟล์ที่ถูกย้ายหรือเปลี่ยนชื่อบน Linux ก่อนสำรองข้อมูล [ปิด]


15

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

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

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

นี่คือรายการของคุณสมบัติ "ทั่วไป" ของไฟล์:

  1. ไฟล์ที่ไม่มีการเปลี่ยนแปลงขนาดใหญ่
  2. พวกเขาสามารถเปลี่ยนชื่อหรือย้ายไปรอบ ๆ

[แก้ไข:]สิ่งเหล่านี้เป็นคำตอบที่ดีและสิ่งที่ฉันทำในตอนท้ายคือการดูคำตอบทั้งหมดและจะเขียนรหัสเพื่อจัดการกับสิ่งนี้ โดยพื้นฐานแล้วสิ่งที่ฉันคิด / กำลังทำอยู่ตอนนี้คือ:

  1. การใช้บางอย่างเช่น AIDE สำหรับการสแกนแบบ "เริ่มต้น" และทำให้ฉันสามารถเก็บไฟล์เช็คซัมไว้ในไฟล์เพราะพวกเขาไม่ควรเปลี่ยนดังนั้นมันจะช่วยในการตรวจจับความเสียหาย
  2. การสร้าง inotify daemon ที่จะตรวจสอบไฟล์ / ไดเร็กทอรีเหล่านี้และบันทึกการเปลี่ยนแปลงที่เกี่ยวข้องกับการเปลี่ยนชื่อและย้ายไฟล์ไปยังล็อกไฟล์
  3. มีบางกรณีที่ขอบ inotify อาจล้มเหลวที่จะบันทึกว่าสิ่งที่เกิดขึ้นกับระบบไฟล์ที่มีจึงมีขั้นสุดท้ายขั้นตอนของการใช้การค้นหาเพื่อค้นหาระบบไฟล์สำหรับไฟล์ที่มีเวลาการเปลี่ยนแปลงหลังกว่าการสำรองข้อมูลล่าสุด

สิ่งนี้มีประโยชน์หลายประการ:

  1. Checksums / etc จาก AIDE เพื่อให้สามารถตรวจสอบ / ตรวจสอบให้แน่ใจว่าสื่อบางประเภทไม่เสียหาย
  2. Inotify ทำให้การใช้ทรัพยากรต่ำและไม่จำเป็นต้องสแกนระบบไฟล์ซ้ำไปซ้ำมา
  3. ไม่จำเป็นต้องแก้ไข rsync; หากฉันต้องแก้ไขสิ่งที่ฉันทำได้ แต่ฉันต้องการหลีกเลี่ยงการแก้ไขสิ่งต่าง ๆ เพื่อลดภาระให้น้อยลง (IE ไม่จำเป็นต้องทำการปะซ้ำทุกครั้งที่มีการอัปเดต)
  4. ฉันเคยใช้ Unison มาก่อนและมันดีจริง ๆ แต่ฉันสามารถสาบานได้ว่า Unison จะเก็บสำเนาไว้ในระบบแฟ้มและไฟล์ "เก็บถาวร" ของมันสามารถเติบโตได้ค่อนข้างใหญ่ใช่ไหม

คำตอบ:


7

พร้อมเพรียงhttp://www.cis.upenn.edu/~bcpierce/unison/อ้างว่าสามารถตรวจจับการเคลื่อนไหวและเปลี่ยนชื่อ

มีแพทช์สองถึง rsync เพื่อเพิ่มการตรวจจับการย้าย / เปลี่ยนชื่อ:

http://gitweb.samba.org/?p=rsync-patches.git;a=blob;f=detect-renamed-lax.diff;h=1ff593c8f97a97e8970d43ff5a62dfad5abddd75;hb=master

http://gitweb.samba.org/?p=rsync-patches.git;a=blob;f=detect-renamed.diff;h=c3e6e846eab437e56e25e2c334e292996ee84345;hb=master

รายการ Bugzilla ที่ติดตามปัญหานี้: https://bugzilla.samba.org/show_bug.cgi?id=2294


6
เหตุใดแพทช์เหล่านี้จึงไม่รวมกัน พวกเขาเพิ่งเพิ่มธงพวกเขาไม่ล่วงล้ำ แพทช์ที่น่าสนใจอีกอย่างคือrsyncsumsซึ่งสามารถเก็บ checksums รอบ ๆ ระหว่างการทำงานของ rsync
Tobu

5

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

แค่ความคิด


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

@Pharaun คุณต้องการดัชนี git โดยไม่มีที่เก็บ blob อาจฉีกโค้ดนี้ออกจาก git แล้วเพิ่มลงใน libgit2
Tobu

รหัสที่เกี่ยวข้องเริ่มต้นด้วย refresh_index ใน read-cache.c
Tobu

5

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

ฉันต้องการให้คุณสมบัติสำรองข้อมูลคอลเลกชันภาพยนตร์ของฉันไว้ในฮาร์ดดิสก์ตัวที่สองเมื่อทำการซิงค์โฟลเดอร์ใหม่

ตอนนี้ฉันพบสคริปต์ C ง่าย ๆ นี้http://sourceforge.net/projects/movesync/

ดูเหมือนว่าจะทำงานได้ดี เรียกใช้แล้วซิงค์ตามปกติด้วยเช่นพร้อมเพรียง


4

คุณอาจสามารถใช้IDS ที่ใช้โฮสต์เช่นAIDEและเขียนสคริปต์ wrapper โดยใช้เอาต์พุต คุณอาจจะต้องเขียนลอจิกที่ซับซ้อนมากขึ้นเมื่อพิจารณาถึงผลรวมตรวจสอบ

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


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

3

คุณอาจลองพร้อมเพรียง ; โดยเฉพาะอย่างยิ่ง

-xferbycopying ปรับการถ่ายโอนให้เหมาะสมโดยใช้การคัดลอกในเครื่อง

ตัวเลือกที่กล่าวถึงในเอกสารเป็น

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

ดูเหมือนว่าอาจทำสิ่งที่คุณต้องการ


จริง ๆ แล้วในปัญหาหลังเหตุการณ์ฉันอาจรีบร้อนเกินไปที่ความคิดเห็นพร้อมเพรียงกัน พร้อมเพรียงรองรับการแทนที่ฮาร์ดลิงก์ด้วยเนื้อหาไฟล์จริงหรือไม่ถ้ามันเปลี่ยน? ถ้าเป็นเช่นนั้นฉันอาจจะสามารถทำเวทย์มนตร์ด้วย rsnapshot + พร้อมเพรียงซึ่งจะตอบสนองความต้องการของฉันโดยไม่ต้องเขียนรหัส / บันทึก / etc ใหม่ ๆ เพื่อจัดการกับสิ่งนี้
ฟาโรห์

3

Syrepทำในสิ่งที่คุณต้องการ มันทำให้ข่าวสารย่อยบนทรีไฟล์ทันสมัย; การแยกข้อมูลย่อยทำให้มีประสิทธิภาพมากกว่า rsync มันถูกออกแบบมาสำหรับ sneakernet ดังนั้นคุณอาจต้องการเพิ่ม wrapper ที่ทำการอัพเดต / makepatch / merge ในคราวเดียว


2

ฉันไม่แน่ใจว่ามีเครื่องมือที่มีอยู่สำหรับคุณหรือไม่ แต่คุณสามารถเขียนสคริปต์แบบง่าย ๆ ที่เพิ่งรันfindบนไดเรกทอรีฐานที่mtimeใหม่กว่าการสำรองข้อมูลล่าสุด นี้คุณจะได้รับรายชื่อของไฟล์ทั้งหมดที่ได้รับการแก้ไข หากไฟล์ถูกย้ายไฟล์จะไม่ปรากฏในรายการ น่าเสียดายที่รายการนี้จะรวมไดเรกทอรีที่ไฟล์ย้ายเข้ามาเนื่องจากไดเรกทอรีจะได้รับการอัพเดตเมื่อมีการเพิ่ม / ลบไฟล์

ด้วยรายการไฟล์นั้นคุณสามารถใช้ rsync เพื่อซิงค์ไฟล์เหล่านั้นเท่านั้น rsync มีตัวเลือกให้อ่านในรายการไฟล์ นี่คือการทดสอบที่แสดงตัวอย่างนี้:

$ cd tmp
$ echo test > test
$ ls -la
total 16
drwxr-xr-x 2 root root 4096 Aug 18 11:34 .
drwxr-x--- 5 root root 4096 Aug 18 11:34 ..
-rw-r--r-- 1 root root    5 Aug 18 11:34 test
$ mkdir tmp2
$ find . -mmin 1
$ date
Wed Aug 18 11:35:10 EDT 2010
$ find . -mmin 1
$ find . -mmin 2
.
./test
./tmp2
$ mv test tmp2
$ find . -mmin 1
.
./tmp2

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

ฉันหวังว่านี่จะช่วยได้.


2

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

ที่ระดับระบบไฟล์

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

ฟิวส์ทำให้การออกแบบระบบไฟล์ค่อนข้างง่ายด้วยข้อกำหนดเฉพาะที่อยู่ด้านบนของ“ ระบบไฟล์จริง” ฉันไม่เคยใช้มัน แต่LoggedFSดูมีแนวโน้ม

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

ที่ระดับเสียง

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

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


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

แต่นั่น logFS ดูเหมือนว่าโครงการที่น่าสนใจเพียงกังวลว่าพวกเขาหยุด dev ใน 2008/09 จะต้องเล่นกับมันและดูว่ามันจะทำเคล็ดลับ
ฟาโรห์

0

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

ฉันสร้างสคริปต์ Python ง่าย ๆ เพื่อตรวจจับการเปลี่ยนชื่อ / ย้ายไฟล์และไดเรกทอรีโดยใช้หมายเลข inode (* nix เท่านั้น) และเล่นซ้ำการเปลี่ยนแปลงเหล่านี้บนเครื่องซิงโครไนซ์ คุณสามารถใช้งานได้ด้วยตัวเองหรือเป็น "การเปลี่ยนชื่อโปรเซสเซอร์ล่วงหน้า" สำหรับ Unison หรือ rsync สามารถพบได้ที่นี่

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