อาจคิดว่าการ--link-dest
เข้าสู่ไฟล์ที่เหมือนกันอาจใช้ได้ในทุกกรณี แต่มันไม่ได้เมื่อไฟล์ที่มีอยู่แม้ว่าไฟล์จะล้าสมัย / มีเนื้อหาที่แตกต่างกัน
เป็นเพราะสิ่งนี้จากหน้า rsync ของมนุษย์ใน--link-dest
:
"ตัวเลือกนี้ทำงานได้ดีที่สุดเมื่อคัดลอกไปยังลำดับชั้นปลายทางที่ว่างเปล่าเนื่องจาก rsync จะถือว่าไฟล์ที่มีอยู่นั้นชัดเจน (ดังนั้นrsync จะไม่ดูใน link-dest dirs เมื่อไฟล์ปลายทางมีอยู่แล้ว ")
ซึ่งหมายความว่าหากy/file
มีอยู่เหมือนแหล่งที่มาและz/file
ล้าสมัย
rsync -a --del -link-dest=y source:/file z
จะส่งผลให้ inodes สองตัว (และสองเท่าของพื้นที่ใช้งาน) ถูกใช้งานy/file
และz/file
ซึ่งจะมีเนื้อหาและ datestamps เดียวกัน
ฉันเจอสิ่งนี้เพราะฉันสำรองข้อมูลทุกวันโดยพื้นฐานแล้วสคริปต์นี้รันวันละครั้ง
mv $somedaysago $today;
yest=$today; today=`date +%Y%m%d`;
rsync -avPShyH --del --link-dest=../$yest host:/dirs $today
เนื่องจากการสำรองข้อมูลของฉันครอบคลุมไฟล์มากถึง 10M การดำเนินการrm -rf $olddir; rsync source:$dir newdir
ใช้เวลานานเกินไป (โดยเฉพาะเมื่อ 0.5% ของไฟล์ที่เปลี่ยนต่อวันทำให้เกิดการลบและการสร้างรายการ dir 10M เพื่อจัดการไฟล์ใหม่หรือไฟล์ที่เปลี่ยนแปลง 50K ซึ่งทำให้ฉัน การสำรองข้อมูลไม่สมบูรณ์ในเวลาสำหรับวันถัดไป)
นี่คือตัวอย่างของสถานการณ์:
a
เป็นแหล่งที่มาของเรา1
ผ่าน4
เป็นข้อมูลสำรองหมายเลขของเรา:
$ mkdir -p 1 2; echo foo > 1/foobar; cp -lrv 1/* 2
`1/foobar' -> `2/foobar'
$ ls -i1 */foobar
1053003 1/foobar
1053003 2/foobar
$ mkdir a; echo quux > a/foobar
$ mv 1 3; rsync -avPhyH --del --link-dest=../2 a/ 3
sending incremental file list
./
foobar
5 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/2)
sent 105 bytes received 34 bytes 278.00 bytes/sec
total size is 5 speedup is 0.04
$ ls -i1 */foobar
1053003 2/foobar
1053007 3/foobar
1053006 a/foobar
$ mv 2 4; rsync -avPhyH --del --link-dest=../3 a/ 4
sending incremental file list
./
foobar
5 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/2)
sent 105 bytes received 34 bytes 278.00 bytes/sec
total size is 5 speedup is 0.04
$ ls -il1 */foobar
1053007 -rw-r--r-- 1 math math 5 Mar 30 00:57 3/foobar
1053008 -rw-r--r-- 1 math math 5 Mar 30 00:57 4/foobar
1053006 -rw-r--r-- 1 math math 5 Mar 30 00:57 a/foobar
$ md5sum [34a]/foobar
d3b07a382ec010c01889250fce66fb13 3/foobar
d3b07a382ec010c01889250fce66fb13 4/foobar
d3b07a382ec010c01889250fce66fb13 a/foobar
ตอนนี้เรามีการสำรองข้อมูล 2 ชุดa/foobar
ที่เหมือนกันทุกวิธีรวมถึงการประทับเวลา แต่มี inodes ที่แตกต่างกัน
อาจคิดว่าจะมีวิธีแก้ปัญหา--delete-before
ซึ่งฆ่าผลประโยชน์ของการสแกนที่เพิ่มขึ้น แต่สิ่งนี้ไม่ได้ช่วยอย่างใดอย่างหนึ่งเนื่องจากไฟล์จะไม่ถูกลบ แต่ใช้เป็นพื้นฐานในกรณีที่มีการทำสำเนาแบบเพิ่มขึ้น
เราอาจคาดเดาเพิ่มเติมได้จากนั้นเราสามารถปิดการป้องกันความเสี่ยงที่เพิ่มขึ้นนี้คัดลอก--whole-file
แต่ไม่ได้ช่วยอัลกอริทึมใด ๆ ไม่มีวิธีที่จะได้รับสิ่งที่เราต้องการ
ฉันพิจารณาพฤติกรรมนี้อีกข้อผิดพลาดใน rsync ซึ่งพฤติกรรมที่เป็นประโยชน์อาจถูกตีความจากการเลือกอย่างระมัดระวังของอาร์กิวเมนต์คำสั่งต่าง ๆ แต่ผลลัพธ์ที่ต้องการไม่สามารถใช้ได้
วิธีการแก้ปัญหาน่าเสียดายที่จะย้ายจาก rsync เดียวเป็นการดำเนินการแบบปรมาณูไปยังการดำเนินการแบบแห้งด้วย-n
การบันทึกการประมวลผลบันทึกนั้นเป็นอินพุตไปยังการลบไฟล์ที่ถูกเปลี่ยนล่วงหน้าทั้งหมดด้วยตนเองจากนั้นทำงานrsync --link-dest
เพื่อให้ได้สิ่งที่เราต้องการ เปรียบเทียบกับ rsync ใหม่ทั้งหมด
ภาคผนวก:พยายามเชื่อมโยงล่วงหน้า$yesterday
และ$today
บนเซิร์ฟเวอร์สำรองก่อนทำการสำรองข้อมูลกับกล่องผลิตด้วยrsync --link-dest=../$yesterday $yesterday/ $today
- แต่ผลลัพธ์เดียวกัน - ไฟล์ใด ๆ ที่มีอยู่ไม่ว่าจะด้วยวิธีใดก็ตามแม้ความยาว 0 จะไม่ถูกลบออกและเชื่อมโยงปลายทางแทน สำเนาใหม่จะทำจาก sourcedir พร้อม inode ใหม่และใช้พื้นที่ดิสก์มากขึ้น
มองpax(1)
ว่าเป็นวิธีการเชื่อมโยงล่วงหน้าก่อนการสำรองข้อมูลที่เป็นไปได้
--delete-after
ใช้ได้ แต่ไม่เกี่ยวข้องกับปัญหาที่เกิดขึ้น ไฟล์ที่หายไปจากแหล่งที่มาจะถูกลบหลังจากคัดลอกเสร็จแล้ว ปัญหาที่ฉันอธิบายเกี่ยวกับการสำรองข้อมูลที่ทำในวันนี้เหมือนกับของเมื่อวาน แต่เทียบกับไฟล์เก่าที่ล้าสมัยที่ไม่ได้เชื่อมโยงกับ inode ของเมื่อวานนี้ แต่เก็บไว้เป็นไฟล์ใหม่ที่พื้นที่ดิสก์สองเท่าเมื่อวาน ถือว่าเป็นสำเนาที่เหมือนกัน
rsnapshot
ไหม นอกจากนี้ให้ลองเขียนสคริปต์ขนาดเล็กเพื่อเชื่อมโยงไฟล์ "ที่เหมือนกัน" อีกครั้ง ฉันทำทั้งสองอย่างในระบบของฉัน
hardlink(1)
ช้า (ช้ากว่าการสแกนข้อมูลเมตาของ rsync 15 เท่า); pax
เร็วกว่า แต่ใช้หัว HDD เปรียบเทียบข้อมูลสำรองเก่ากับใหม่ rsync -n
เพื่อรับรายการเดลต้าหมายถึงการกดปุ่มเซิร์ฟเวอร์การผลิตสองครั้ง (การสแกนไฟล์ 10M นั้นส่งผลกระทบมากกว่าการคัดลอกการเปลี่ยนแปลง 50K) ป่วยส่งรายการเกี่ยวกับตัวเลือกใน rsync เพื่อให้สิ่งนี้
--delete-after
ในสถานการณ์การใช้งานนี้เกิดอะไรขึ้นกับสิ่งนี้?