RSync: Làm cách nào để đồng bộ hóa theo cả hai hướng?


82

Tôi muốn sử dụng rsync để đồng bộ hóa hai thư mục theo cả hai hướng.

Tôi đề cập đến đồng bộ hóa theo nghĩa cổ điển ( không phải cách nó được hiểu trong sách hướng dẫn sử dụng rsync):
Tôi muốn cập nhật các thư mục theo cả hai hướng , tùy thuộc vào chúng mới hơn .

Điều này có thể được thực hiện bằng rsync (thích hợp hơn trong cách Linux) không?
Nếu không, những giải pháp nào khác tồn tại?


3
Tôi tin rằng trong serverfault.com bạn sẽ nhận được câu trả lời tốt hơn.
Esteban Küber

Câu trả lời:


77

Chỉ cần chạy nó hai lần, với chế độ "mới hơn" (-u hoặc - cờ cập nhật) cộng với -t (để sao chép thời gian sửa đổi tệp), -r (đối với thư mục đệ quy) và -v (đối với đầu ra dài dòng để xem nó là gì đang làm):

rsync -rtuv /path/to/dir_a/* /path/to/dir_b
rsync -rtuv /path/to/dir_b/* /path/to/dir_a

Điều này sẽ không xử lý việc xóa, nhưng tôi không chắc có giải pháp tốt cho vấn đề đó chỉ với đồng bộ hóa định kỳ.


3
Vì câu hỏi là về rsync, tôi sẽ đánh dấu câu trả lời này là đúng.
java.is.for.desktop

2
Nhưng bạn cũng đã hỏi về các giải pháp khác và Unison làm tốt hơn, nếu không thì tôi sẽ không bao giờ đề cập đến một công cụ khác. Tôi hiểu rằng bạn có thể có những trường hợp cụ thể thích sử dụng rsync.
MaD70

1
Sheesh, bạn nhận được 6 phiếu tán thành và bạn vẫn đang phàn nàn? <j / k> Unison là một giải pháp thực sự thú vị và tôi rất vui vì bạn đã đề cập đến nó. :)
jsight

2
Tôi không phàn nàn, tôi đang giải thích. Chỉ để kiểm tra rằng tôi không thiếu thứ gì đó (không phải là người nói tiếng Anh bản ngữ).
MaD70

1
MaD70 - Không sao ... Tôi chỉ đùa thôi. :)
jsight

63

Bạn có biết Unison File Synchronizer ?

Unison là một công cụ đồng bộ hóa tệp cho Unix và Windows. Nó cho phép hai bản sao của một bộ sưu tập các tệp và thư mục được lưu trữ trên các máy chủ khác nhau (hoặc các đĩa khác nhau trên cùng một máy chủ), được sửa đổi riêng biệt và sau đó được cập nhật bằng cách truyền bá những thay đổi trong mỗi bản sao cho nhau. ...

Cũng lưu ý rằng nó có khả năng phục hồi khi thất bại:

Unison kiên cường trước thất bại. Luôn luôn cẩn thận để các bản sao và cấu trúc riêng của nó ở trạng thái hợp lý, ngay cả trong trường hợp kết thúc bất thường hoặc lỗi giao tiếp.


2
+1. Unison là cách tốt nhất để làm điều này. Double-rsync rất khó thực hiện đúng và không xử lý được các thao tác xóa.
Avdi

Có, Unison có khả năng phục hồi lỗi. Tôi đang cập nhật câu trả lời của mình để nhấn mạnh điều này.
MaD70

4
Chưa nghe nói về Unison. Bạn có trách nhiệm yêu cầu tôi làm lại các tập lệnh sao lưu của mình ở nhà hôm nay.
Esteban Küber

1
Tôi rất vui vì câu trả lời của tôi rất hữu ích (điều này cho thấy làm thế nào có thể thực tế một công cụ dựa trên nền tảng lý thuyết vững chắc).
MaD70

Đây là một hướng dẫn ngắn về Unison tại linuxjournal.
lepe

12

Bạn cần chạy rsynchai lần và tôi khuyên bạn nên chạy nó với -au:

rsync -au /local/source/* /remote/destination
rsync -au /remote/destination/* /local/source

-a(a cho kho lưu trữ) là một phím tắt cho -rlptgoD:

  • -r Đệ quy vào thư mục con
  • -l Đồng thời đồng bộ hóa các liên kết tượng trưng
  • -p Đồng thời đồng bộ hóa quyền đối với tệp
  • -t Đồng thời đồng bộ hóa thời gian sửa đổi tệp
  • -g Đồng thời đồng bộ hóa các nhóm tệp
  • -o Cũng đồng bộ hóa chủ sở hữu tệp
  • -D Đồng thời đồng bộ hóa các tệp đặc biệt (không phải thông thường / meta)

Về cơ bản bất cứ khi nào bạn muốn tạo một bản sao giống hệt một-một bằng cách sử dụng rsync, bạn nên luôn sử dụng -avì đó là điều mà hầu hết người dùng mong đợi sẽ xảy ra khi họ nói về " đồng bộ hóa ". Các câu trả lời khác ở đây dường như bỏ qua rằng đôi khi nội dung của tệp không thay đổi nhưng chủ sở hữu của tệp có thể đã thay đổi hoặc quyền truy cập của tệp có thể đã thay đổi và trong trường hợp đórsync đó sẽ không đồng bộ hóa tệp, điều này có thể gây tử vong.

Nhưng bạn cũng yêu cầu -unhư vậy yêu cầu rsynchoàn toàn để yên bất kỳ tệp / thư mục nào, trong trường hợp tệp / thư mục đó đã tồn tại ở đích và có ngày sửa đổi cuối cùng mới hơn. Nếu không có -u rsyncsẽ đồng bộ hóa bất kể tệp / thư mục có mới hơn hay không .

Xin lưu ý rằng giải pháp này không thể xử lý các tệp đã xóa. Không dễ dàng xử lý việc xóa vì hãy xem xét tình huống sau: Một tệp đã bị xóa tại nguồn, bây giờ làm thế nào để rsyncbiết liệu tệp đó đã từng tồn tại và đã bị xóa hay chưa (trong trường hợp đó, nó cũng phải được xóa tại đích) hoặc liệu nó chưa bao giờ tồn tại tại nguồn (trong trường hợp đó nó phải được sao chép từ đích). Hai tình huống này trông giống hệt nhau rsyncnên nó không thể biết cách phản ứng chính xác. Sẽ không hữu ích khi đồng bộ theo cách khác vì điều đó có thể dẫn đến tình huống tương tự: Tệp tồn tại ở nguồn nhưng không tồn tại ở đích. Tại sao? Nó chưa bao giờ tồn tại ở điểm đến hoặc nó đã bị xóa? Cả hai trường hợp trông giống hệt nhau rsync.

Các công cụ đồng bộ hóa có thể đồng bộ hóa các tệp đã xóa một cách đáng tin cậy thường quản lý nhật ký đồng bộ hóa về tất cả các hoạt động đồng bộ hóa trước đây. Nếu nhật ký đó tiết lộ rằng đã từng có một tệp và đã được đồng bộ hóa nhưng bây giờ nó bị mất, rõ ràng là nó đã bị xóa. Nếu không bao giờ có một tệp như vậy theo nhật ký, nó phải được đồng bộ hóa. Bằng cách lưu trữ tất cả các mục nhật ký bằng dấu thời gian, thậm chí có thể một tệp đã xóa quay trở lại và bị xóa nhiều lần nhưng công cụ đồng bộ hóa sẽ luôn biết phải làm gì và kết quả luôn chính xác. rsynckhông có nhật ký như vậy, nó chỉ dựa vào trạng thái tệp hiện tại của hai mặt của hoạt động.

Tuy nhiên, bạn có thể xây dựng cho mình một lệnh đồng bộ hóa bằng cách sử dụng rsyncvà tập lệnh shell POSIX bit vốn đã rất gần với một công cụ đồng bộ hóa như được mô tả ở trên. Vì bản thân tôi cần một công cụ như vậy, đây là câu trả lời trên Stackoverflow hướng dẫn bạn cách tạo một tập lệnh như vậy.


Đặt đẹp.
Peter Rowntree

6

Cảm ơn jsight

rsync -urv --progress dir_a dir_b && rsync -urv  --progress dir_b dir_a

Điều này sẽ dẫn đến việc đồng bộ hóa thứ hai diễn ra ngay sau khi đồng bộ hóa lần thứ nhất kết thúc. Trong trường hợp cấu trúc thư mục lớn, điều này sẽ tiết kiệm thời gian, vì người ta không cần phải ngồi trước máy tính. Nếu cấu trúc quá lớn, hãy loại bỏ những thứ dài dòng và tiến bộ

rsync -ur dir_a dir_b && rsync -ur dir_b dir_a

1
Chỉ tự hỏi liệu tôi có nên thêm -t để sao chép thời gian sửa đổi tệp hay không. Có lý do gì tôi nên bỏ -t out không?
chrips

@Chrips Không, tôi không nghĩ vậy. Có vẻ như mục đích của câu trả lời này chỉ để cho thấy rằng bạn có thể sử dụng &&giữa hai lệnh để tự động chạy lệnh thứ 2 ngay sau lệnh thứ nhất (nếu lệnh thứ nhất thành công), trái ngược với việc chạy thủ công lần lượt như trong câu trả lời của @ jsight. Ngoài ra, tôi nghĩ câu trả lời của @ jsight đã được chỉnh sửa để bao gồm -ttùy chọn sau khi câu trả lời này được đăng.
Ruben9922

1

Sử dụng rsync <OPTIONS> [hostname:]source-dir [hostname:]dest-dir

ví dụ:

rsync -pogtEtvr --progress --bwlimit=2000 xxx-files different-stuff

Sẽ đồng bộ xxx-files với các tệp khác nhau / xxx-files. Nếu không tồn tại các tệp khác nhau, nó sẽ tạo ra nó - tức là sao chép nó.

-pogtEtv - chỉ có một loạt các tùy chọn để bảo toàn siêu dữ liệu tệp, cộng với v - verbose và r - đệ quy

--progress - hiển thị tiến độ đồng bộ hóa trong thời gian thực - siêu hữu ích nếu bạn sao chép các tệp lớn

--bwlimit=2000 - đặt tốc độ sao chép / đồng bộ hóa tối đa (bw = băng thông)

PS rsync cực kỳ quan trọng khi bạn làm việc qua mạng trong trường hợp máy cục bộ, bạn có thể sử dụng các lệnh như cp .

Chúc may mắn!


0

Tôi đang sử dụng rsyncvới inotifywait. Khi bạn thay đổi bất kỳ tệp nào, rsyncsẽ được thực thi.

inotifywait -m --exclude "$_LOG_FILE" -r -e create,delete,delete_self,modify,moved_to --format "%w%f" "$folder"

Bạn cần chạy inotifywaittrên cả hai máy chủ. Vui lòng kiểm tra ví dụ inotifywait


0

Những gì bạn cần là Rclone . Rclone ("rsync để lưu trữ đám mây") là một chương trình Linux dòng lệnh để đồng bộ hóa các tệp và thư mục đến và đi từ các nhà cung cấp dịch vụ lưu trữ đám mây khác nhau (box, dropbox, ftp, v.v.) và các hệ thống tệp cục bộ. Rlone chỉ hỗ trợ đồng bộ hóa nhân bản.

Một giải pháp đồ họa khác bao gồm đồng bộ hóa thời gian thực sẽ là sử dụng FreeFileSync , bao gồm chương trình RealTimeSync. FreefileSync hỗ trợ đồng bộ hai chiều 2 chiều bao gồm xử lý xóa.

FreFileSync gui

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.