rsync: 파일 끝에 줄을 추가하면 --no-whole-file이 작동하지 않습니다.

rsync: 파일 끝에 줄을 추가하면 --no-whole-file이 작동하지 않습니다.

내 문제는rsync가 증분 전송을 수행하지 않는 이유질문.

먼저 1GB 파일을 생성하고 /targetrsync를 사용하여 폴더로 전송합니다. 나중에 doo파일 끝에 s 문자열을 추가했습니다. 동일한 파일을 /target폴더로 전송했을 때 업데이트된 부분만이 아닌 전체 파일이 전송된 것을 발견했습니다.

[묻다]rsync가 파일의 업데이트된 부분만 증분 전송하도록 강제하려면 어떻게 해야 합니까? 가능합니까, 아니면 전체 파일을 재전송하는 유일한 옵션입니까?

예:

$ mkdir target
$ fallocate -l 1G target/temp_1GB_file
$ rsync --inplace --no-whole-file  --size-only --progress temp_1GB_file doo
temp_10GB_file
  1073741824 100%  227.30MB/s    0:00:04 (xfer#1, to-check=0/1)

sent 131163 bytes  received 229425 bytes  48078.40 bytes/sec
total size is 1073741824  speedup is 2977.75

$ echo 'doo' >> temp_10GB_file
$ rsync --no-whole-file  --size-only --progress temp_1GB_file doo # Here complete file has been transferred all over again.
  temp_10GB_file
  1073741828 100%  226.44MB/s    0:00:04 (xfer#1, to-check=0/1)

sent 131171 bytes  received 229418 bytes  48078.53 bytes/sec
total size is 1073741828  speedup is 2977.74

답변1

전체 파일을 전송하는 것이 아닙니다.

sent 131171 bytes  received 229418 bytes  48078.53 bytes/sec
total size is 1073741828  speedup is 2977.74

자세한 출력에서는 두 번째 호출에서 파일의 일부만 전송되었음을 보여줍니다 rsync.

rsync송신자를 위한 하위 프로세스와 수신자를 위한 하위 프로세스가 시작되며, 이러한 하위 프로세스는 체크섬과 데이터를 서로 주고받습니다.

rsync체크섬조각파일. 기본적으로 블록 크기는 파일 크기에 따라 다릅니다. 송신자와 수신자 간의 블록 체크섬이 일치하지 않으면 전체 블록이 전송됩니다. 마지막 블록은 문자열을 추가하여 수정되었으므로 전송되어야 했습니다. 그렇기 때문에 파일에서 실제로 변경된 바이트 수가 아니라 131171바이트가 전송되는 것으로 표시됩니다(이 특정 파일의 블록 크기는 약 130KB입니다).

-B설명서 의 옵션 도 참조하세요 rsync.

답변2

전체 파일을 전송하지 않고 원본 및 대상 파일 전체를 읽어 차이점을 확인합니다.

--no-whole-file간단한 "전체 파일을 복사하여 파일 바꾸기"를 보다 복잡한 "소스 읽기 및 체크섬 계산, 대상 읽기 및 체크섬 계산, 차이 업데이트"로 교환합니다 .

여기에 있는 한 시스템에서는 두 번째 작업을 수행하는 것이 원래 작업을 덮어쓰는 것보다 시간이 더 오래 걸립니다. (여러 번 시도한 후 시간은 약 +/- 3초 정도 달라졌습니다.)

  • 29초 안에 원본 복사
  • 원본을 복사하고 업데이트하는 데 기본값은 28초입니다.--whole-file
  • 업데이트된 원본을 비교하고 복사하는 데 59초--no-whole-file

rsync때로는 델타 전송 알고리즘을 사용하지 않는 (타당한) 이유가 있습니다.

관련 정보