Tiếp tục chuyển một tập tin bằng rsync


52

Trong Ubuntu, tôi muốn sao chép một tệp lớn từ ổ cứng sang ổ di động rsync. Đối với một số lý do khác, hoạt động không thể hoàn thành trong một lần chạy. Vì vậy, tôi đang cố gắng tìm ra cách sử dụng rsyncđể tiếp tục sao chép tệp từ nơi nó rời đi lần trước.

Tôi đã cố gắng sử dụng các tùy chọn --partialhay --inplace, nhưng cùng với --progress, tôi thấy rsyncvới --partialhoặc --inplacethực sự bắt đầu từ đầu thay vì từ những gì còn lại thời gian qua. Tự dừng rsyncsớm và kiểm tra kích thước của tệp đã nhận cũng xác nhận những gì tôi tìm thấy.

Nhưng với --append, rsync bắt đầu từ những gì còn lại lần trước.

Tôi bối rối như tôi thấy trên các trang người đàn ông --partial , --inplace--appenddường như liên quan đến việc nối lại sao chép từ những gì còn lại thời gian qua. Là ai đó có thể giải thích sự khác biệt? Tại sao không --partialhoặc --inplacelàm việc để tiếp tục sao chép? Có đúng là để tiếp tục sao chép, rsyncphải làm việc với --appendtùy chọn không?

Ngoài ra, nếu một phần tệp bị bỏ lại bởi mv, hoặc cpkhông phải bởi rsync, sẽ rsync --appendtiếp tục sao chép chính xác tệp?

Câu trả lời:


39

Để tiếp tục một bản sao bị gián đoạn, bạn nên sử dụng rsync --append. Từ lời giải thích của trang người đàn ông về --append:

Điều này khiến rsync cập nhật tệp bằng cách gắn thêm dữ liệu vào cuối tệp, giả sử rằng dữ liệu đã tồn tại ở phía nhận giống hệt với phần bắt đầu của tệp ở phía gửi. [...] Ngụ ý --inplace, [...]

Tùy chọn --inplacelàm cho rsync(hơn) viết nội dung tệp đích trực tiếp; không có --inplace , rsyncsẽ:

  1. tạo một tệp mới với một tên tạm thời,
  2. sao chép nội dung cập nhật vào nó
  3. trao đổi nó với tệp đích và cuối cùng
  4. xóa bản sao cũ của tệp đích.

Chế độ hoạt động bình thường chủ yếu ngăn ngừa xung đột với các ứng dụng có thể mở tệp đích và một vài rủi ro khác được liệt kê hợp lệ trong rsynctrang.

Lưu ý rằng, nếu thao tác sao chép / cập nhật không thành công trong các bước 1.-3. ở trên, rsyncsẽ xóa tệp đích tạm thời; các --partial tùy chọn vô hiệu hóa hành vi này và rsyncsẽ để lại một phần-chuyển các file tạm thời trên hệ thống tập tin đích. Do đó, việc tiếp tục một thao tác sao chép tệp sẽ không thu được nhiều trừ khi bạn gọi lệnh đầu tiên rsyncbằng --partialhoặc --partial-dir(cùng hiệu ứng với --partial, ngoài ra còn hướng dẫn rsync tạo tất cả các tệp tạm thời trong một thư mục cụ thể).


Cảm ơn! Nếu một phần tệp bị mv hoặc cp không để lại bởi rsync, rsync - sẽ tiếp tục sao chép chính xác tệp sao chép?
Tim

1
@ Tim Nói tóm lại, --appendlàm cho rsynctin rằng, nếu hai tập tin tương ứng có độ dài khác nhau, sau đó một ngắn hơn là giống với phần đầu tiên của một trong những lâu hơn. Vì vậy, có, nếu bạn bắt đầu sao chép một tệp lớn cpvà làm gián đoạn quá trình sao chép, thì rsync --appendsẽ chỉ sao chép phần còn lại của tệp. ( Lưu ý: nếu cpbị gián đoạn do sự cố hệ thống, có một khả năng nhỏ là nội dung tệp và siêu dữ liệu không được đồng bộ hóa, nghĩa là tệp bị hỏng. Trong trường hợp này, chạy rsyncmột lần nữa mà không --append khắc phục được sự cố.)
Riccardo Murri

2
Vì vậy, nếu tôi hiểu điều này một cách chính xác, không có cách nào để nói với rsync để xác minh một phần tệp và tiếp tục chuyển sang tệp được chuyển một phần đó ?
Winny

1
@Winny, rất muộn màng: đối với một bản sao địa phương không có cách hợp lý để làm điều này. Đối với một bản sao mạng, đây là chế độ mặc định khi bạn chỉ định --partialmà không có --append.
roaima

1
@Winny --append--append-verifycó một trường hợp thất bại nguy hiểm: khi tệp của người nhận có cùng kích thước hoặc lớn hơn nhưng có dữ liệu khác nhau. Tôi đề nghị một giải pháp dựa trên xung quanh--no-whole-file thay thế.
Tom Hale

21

Hãy nhận biết rằng --appendngụ ý --inplace, mà chính nó ngụ ý --partial.

  • Bằng cách chỉ sử dụng, --partialbạn nên rsyncđể lại một phần chuyển và tiếp tục chúng trong các lần thử tiếp theo.

  • Bằng cách sử dụng, --appendbạn nên rsyncđể cả hai tập tin một phần và tiếp tục lại chúng lần sau. Sau khi chuyển rsyncnên xác minh tổng kiểm tra của dữ liệu truyền.

  • --append-verify bao gồm toàn bộ tệp trong xác minh tổng kiểm tra, bao gồm bất kỳ phần nào được chuyển trong lần chuyển trước đó.

  • Với một trong hai --appendhoặc --append-verifyxác minh tổng kiểm tra không thành công sẽ khiến tập tin được truyền lại hoàn toàn (sử dụng --inplace)

Bạn sẽ có thể tiếp tục một mvhoặc cphoạt động với rsyncnhưng bạn có thể muốn sử dụng --append-verifytùy chọn để yên tâm.

Lưu ý rằng việc sử dụng các --appendnguyên nhân rsyncđể chỉ sao chép các tệp có kích thước của nó trên máy thu ngắn hơn kích thước trên người gửi (bất kể tem thời gian) hoặc không có trên máy thu. Bằng tài liệu về tùy chọn này:

Nếu một tệp cần được chuyển và kích thước của nó trên máy thu bằng hoặc dài hơn kích thước trên người gửi, thì tệp bị bỏ qua.

Thêm thông tin trong trang người đàn ông


--append--append-verifycó trường hợp lỗi nguy hiểm: khi tệp của người nhận có cùng kích thước hoặc lớn hơn nhưng có dữ liệu khác nhau. Tôi đề nghị một giải pháp dựa trên xung quanh--no-whole-file thay thế.
Tom Hale

@TomHale tài liệu cho thấy rằng để một tập tin bị bỏ qua, nó cần phải có cùng kích thước và thời gian sửa đổi ở cả hai đầu. Nếu đây là một mối quan tâm chính đáng thì --checksumnên được sử dụng. Tôi không thể tìm thấy nó được chỉ định rõ ràng, nhưng về mặt logic, bất kỳ tùy chọn nào có thể tiếp tục nên ngụ ý --no-whole-file--whole-filekhông tương thích.
TomG

--append-verifysẽ bỏ qua các tệp có cùng kích thước hoặc lớn hơn với các ngày khác nhau , có thể là "không mong muốn". Không cần --checksum tất cả các tệp, vì rsyncdù sao cũng sẽ kiểm tra toàn bộ tệp, nhưng chỉ dựa trên những gì nó chuyển.
Tom Hale

--checksumnói rsyncvới tổng kiểm tra các tập tin trước khi gửi để đảm bảo rằng tất cả các tập tin thay đổi được chuyển, bất kể kích thước / thời gian. Bạn đã có một nguồn cho --append-verifyhành vi bất ngờ như những gì bạn mô tả không phù hợp với tài liệu hoặc kinh nghiệm (có giới hạn) của tôi chưa?
TomG

--append-verifyđề cập đến --appendđiều đó nói rằng: 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.Ngay cả khi một tập tin cần phải được chuyển vì --checksum, nó vẫn có thể bị bỏ qua.
Tom Hale

6

David Schwartz là chính xác, --partial(hoặc tốt hơn, -P) làm những gì bạn muốn. Tôi đã xác minh điều này trên một tệp 37G đã bị dừng ~ 8g vào nó, qua mạng. rsync nhanh chóng quét các phần đầu tiên của một phần (hiển thị tiến trình như đang diễn ra -P), và sau đó tiếp tục chuyển đến cuối tệp một phần.


Một bản sao mạng được đối xử khác với bản sao cục bộ, đây là vấn đề ở đây.
roaima

@roaima Bạn có một nguồn cho điều đó, hoặc một tài liệu giải thích chi tiết hơn về sự khác biệt là gì? Tôi không tìm thấy nó trong trang web (rất lớn).
Jonas Schäfer

@JonasWielicki trang người đàn ông ám chỉ nó dưới phần --whole-filemô tả tùy chọn.
roaima

@roaima Cảm ơn bạn rất nhiều! Điều này cũng có nghĩa là cách giải quyết phù hợp là --no-W(thực sự hoạt động!)
Jonas Schäfer

@JonasWielicki nó cực kỳ kém hiệu quả, đó là lý do tại sao nó bị tắt theo mặc định. Bạn thực sự không muốn sử dụng --no-Wtrừ khi bạn hiểu chính xác ý nghĩa của cài đặt cho các tệp cục bộ. Xem unix.stackexchange.com/a/181018/100394
roaima

2

Bạn đã làm đúng nó --partiallàm những gì bạn muốn. Nó dường như bắt đầu lại từ đầu bởi vì nó luôn bắt đầu từ đầu danh sách các khối dữ liệu tệp mà nó cần sao chép. Các --appendtùy chọn là nguy hiểm và sẽ dẫn đến một tập tin bị hỏng nếu dữ liệu không phù hợp đối với một số lý do.


Các bản sao cục bộ không được so sánh, chúng chỉ đơn giản được ghi đè (hoặc --appendtiếp tục từ phần bù byte).
roaima

1

Theo mặc định, rsyncsẽ kích hoạt --whole-filenếu chuyển từ đĩa cục bộ sang đĩa cục bộ. Điều này sẽ khởi động lại một chuyển bị gián đoạn từ đầu, thay vì kiểm tra các phần đã có.

Để vô hiệu hóa điều này, sử dụng:

--no-whole-file

Kết hợp điều này với một trong hai --inplacehoặc --partialsẽ cho phép tiếp tục chuyển tiền sau này.

Bí danh của tôi để sử dụng rsyncđể sao chép là:

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

Cảnh báo : cẩn thận khi sử dụng --append-verifyvì nó sẽ bỏ qua mọi tệp đích có cùng kích thước hoặc lớn hơn.


Đối với chuyển mạng, rsyncso sánh các tệp nguồn và tệp đích tương ứng trước khi chuyển để chỉ gửi những phần đã thay đổi (chuyển delta). --no-whole-filenói rsyncđể làm điều tương tự cho sao chép từ địa phương đến địa phương. Tài liệu này không đề xuất rằng nó sẽ có bất kỳ ảnh hưởng nào đến việc tiếp tục chuyển một phần các tệp đơn lẻ. rsyncsẽ bỏ qua các tệp có cùng kích thước và dấu thời gian theo thiết kế. Cả --append-verifycũng không --no-whole-filenên thay đổi hành vi đó, nhưng --checksumnên làm việc với một trong hai để yên tâm với chi phí của đĩa IO
TomG

--append-verifysẽ bỏ qua các tệp có cùng kích thước hoặc lớn hơn với các ngày khác nhau , có thể là "không mong muốn". Không cần --checksum tất cả các tệp, vì rsyncdù sao cũng sẽ kiểm tra toàn bộ tệp, nhưng chỉ dựa trên những gì nó chuyển.
Tom Hale
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.