Lệnh unix duy nhất để chuyển chính xác một tệp lớn?


3

Tôi đang cố gắng chuyển một tệp lớn (~ 3GB) giữa hai máy unix.

Tôi có thể sử dụng scp hoặc rsync, nhưng đôi khi việc chuyển bị hỏng. (Tôi phải kiểm tra thủ công.) Tôi có thể chia tệp thành từng mảnh và chuyển chúng và sau đó kiểm tra lại, sau đó kết hợp lại, nhưng điều này thật tẻ nhạt.

Có một lệnh duy nhất để chuyển chính xác một tệp lớn giữa hai máy Unix không? Tôi muốn nó tự động kiểm tra cả hai bản sao và tiếp tục làm lại quá trình chuyển (hoặc các phần của chúng) cho đến khi nó nhận được tất cả các byte trên dây chính xác.

Câu trả lời:


7

Rsync hoạt động bằng cách chia một tệp thành các khối và chỉ chuyển các khối nếu chúng khác nhau. Theo bản chất của nó, nó sẽ có thể phát hiện và sửa chữa tham nhũng. Bạn đã thử sử dụng tùy chọn --partial, nó sẽ cho phép nó tiếp tục nếu nó bị gián đoạn và chạy lại lệnh nhiều lần cho đến khi nó không còn chuyển bất kỳ dữ liệu nào nữa?

Bạn có đang sử dụng máy chủ rsync ở đầu xa của kết nối không? Nếu không, thì thực tế bạn không sử dụng rsync để truyền tệp, nó chỉ sử dụng bất kỳ phương thức vận chuyển cơ bản nào bạn đang sử dụng, do đó bạn sẽ không phát hiện lỗi.


2
Nếu bạn đang sử dụng rsync thì bạn đang sử dụng rsync - nếu không có máy chủ daemon lắng nghe thì nó sẽ thử đăng nhập qua SSH, bắt đầu quá trình rsync để hoạt động tạm thời như là kết thúc "máy chủ" và tạo đường hầm cho giao thức rsync luồng SSH. Hãy nhớ rằng: khi sử dụng rsync để kiểm tra lại các tệp bị hỏng có thể chống lại bản sao chính (có lẽ là tốt), hãy sử dụng --checksumtùy chọn để buộc nó kiểm tra nội dung của everyfile thay vì sử dụng phím tắt giả sử các tệp có cùng kích thước + dấu thời gian là OK.
David Spillett

1
Điều đó rất đúng, trừ khi anh ấy NFS hoặc SAMBA gắn đĩa từ xa và chỉ định nó như thể đó là một tệp cục bộ, trong trường hợp đó, bất kỳ tham nhũng nào dưới NFS hoặc SAMBA sẽ không bị phát hiện. Nhưng anh không nói rõ.
Randy Orrison

Có NFS trên máy khách cục bộ, nhưng tôi đang sao chép thông qua rsync ssh sang máy khách từ xa (không được gắn NFS).
user13798

Trong trường hợp nào hãy thử --checksum như David Spillett gợi ý. Kịch bản của ~ quack vượt qua md5sum cũng có vẻ tốt.
Randy Orrison

6

Sử dụng tùy chọn -c (checksum) trong rsync.

rsync -azcvPh file1 user@remotehost:/tmp/

Tùy chọn -P hiển thị số liệu thống kê tiến trình và sẽ giúp bạn hiểu vị trí / khi chuyển tập tin của bạn bị hỏng. -H làm cho nó "có thể đọc được" và nén -z.


-P cũng ngụ ý - một phần, và đó là tốt để có trong trường hợp này là tốt.
amarillion

3

Bạn đang sử dụng các lệnh tốt nhất nhưng máy tính của bạn bị hỏng. Tôi thực sự khuyên bạn nên chạy memtest86 + trên cả hai máy qua đêm để kiểm tra RAM của bạn.


1
Có thể muốn kiểm tra lỗi ổ cứng quá ...
retracile

1

Bạn luôn có thể bittorrent nó giữa các máy chủ, nhưng tôi không chắc cách tự động hóa nó.

Tôi không làm điều này thường xuyên vì vậy tôi sẽ không viết kịch bản. Thay vào đó, tôi sẽ xây dựng một lớp lót lớn để thực hiện công việc. Về mặt kỹ thuật, đây không phải là một lệnh, mà là tất cả trên một dòng. Không khó để kịch bản-ify nếu bạn làm điều này thường xuyên.

$ md5sum bigfile > bigfile.md5 ; export BIGFILE="notdone" ; while [ "$BIGFILE" eq "notdone" ] ; do rsync --checksum --partial bigfile* user@remotehost:path/to/put/it/in/ ; ssh user@remotehost "cd path/to/put/it/in/; md5sum -c < bigfile.md5" | grep -Ev 'OK$' | [ `wc -l` == "0" ] && BIGFILE="done" ; done

Điều này chia ra thành:

$ md5sum bigfile > bigfile.md5 ;         \  # create our own checksum
  export BIGFILE="notdone" ;             \  # set our check variable
  while [ "$BIGFILE" == "notdone" ]; do  \  # recheck variable state after each pass
     rsync --checksum --partial bigfile* \  # call rsync to copy
          user@remotehost:path/to/put/it/in/ ; \  # and call ssh to check
     ssh user@remotehost                 \  # connect with ssh
       "cd path/to/put/it/in/; md5sum -c < bigfile.md5" \ # and run the check
          | grep -Ev 'OK$'               \  # ignore good output
          | [ `wc -l` == "0" ]           \  # if we didn't find one
            && BIGFILE="done" ;          \  # set our get-out-of-jail card
  done                                   \  # and we're done

Bạn phải thiết lập SSH để đăng nhập vào máy chủ của mình với ủy quyền chính để chạy nó mà không cần tương tác. Nếu bạn làm như vậy, hãy đặt một câu lệnh echo vào đó để cho bạn biết nó ở đâu.

Đã thử nghiệm, nhưng tôi hy vọng các tùy chọn rsync có thể được điều chỉnh.

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.