ทำการถ่ายโอนไฟล์เดียวต่อโดย rsync


52

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

ฉันพยายามใช้ตัวเลือก--partialหรือ--inplaceแต่ด้วย--progressฉันพบrsyncกับ--partialหรือ--inplaceเริ่มจากจุดเริ่มต้นแทนที่จะเป็นสิ่งที่ถูกทิ้งไว้ครั้งสุดท้าย หยุดrsyncต้นด้วยตนเองและตรวจสอบขนาดของไฟล์ที่ได้รับก็ยืนยันสิ่งที่ฉันพบ

แต่ด้วย--appendrsync เริ่มต้นจากสิ่งที่ถูกทิ้งไว้ครั้งสุดท้าย

ฉันกำลังสับสนว่าผมเห็นบนหน้าคน --partial , --inplaceและ--appendดูเหมือนจะเกี่ยวข้องกับการกลับมาทำงานคัดลอกจากสิ่งที่เหลือจากครั้งที่แล้ว บางคนสามารถอธิบายความแตกต่างได้หรือไม่ ทำไมทำไม่ได้--partialหรือ--inplaceทำงานให้กลับมาทำงานคัดลอก? เป็นความจริงหรือไม่ที่การกลับมาทำสำเนาrsyncต่อต้องทำงานกับ--appendตัวเลือกหรือไม่

นอกจากนี้หากไฟล์บางส่วนถูกทิ้งไว้โดยmvหรือcpไม่ใช่โดย rsync จะrsync --appendทำการคัดลอกไฟล์ต่อไปอย่างถูกต้องหรือไม่

คำตอบ:


39

rsync --appendเพื่อดำเนินการต่อสำเนาขัดจังหวะคุณควรใช้ จากคำอธิบายของ man page ของ--append:

สิ่งนี้ทำให้ rsync อัปเดตไฟล์โดยต่อท้ายข้อมูลลงในส่วนท้ายของไฟล์ซึ่ง สันนิษฐานว่าข้อมูลที่มีอยู่แล้วในด้านการรับจะเหมือนกันกับการเริ่มต้นของไฟล์ทางด้านการส่ง [... ] นัย--inplace, [... ]

ตัวเลือก--inplaceทำให้rsync(เกิน) เขียนเนื้อหาไฟล์ปลายทางโดยตรง โดยไม่ --inplace , rsyncจะ:

  1. สร้างไฟล์ใหม่ด้วยชื่อชั่วคราว
  2. คัดลอกเนื้อหาที่อัปเดตลงไป
  3. สลับกับไฟล์ปลายทางและสุดท้าย
  4. ลบสำเนาเก่าของไฟล์ปลายทาง

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

โปรดทราบว่าหากการดำเนินการคัดลอก / อัปเดตล้มเหลวในขั้นตอนที่ 1-3 ด้านบน rsyncจะลบไฟล์ปลายทางชั่วคราว --partial ตัวเลือกปิดการใช้งานลักษณะการทำงานนี้และrsyncจะออกบางส่วนโอนไฟล์ชั่วคราวในระบบแฟ้มปลายทาง ดังนั้นการกลับมาทำงานดำเนินการคัดลอกไฟล์เดียวจะไม่ได้รับมากจนกว่าคุณจะเรียกว่าเป็นครั้งแรกrsyncที่มี--partialหรือ --partial-dir(ผลเช่นเดียวกับ--partialในนอกจากนี้ยังสั่งrsync การสร้างไฟล์ชั่วคราวทั้งหมดในไดเรกทอรีที่ระบุ)


ขอบคุณ! หากไฟล์บางส่วนถูกทิ้งไว้โดย mv หรือ cp ไม่ใช่โดย rsync rsync จะ - นำไปใช้อย่างถูกต้องต่อการคัดลอกไฟล์ต่อหรือไม่
ทิม

1
@Tim โดยย่อ--appendทำให้rsyncเชื่อว่าหากไฟล์ที่เกี่ยวข้องสองไฟล์มีความยาวต่างกันไฟล์ที่สั้นกว่าจะเหมือนกับส่วนเริ่มต้นของไฟล์ที่ยาวกว่า ดังนั้นใช่หากคุณเริ่มคัดลอกไฟล์ขนาดใหญ่ด้วยcpและขัดจังหวะกระบวนการคัดลอกจากนั้นrsync --appendจะคัดลอกเฉพาะส่วนที่เหลือของไฟล์ ( หมายเหตุ:หากcpถูกขัดจังหวะโดยระบบล่มมีโอกาสเล็กน้อยที่เนื้อหาไฟล์และข้อมูลเมตาไม่ซิงค์กันเช่นไฟล์เสียหายในกรณีนี้การทำงานrsyncอีกครั้งโดยไม่ --appendควรแก้ไขปัญหา)
Riccardo Murri

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

1
@ Winny ล่าช้ามาก: สำหรับสำเนาในประเทศไม่มีวิธีที่เหมาะสมในการทำเช่นนี้ สำหรับการคัดลอกเครือข่ายนี้เป็นโหมดเริ่มต้นเมื่อคุณระบุได้โดยไม่ต้อง--partial --append
roaima

1
@ Winny --appendและ--append-verifyมีกรณีความล้มเหลวที่เป็นอันตราย: เมื่อไฟล์ของผู้รับมีขนาดเดียวกันหรือใหญ่กว่า แต่มีข้อมูลที่แตกต่างกัน ฉันแนะนำวิธีแก้ปัญหาโดยใช้--no-whole-fileแทน
Tom Hale

21

โปรดทราบว่า--appendหมายถึงการที่ตัวเองหมายถึง--inplace--partial

  • เพียงแค่ใช้--partialคุณควรrsyncปล่อยให้การถ่ายโอนบางส่วนและดำเนินการต่อในความพยายามที่ตามมา

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

  • --append-verify รวมไฟล์ทั้งหมดในการตรวจสอบการตรวจสอบรวมถึงส่วนที่ถ่ายโอนในการถ่ายโอนก่อนหน้า

  • ด้วยการตรวจสอบการตรวจสอบอย่างใดอย่างหนึ่ง--appendหรือ--append-verifyล้มเหลวควรทำให้ไฟล์ถูกส่งอีกครั้งอย่างสมบูรณ์ (โดยใช้--inplace)

คุณควรจะสามารถดำเนินการต่อmvหรือcpดำเนินการต่อได้rsyncแต่คุณอาจต้องการใช้--append-verifyตัวเลือกเพื่อความสบายใจ

โปรดทราบว่าการใช้--appendสาเหตุที่rsyncจะคัดลอกเฉพาะไฟล์ที่มีขนาดของมันบนตัวรับสั้นกว่าขนาดของผู้ส่ง (โดยไม่คำนึงถึงการประทับเวลา) หรือหายไปจากตัวรับ ตามเอกสารเกี่ยวกับตัวเลือกนี้:

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

ข้อมูลเพิ่มเติมในหน้าคน


--appendและ--append-verifyมีกรณีความล้มเหลวที่เป็นอันตราย: เมื่อไฟล์ของผู้รับมีขนาดเดียวกันหรือใหญ่กว่า แต่มีข้อมูลแตกต่างกัน ฉันแนะนำวิธีแก้ปัญหาโดยใช้--no-whole-fileแทน
Tom Hale

@ TomHale เอกสารแนะนำว่าเพื่อให้ไฟล์ถูกข้ามมันจะต้องมีขนาดเท่ากันและเวลาแก้ไขที่ปลายทั้งสอง หากนี่เป็นข้อกังวลที่น่าเชื่อถือก็--checksumควรใช้ ฉันไม่สามารถระบุได้อย่างชัดเจน แต่ตัวเลือกใด ๆ ที่สามารถดำเนินการต่อได้ในเชิงตรรกะควรบอกเป็นนัย--no-whole-fileเพราะ--whole-fileไม่เข้ากัน
TomG

--append-verifyจะข้ามไฟล์ขนาดเดียวกันหรือใหญ่กว่าพร้อมวันที่แตกต่างกันซึ่งอาจเป็น "ไม่คาดคิด" ไม่จำเป็นต้องใช้ไฟล์--checksum ทั้งหมดเช่นเดียวกับที่rsyncจะทำการตรวจสอบไฟล์ทั้งหมด แต่จะใช้เฉพาะกับไฟล์ที่ถ่ายโอนเท่านั้น
Tom Hale

--checksumบอกrsyncให้ตรวจสอบไฟล์ก่อนที่จะส่งซึ่งทำให้มั่นใจได้ว่าไฟล์ที่เปลี่ยนแปลงทั้งหมดจะถูกถ่ายโอนโดยไม่คำนึงถึงขนาด / เวลา คุณมีแหล่งที่มาของ--append-verifyพฤติกรรมที่ไม่คาดคิดตามที่คุณอธิบายไม่ตรงกับเอกสารประกอบหรือประสบการณ์ของฉัน (มี จำกัด ) หรือไม่?
TomG

--append-verifyอ้างถึง--appendที่ระบุว่า: If a file needs to be transferred and its size on the receiver is the same or longer than the size on the sender, the file is skipped.แม้ว่าไฟล์จะต้องมีการถ่ายโอนเพราะ--checksumมันอาจยังคงถูกข้ามไป
Tom Hale

6

David Schwartz ถูกต้อง--partial(หรือดีกว่า-P) ทำสิ่งที่คุณต้องการ ฉันยืนยันสิ่งนี้ในไฟล์ 37G ที่หยุดลง ~ 8g ผ่านทางเครือข่าย rsync สแกนส่วนแรกของบางส่วนอย่างรวดเร็ว (แสดงความคืบหน้าเหมือนที่เป็นไป-P) และจากนั้นทำการถ่ายโอนต่อไปยังจุดสิ้นสุดของไฟล์บางส่วน


สำเนาเครือข่ายได้รับการปฏิบัติแตกต่างจากสำเนาในเครื่องซึ่งเป็นปัญหาที่นี่
roaima

@roaima คุณมีแหล่งที่มาสำหรับสิ่งนั้นหรือเอกสารที่อธิบายรายละเอียดเพิ่มเติมว่าอะไรคือความแตกต่าง? ฉันไม่พบมันใน manpage (ใหญ่)
Jonas Schäfer

@JonasWielicki หน้าคนพูดถึงมันภายใต้--whole-fileคำอธิบายตัวเลือก
roaima

@roaima ขอบคุณมาก! นี่ก็หมายความว่าวิธีแก้ปัญหาที่เหมาะสมคือ--no-W(ซึ่งใช้งานได้จริง!)
Jonas Schäfer

@JonasWielicki มันไม่มีประสิทธิภาพมากเกินไปซึ่งเป็นเหตุผลว่าทำไมจึงปิดใช้งานโดยค่าเริ่มต้น คุณไม่ต้องการใช้--no-Wเว้นแต่คุณจะเข้าใจอย่างชัดเจนว่าการตั้งค่านั้นหมายถึงอะไรสำหรับไฟล์ในเครื่อง ดูunix.stackexchange.com/a/181018/100397
roaima

2

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


สำเนาโลคัลไม่ได้ทำการเปรียบเทียบ แต่จะถูกเขียนทับอย่างง่าย ๆ (หรือ--appendต่อจากอ็อฟเซ็ตไบต์)
roaima

1

โดยค่าเริ่มต้นrsyncจะเปิดใช้งาน--whole-fileหากการถ่ายโอนจากดิสก์ภายในเครื่องไปยังดิสก์ภายในเครื่อง สิ่งนี้จะรีสตาร์ทการถ่ายโอนที่ถูกขัดจังหวะตั้งแต่เริ่มต้นแทนที่จะตรวจสอบชิ้นส่วนที่มีอยู่แล้ว

หากต้องการปิดใช้งานสิ่งนี้ให้ใช้:

--no-whole-file

การรวมสิ่งนี้เข้ากับ--inplaceหรือ--partialจะอนุญาตให้ทำการถ่ายโอนต่อในภายหลัง

ชื่อแทนของฉันสำหรับใช้rsyncในการคัดลอกคือ:

rscp='rsync -ax --inplace --sparse --no-whole-file --protect-args'

คำเตือน : ระวังการใช้งาน--append-verifyเพราะมันจะข้ามไฟล์ปลายทางที่มีขนาดเท่ากันหรือใหญ่กว่า


สำหรับการถ่ายโอนเครือข่ายrsyncเปรียบเทียบแหล่งที่มาและไฟล์ปลายทางที่เกี่ยวข้องก่อนที่จะถ่ายโอนเพื่อส่งเฉพาะส่วนที่มีการเปลี่ยนแปลง (ถ่ายโอนเดลต้า) --no-whole-fileบอกrsyncให้ทำสิ่งเดียวกันสำหรับการทำสำเนาโลคอลท้องถิ่น เอกสารไม่แนะนำว่ามันจะมีผลกระทบต่อการกลับมาทำงานบางส่วนของไฟล์เดียว rsyncจะข้ามไฟล์ที่มีขนาดและการประทับเวลาเท่ากันทุกประการโดยการออกแบบ ทั้ง--append-verifyมิได้--no-whole-fileควรเปลี่ยนพฤติกรรมที่ แต่--checksumควรจะทำงานกับอย่างใดอย่างหนึ่งเพื่อความสงบสุขของจิตใจที่ค่าใช้จ่ายของดิสก์ไอโอ
TomG

--append-verifyจะข้ามไฟล์ขนาดเดียวกันหรือใหญ่กว่าพร้อมวันที่แตกต่างกันซึ่งอาจเป็น "ไม่คาดคิด" ไม่จำเป็นต้องใช้ไฟล์--checksum ทั้งหมดเช่นเดียวกับที่rsyncจะทำการตรวจสอบไฟล์ทั้งหมด แต่จะใช้เฉพาะกับไฟล์ที่ถ่ายโอนเท่านั้น
Tom Hale
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.