`cp -al` snapshot ซึ่งฮาร์ดลิงก์จะถูกนำไปยังไฟล์ใหม่เมื่อทำการแก้ไข


11

ฉันกำลังพยายามถ่ายภาพรวมของโฟลเดอร์ขนาดใหญ่เป็นประจำ

ฉันได้อ่านที่นี่: http://www.mikerubel.org/computers/rsync_snapshots/#Incremental
ที่cp -alจะถ่ายภาพโฟลเดอร์โดยเพียงแค่คัดลอกลิงก์ฮาร์ดไดรฟ์

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

ฉันจะบรรลุสิ่งนั้นได้อย่างไร

ป.ล. ฉันพยายามrsync -a --delete --link-dest=../backup.1 source_directory/ backup.0/แต่ก็มีปัญหาเดียวกัน

คำตอบ:


7

นั่นคือวิธีการทำงานของ hardlinks แต่มีวิธีรอบ:

ตัวเลือกสองอย่างที่นึกถึง:

  • btrfsใช้ระบบแฟ้มด้วยการสนับสนุนการคัดลอกไฟล์บนเขียนเช่น แน่นอนเป็นคุณใช้ btrfs คุณต้องการเพียงแค่ใช้ภาพรวมของพื้นเมือง ... cp --reflink=alwaysถ้าสนับสนุนระบบแฟ้มของคุณคุณสามารถใช้ น่าเสียดายที่ ext4 ไม่รองรับสิ่งนี้
  • แชร์ฮาร์ดลิงก์ข้ามภาพรวมของคุณเท่านั้นไม่ใช่แบบดั้งเดิม นั่นคือครั้งแรกที่คุณเห็นไฟล์เวอร์ชันที่กำหนดให้คัดลอกไปยังสแน็ปช็อต แต่ในครั้งต่อไปให้เชื่อมโยงกับสแนปชอตก่อนหน้า (ไม่แน่ใจว่าฉันใช้โปรแกรมอะไรในการทำสิ่งนี้ - ทศวรรษที่ผ่านมา - แต่การค้นหากลับกลายเป็นสิ่งที่เลวร้ายมาก obnam, storebackup และ rsnapshot)
  • ขึ้นอยู่กับว่าไฟล์ของคุณมีการเปลี่ยนแปลงอย่างไรคุณอาจสามารถรับประกันได้ว่าการเขียน temp / เปลี่ยนชื่อจะถูกใช้เพื่อเปลี่ยนไฟล์จากนั้นจะทำลายฮาร์ดลิงก์ - ดังนั้นเวอร์ชันในสแน็ปช็อตจะยังคงเดิม สิ่งนี้มีความปลอดภัยน้อยลงเนื่องจากข้อผิดพลาดอาจทำให้ภาพรวมของคุณเสียหาย
  • ถ่ายภาพรวมของ LVM ของระบบไฟล์ทั้งหมด

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


คุณแนะนำอะไรเป็นวิธีสำรองโฟลเดอร์ขนาดใหญ่
Hermann Ingjaldsson

ฉันคิดว่าการใช้ rsync กับเซิร์ฟเวอร์ที่มี cronjob ทำ cp -al เป็นประจำสำหรับสแน็ปช็อต .. ควบคู่ไปกับ rsync-ing เป็นต้นไปสำหรับสำเนาเพิ่มเติม คุณคิดว่าดีไหม?
Hermann Ingjaldsson

@ HermannIngjaldsson ดีขึ้นอยู่กับวิธีการสำรองข้อมูลของคุณ โดยส่วนตัวฉันแค่เพิ่มมันลงในเซ็ตอัพ Bacula ของฉัน - แต่ฉันจะไม่แนะนำว่านอกจากคุณจะมีเครื่องสำรองข้อมูลหรือรู้ไว้แล้วว่า Bacula ดังนั้นฉันคิดว่าฉันขอแนะนำให้คุณลอง rsnapshot ก่อน
Derobert

rsnapshotเป็นสิ่งที่ดี
developerbmw

4

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

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

Fl-cowปรับเปลี่ยนโปรแกรมเพื่อใช้กลยุทธ์การแทนที่อย่างเป็นระบบในไฟล์ที่มีลิงก์จำนวนมาก

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

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


2

ต่อไปนี้เป็นสคริปต์ทับทิมที่ฉันเขียนซึ่งหุ้ม "cp -al" และ rsync ลงในสคริปต์ที่ดีที่สามารถเรียกใช้ด้วยตนเองหรือผ่าน cron ปลายทางสามารถเป็นแบบโลคัลหรือรีโมต (ผ่าน ssh):

สลัม Timemachine

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

ที่มา:

  • / home / flakrat

ปลายทาง:

  • / ข้อมูล / backup / ทุกวัน
    • / จันทร์
    • / อังคาร
    • / พุธ
    • / พฤหัสบดี
    • ...

ฮาร์ดลิงก์ถูกสร้างขึ้นโดยเรียกใช้ "cp -al" กับการสำรองข้อมูลของเมื่อวานนี้ พูดว่าเป็นเช้าวันอังคารเมื่อคุณเรียกใช้:

cd /data/backup/daily

rm -rf tuesday

cp -al monday tuesday

rsync -a --delete /home/flakrat /data/backup/daily/tuesday/


0

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

การใช้ rsync คุณต้องทำการสำรองข้อมูลแบบเต็มก่อนโดยไม่ใช้ฮาร์ดลิงก์ การสำรองข้อมูลครั้งต่อไปสามารถชี้ไปที่การสำรองข้อมูลก่อนหน้าและการเชื่อมโยงอย่างหนักไปยังมัน วิธีการสำรองข้อมูลของคุณจะไม่ยากที่จะเชื่อมโยงไปยังไฟล์ทำงาน (ไฟล์ที่คุณกำลังแก้ไข) ตัวอย่าง. หากการสำรองข้อมูลก่อนหน้าของฉันเป็นโฟลเดอร์ backup.01 สคริปต์สำรองของฉันจะเพิ่มโฟลเดอร์ด้วยการเปลี่ยนชื่อใหม่เป็นหนึ่งเพื่อให้ backup.01 กลายเป็น backup.02 จากนั้นสคริปต์จะสร้างโฟลเดอร์ว่างใหม่ที่ชื่อว่า backup.01 จากนั้นจะทำการซิงค์ข้อมูลสำรองใหม่ลงในโฟลเดอร์ใหม่และฮาร์ดลิงก์ไปยัง backup.02 เพื่อให้เฉพาะไฟล์ใหม่เท่านั้นที่จะใช้พื้นที่ในการสำรองข้อมูล คำสั่ง rsync จะมีลักษณะดังนี้: rsync -rlt sourcepath backuppath / backup.01 --link-dest = backuppath / backup.02

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

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