Liệu rsync xác minh các tập tin được sao chép giữa hai ổ đĩa cục bộ?


65

Tôi muốn tạo một bản sao mới của một số lượng lớn tệp từ ổ đĩa cục bộ này sang ổ đĩa khác.

Tôi đã đọc rằng rsync thực hiện so sánh tổng kiểm tra các tệp khi gửi chúng đến một máy từ xa qua mạng.

  1. Rsync sẽ thực hiện so sánh khi sao chép các tệp giữa hai ổ đĩa cục bộ?

  2. Nếu nó thực hiện xác minh - đó có phải là đặt cược an toàn không? Hoặc là tốt hơn để làm một byte bằng cách so sánh byte?

Câu trả lời:


77

rsync luôn sử dụng tổng kiểm tra để xác minh rằng một tệp đã được chuyển chính xác. Nếu tệp đích đã tồn tại, rsync có thể bỏ qua việc cập nhật tệp nếu thời gian và kích thước sửa đổi khớp với tệp nguồn, nhưng nếu rsync quyết định rằng dữ liệu cần được chuyển, tổng kiểm tra luôn được sử dụng trên dữ liệu được chuyển giữa các quá trình rsync gửi và nhận . Điều này xác minh rằng dữ liệu nhận được giống như dữ liệu được gửi với xác suất cao, không có chi phí quá lớn của so sánh mức byte qua mạng.

Sau khi nhận được dữ liệu tệp, rsync ghi dữ liệu vào tệp và tin tưởng rằng nếu hạt nhân biểu thị ghi thành công, dữ liệu được ghi mà không bị hỏng vào đĩa. rsync không đọc lại dữ liệu và so sánh với tổng kiểm tra đã biết như một kiểm tra bổ sung.

Đối với chính xác minh, đối với giao thức 30 trở lên (được hỗ trợ lần đầu tiên trong 3.0.0), rsync sử dụng MD5 . Đối với các giao thức cũ hơn, tổng kiểm tra được sử dụng là MD4 .

Mặc dù từ lâu đã bị coi là lỗi thời đối với băm mật mã an toàn, MD5 và MD4 vẫn đủ để kiểm tra tham nhũng tệp.

Nguồn: trang người đàn ông và đánh dấu mã nguồn rsync để xác minh.


3
Tôi ghét làm vỡ bong bóng của mọi người nhưng rsync chỉ kiểm tra xác minh tổng nếu cờ -c được thêm vào!

27
@clint Không, câu trả lời là đúng. Từ lời giải thích về -ccờ của trang man : "Lưu ý rằng rsync luôn xác minh rằng mỗi tệp được chuyển đã được xây dựng lại một cách chính xác ở phía bên nhận bằng cách kiểm tra tổng kiểm tra toàn bộ tệp được tạo khi tệp được chuyển, nhưng sau khi chuyển tự động xác minh không liên quan gì đến tùy chọn này trước khi chuyển "Tập tin này có cần được cập nhật không?" kiểm tra. "
Michael Mrozek

7
Câu trả lời này không làm rõ nếu nó thực sự xác minh tệp sau khi sao chép. Nếu tổng kiểm tra được tính khi tệp đang được nhận, thì đó không phải là tổng kiểm tra sau sao chép và bạn không thể chắc chắn rằng tệp được viết chính xác. Sau đó, bạn sẽ cần phải thực hiện một so sánh bổ sung.
Andre Miller

7
Bỏ phiếu xuống vì tôi không thích thực tế là câu trả lời này được viết chi tiết và đúng về mặt kỹ thuật và đồng thời quá nhiều chủ đề đến nỗi nó đánh lừa độc giả. Vấn đề là câu trả lời đi sâu vào chi tiết về những gì xảy ra trong quá trình chuyển trong khi người hỏi đặc biệt nói rằng anh ta quan tâm đến các bản sao địa phươngkhông chuyển mạng. Tôi khá chắc chắn rằng Kyle Jones đã không muốn đánh lừa bất cứ ai nhưng câu trả lời này (IMHO) thì có.
ndemou

4
Kyle tôi không tin bạn trả lời là sai. Tôi đã lưu ý rằng "chi tiết được viết tốt và đúng về mặt kỹ thuật" nhưng nó đòi hỏi người đọc phải tập trung và cẩn thận một cách không cần thiết. Tại sao lại thiếu việc xác minh dữ liệu đĩa đang được hỏi nửa chừng trong câu trả lời của bạn sau 117 từ liên tục mô tả quá trình xác minh không liên quan khác? Dù sao cũng cảm ơn bạn đã dành thời gian và quan tâm đến cuộc thảo luận này. Tôi chân thành đánh giá cao nó.
ndemou

40

rsynckhông không làm việc xác minh sau bản sao cho các bản sao tệp cục bộ. Bạn có thể xác minh rằng nó không bằng cách sử dụng rsyncđể sao chép một tệp lớn vào ổ đĩa chậm (tức là USB), sau đó sao chép cùng một tệp với cp, tức là:

time rsync bigfile /mnt/usb/bigfile

time cp bigfile /mnt/usb/bigfile

Cả hai lệnh đều mất cùng một khoảng thời gian, do đó rsynckhông thể thực hiện tổng kiểm tra vì điều đó sẽ liên quan đến việc đọc lại tệp đích khỏi đĩa chậm.

Các mantrang không may là sai lệch về điều này. Tôi cũng đã xác minh điều này với straceSau khi bản sao hoàn tất, rsynckhông có read()cuộc gọi nào trên tệp đích, vì vậy nó không thể được kiểm tra lại. Một lần nữa bạn có thể xác minh nó bằng một cái gì đó như iotop: bạn thấy rsyncviệc đọc và viết đồng thời (sao chép từ nguồn đến đích), sau đó nó thoát. Nếu nó được xác minh tính toàn vẹn, sẽ có một giai đoạn chỉ đọc.


1
"Trang người đàn ông không may bị đánh lừa về điều này. Tôi cũng đã xác minh điều này bằng dấu vết" Bạn đã sải bước từ xa, chạy quy trình rsync hoặc địa phương? Có hai ... một chạy trên đích, ngay cả khi bạn sử dụng ssh.
dùng129070

8
Không có xác minh sau sao chép cho bất kỳ bản sao, địa phương hoặc từ xa. Bạn chạy rsync -clại nếu bạn muốn buộc nó kiểm tra.
psusi

Việc xác minh được thực hiện trên luồng đến khi nó đi. Không cần thiết phải đọc lại từ đĩa nếu hệ thống tập tin đã xác nhận nó đã được ghi.
Ngừng làm hại Monica

17

rsyncthực hiện so sánh tổng kiểm tra trước khi sao chép (trong một số trường hợp), để tránh sao chép những gì đã có. Điểm so sánh tổng kiểm tra là không xác minh rằng bản sao đã thành công. Đó là công việc của cơ sở hạ tầng cơ bản: trình điều khiển hệ thống tập tin, trình điều khiển đĩa, trình điều khiển mạng, v.v. Các ứng dụng riêng lẻ như rsynckhông cần phải bận tâm với sự điên rồ này. Tất cả những gì rsynccần làm (và hiện!) Là kiểm tra giá trị trả về của các cuộc gọi hệ thống để đảm bảo không có lỗi.


1
Điều này dường như mâu thuẫn với câu trả lời được chấp nhận ...
djule5

2
@ djule5 Theo cách nào? Câu trả lời được chấp nhận dường như chủ yếu là về cách rsync kiểm tra các tệp được chuyển , nhưng câu hỏi và câu trả lời của tôi là về các bản sao cục bộ .
Gilles 'SO- ngừng trở nên xấu xa'

3
Ok, trong bối cảnh đó tôi đồng ý nó có ý nghĩa hơn. Vì vậy, "Điểm so sánh tổng kiểm tra không phải là để xác minh rằng bản sao đã thành công" chỉ đúng với các bản sao địa phương ; và "tổng kiểm tra luôn được sử dụng trên dữ liệu được chuyển giữa các quy trình rsync gửi và nhận" chỉ đúng với các bản sao được chuyển . Tôi thấy câu trả lời được chấp nhận sai lệch liên quan đến câu hỏi và tin rằng câu trả lời của bạn phải là câu được chấp nhận (chỉ 2 xu của tôi).
djule5

Tôi vẫn cảm thấy câu trả lời này hơi sai lệch. Ví dụ, nó nói rằng các trình điều khiển mạng đặc biệt xác minh xem bản sao có thành công hay không - nhưng nếu bạn nói rằng so sánh tổng kiểm tra không xác minh xem bản sao đó có thành công chỉ cho địa phương hay không, trình điều khiển mạng sẽ không xuất hiện.
Ken

1
@Ken Tôi không hiểu điểm bạn đang cố gắng thực hiện. Tôi nghi ngờ bạn đọc sai một cái gì đó. Các trình điều khiển mạng chỉ hoạt động nếu có bản sao mạng. Bản thân Rupync thực hiện so sánh tổng kiểm tra trước khi thực hiện bất kỳ bản sao nào, để quyết định có sao chép hay không. Rsync không thực hiện bất kỳ so sánh tổng kiểm tra nào sau khi sao chép (bởi vì nó sẽ là vô nghĩa: nó biết những gì nó vừa được sao chép).
Gilles 'SO- ngừng trở nên xấu xa'

4

Câu trả lời nhanh và bẩn, trực tiếp đến các câu hỏi.

Q: Sẽ rsyncso sánh khi sao chép các tập tin giữa hai ổ đĩa cục bộ? A: Nó sẽ làm so sánh để tìm ra những gì để sao chép.

Q: Nếu nó thực hiện xác minh - đó có phải là đặt cược an toàn không? Hoặc là tốt hơn để làm một byte bằng cách so sánh byte? A: an toàn như toán học đằng sau tổng kiểm tra MD5 của tệp. Bạn có thể thử làm thí nghiệm đơn giản để tìm hiểu và tin tưởng vào công cụ.

Câu trả lời dài: Tôi đoán, bạn muốn rsyncthực hiện so sánh tệp (từng bit hoặc bằng tổng kiểm tra) sau khi sao chép tệp. Nếu bạn là một trong số ít giá trị toàn vẹn dữ liệu đó, bạn có thể thấy hữu ích dưới đây:

rsync -avh [source] [destination] && rsync -avhc [source] [destination] 

mã ở trên rsyncthư mục files trên chạy đầu tiên và nếu hoàn toàn không có vấn đề, sẽ chạy rsynclại ngay trong khi thực hiện cùng so sánh tên file bằng cách sử dụng hash của toàn bộ tập tin.


1

Sử dụng rsync để xác minh tính toàn vẹn của bản sao

Để đảm bảo kiểm tra này đọc lại các tệp từ phương tiện truyền thông, tôi khuyên bạn nên tắt nguồn cả hai ổ đĩa và khởi động lại chúng trước khi chạy thử nghiệm này. Điều này sẽ xóa bộ nhớ cache dễ bay hơi nội bộ của họ.

Nếu không khởi động lại Linux, ít nhất bạn nên bỏ bộ đệm ( * ) bằng:

sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches'

Sau đó để đọc lại cả hai cây và so sánh tổng kiểm tra của chúng:

rsync --dry-run --checksum --itemize-changes --archive SRC DEST

Tổng kiểm tra rsync hiện đại sử dụng MD5, là 128 bit. Khả năng của việc không phát hiện ra lỗi trong một tệp riêng lẻ là rất thấp (một số thảo luận ở đây ), nhưng không phải là không thể.



Chúc may mắn nhận được dấu gạch chéo phải.
tộc

Không có tin nào tốt.
tộc

Đừng bận tâm --checksumcho đến khi bài kiểm tra đã trôi qua mà không có nó.
tộc
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.