Trước hết, liên quan đến phần "tiếp tục" trong câu hỏi của bạn, --partial
chỉ cần nói với đầu nhận sẽ giữ các tệp được chuyển một phần nếu kết thúc gửi biến mất như thể chúng đã được chuyển hoàn toàn.
Trong khi truyền tệp, chúng được lưu tạm thời dưới dạng tệp ẩn trong các thư mục đích của chúng (ví dụ .TheFileYouAreSending.lRWzDC
) hoặc thư mục được chọn cụ thể nếu bạn đặt công --partial-dir
tắc. Khi chuyển không thành công và --partial
không được đặt, tệp ẩn này sẽ vẫn còn trong thư mục đích dưới tên khó hiểu này, nhưng nếu --partial
được đặt, tệp sẽ được đổi tên thành tên tệp đích thực tế (trong trường hợp này TheFileYouAreSending
), mặc dù tệp chưa hoàn thành Vấn đề là sau này bạn có thể hoàn thành việc chuyển bằng cách chạy lại rsync bằng --append
hoặc --append-verify
.
Vì vậy, bản thân nó--partial
không tiếp tục chuyển khoản thất bại hoặc bị hủy. Để tiếp tục, bạn sẽ phải sử dụng một trong những lá cờ nói trên trong lần chạy tiếp theo. Vì vậy, nếu bạn cần đảm bảo rằng mục tiêu sẽ không bao giờ chứa các tệp có vẻ ổn nhưng thực sự không đầy đủ, bạn không nên sử dụng . Ngược lại, nếu bạn muốn đảm bảo rằng bạn không bao giờ bỏ lại các tệp bị lỗi bị ẩn trong thư mục đích và bạn biết rằng bạn sẽ có thể hoàn tất việc chuyển tiền sau đó, có mặt để giúp bạn.--partial
--partial
Liên quan đến công --append
tắc được đề cập ở trên, đây là công tắc "tiếp tục" thực tế và bạn có thể sử dụng nó cho dù bạn có đang sử dụng hay không --partial
. Trên thực tế, khi bạn đang sử dụng --append
, không có tệp tạm thời nào được tạo. Các tập tin được viết trực tiếp đến mục tiêu của họ. Về mặt này, --append
cho kết quả tương tự như khi --partial
chuyển khoản không thành công, nhưng không tạo ra các tệp tạm thời bị ẩn đó.
Vì vậy, để tổng hợp, nếu bạn đang di chuyển các tệp lớn và bạn muốn tùy chọn tiếp tục hoạt động rsync bị hủy hoặc thất bại từ điểm chính xác rsync
đã dừng, bạn cần sử dụng --append
hoặc --append-verify
bật lần thử tiếp theo.
Như @Alex chỉ ra bên dưới, vì phiên bản 3.0.0 rsync
hiện có một tùy chọn mới --append-verify
, hoạt động giống như --append
trước khi công tắc đó tồn tại. Bạn có thể luôn muốn hành vi của --append-verify
, vì vậy hãy kiểm tra phiên bản của bạn với rsync --version
. Nếu bạn đang sử dụng máy Mac và không sử dụng rsync
từ homebrew
, bạn sẽ (ít nhất là và bao gồm cả El Capitan) có phiên bản cũ hơn và cần sử dụng --append
hơn là --append-verify
. Tại sao họ không tiếp tục hành vi --append
và thay vào đó đặt tên cho người mới đến --append-no-verify
là một chút khó hiểu. Dù bằng cách nào, --append
trên rsync
trước khi phiên bản 3 cũng giống như --append-verify
trên các phiên bản mới hơn.
--append-verify
không nguy hiểm: Nó sẽ luôn đọc và so sánh dữ liệu ở cả hai đầu và không chỉ cho rằng chúng bằng nhau. Nó thực hiện việc này bằng cách sử dụng tổng kiểm tra, vì vậy nó dễ dàng trên mạng, nhưng nó yêu cầu đọc lượng dữ liệu được chia sẻ ở cả hai đầu của dây trước khi nó thực sự có thể tiếp tục chuyển bằng cách nối thêm vào mục tiêu.
Thứ hai, bạn nói rằng bạn "nghe nói rằng rsync có thể tìm thấy sự khác biệt giữa nguồn và đích, và do đó chỉ cần sao chép sự khác biệt."
Điều đó đúng, và nó được gọi là chuyển delta, nhưng đó là một điều khác. Để kích hoạt tính năng này, bạn thêm -c
hoặc --checksum
chuyển đổi. Khi công tắc này được sử dụng, rsync sẽ kiểm tra các tệp tồn tại ở cả hai đầu của dây. Nó thực hiện điều này trong các khối, so sánh tổng kiểm tra ở cả hai đầu và nếu chúng khác nhau, nó chỉ chuyển các phần khác nhau của tệp. Nhưng, như @Jonathan chỉ ra bên dưới, việc so sánh chỉ được thực hiện khi các tệp có cùng kích thước ở cả hai đầu - các kích thước khác nhau sẽ khiến rsync tải lên toàn bộ tệp, ghi đè lên mục tiêu có cùng tên.
Điều này đòi hỏi một chút tính toán ở cả hai đầu ban đầu, nhưng có thể cực kỳ hiệu quả trong việc giảm tải mạng nếu ví dụ bạn thường xuyên sao lưu các tệp có kích thước cố định rất lớn thường chứa các thay đổi nhỏ. Ví dụ xuất hiện trong tâm trí là các tệp hình ảnh ổ cứng ảo được sử dụng trong các máy ảo hoặc các mục tiêu iSCSI.
Đáng chú ý là nếu bạn sử dụng --checksum
để chuyển một loạt tệp hoàn toàn mới cho hệ thống đích, rsync vẫn sẽ tính toán tổng của chúng trên hệ thống nguồn trước khi chuyển chúng. Tại sao tôi không biết :)
Vì vậy, trong ngắn hạn:
Nếu bạn thường sử dụng rsync để chỉ "chuyển nội dung từ A sang B" và muốn tùy chọn hủy thao tác đó và sau đó tiếp tục lại, đừng sử dụng --checksum
, nhưng hãy sử dụng --append-verify
.
Nếu bạn đang sử dụng rsync để sao lưu công cụ thường xuyên, sử dụng --append-verify
có thể sẽ không giúp ích gì cho bạn, trừ khi bạn có thói quen gửi các tệp lớn liên tục tăng kích thước nhưng hiếm khi được sửa đổi sau khi viết. Là một mẹo bổ sung, nếu bạn đang sao lưu vào bộ lưu trữ hỗ trợ chụp nhanh , btrfs
hoặc zfs
thêm công --inplace
tắc sẽ giúp bạn giảm kích thước ảnh chụp do các tệp đã thay đổi không được tạo lại mà thay vào đó các khối thay đổi được ghi trực tiếp lên các khối cũ. Công tắc này cũng hữu ích nếu bạn muốn tránh rsync tạo các bản sao của tệp trên mục tiêu khi chỉ có những thay đổi nhỏ xảy ra.
Khi sử dụng --append-verify
, rsync sẽ hoạt động giống như mọi khi trên tất cả các tệp có cùng kích thước. Nếu chúng khác nhau về sửa đổi hoặc dấu thời gian khác, nó sẽ ghi đè lên mục tiêu bằng nguồn mà không xem xét kỹ hơn các tệp đó. --checksum
sẽ so sánh nội dung (tổng kiểm) của mỗi cặp tệp có cùng tên và kích cỡ.
CẬP NHẬT 2015-09-01 Thay đổi để phản ánh các điểm được tạo bởi @Alex (cảm ơn!)
CẬP NHẬT 2017-07-14 Thay đổi để phản ánh các điểm được tạo bởi @Jonathan (cảm ơn!)