rsync –inplace는 전체 파일 또는 업데이트해야 할 부분에만 쓰나요? (btrfs + rsync 백업의 경우) 한 파일의

나는 btrfs 스냅 샷을 rsync와 결합하여 히스토리가있는 효율적인 백업 솔루션을 만드는 방법에 대한 몇 가지 가이드를 읽고있었습니다. 그러나 rsync --inplace실제로 변경 한 파일의 일부만 수정하는지 또는 전체 파일을 순차적으로 덮어 쓰는지 여부에 따라 달라집니다 . 전체 파일을 작성하면 btrfs가 항상 파일의 새 사본을 작성하므로 아이디어의 효율성이 떨어집니다.



답변

rsync에 두 개의 로컬 경로를 전달하면 기본적으로 델타 전송이 아닌 “-전체 ​​파일”을 사용합니다. 그래서, 당신이 찾고있는 것은 “-전체 ​​파일”입니다. ‘-c’를 요청하면 델타 전송도받을 수 있습니다.

확인 방법은 다음과 같습니다.

$ mkdir a b
$ dd if=/dev/zero of=a/1 bs=1k count=64
$ dd if=/dev/zero of=a/2 bs=1k count=64
$ dd if=/dev/zero of=a/3 bs=1k count=64
$ rsync -av a/ b/
sending incremental file list
./
1
2
3

sent 196831 bytes  received 72 bytes  393806.00 bytes/sec
total size is 196608  speedup is 1.00

그런 다음 파일을 터치하고 다시 동기화

$ touch a/1
$ rsync -av --inplace a/ b/
sending incremental file list
1

sent 65662 bytes  received 31 bytes  131386.00 bytes/sec
total size is 196608  speedup is 2.99

“ls -li”로 inode를 재사용했는지 확인할 수 있지만 전체 64K 바이트를 보냈습니다. –no-whole-file로 다시 시도하십시오

$ touch a/1
$ rsync -av --inplace --no-whole-file a/ b/
sending incremental file list
1

sent 494 bytes  received 595 bytes  2178.00 bytes/sec
total size is 196608  speedup is 180.54

이제 494 바이트 만 보냈습니다. strace를 사용하여 파일이 작성되었는지 여부를 추가로 확인할 수 있지만, 최소한 사용 된 델타 전송이 표시됩니다.

로컬 파일 시스템의 경우 --whole-file는 가정합니다 ( 주석 참조) (rsync에 대한 매뉴얼 페이지 참조). 반면에 네트워크 --no-whole-file를 통한 것으로 가정하면 --inplace자체적으로로 동작합니다 --inplace --no-whole-file.


답변

여기에 매뉴얼의 올바른 부분을 인용 한 확실한 대답이 있습니다.

   --inplace

          [...]

          This option is useful for transferring large files
          with  block-based  changes  or  appended data, and
          also on systems that are disk bound,  not  network
          bound.   It  can  also  help  keep a copy-on-write
                                               *************
          filesystem snapshot from diverging the entire con‐
          *******************
          tents of a file that only has minor changes.


답변

--inplace변경된 영역 만 덮어 씁니다. Btrfs에 쓸 때는 항상 사용하십시오.


답변

rsync의 델타 전송 알고리즘은 전체 파일의 전송 여부 또는 다른 부분 만 처리합니다. 대역폭을 절약하기 위해 두 시스템간에 파일을 재 동기화 할 때의 기본 동작입니다. --whole-file(또는 -W)로 재정 rsync의하여 전체 파일 을 강제 로 전송할 수 있습니다.

--inplacersync전송하는 동안 임시 파일을 만들지 여부를 처리합니다 . 기본 동작은 임시 파일을 만드는 것입니다. 전송이 중단 된 경우 대상 시스템의 기존 파일이 그대로 유지됩니다. --inplace이 동작을 무시 rsync하고 기존 파일을 직접 업데이트하도록 지시 합니다. 따라서 전송이 중단 된 경우 대상 시스템에 파일이 일치하지 않을 위험이 있습니다.


답변

매뉴얼 페이지에서 :

This  option  changes  how  rsync transfers a file when its data
needs to be updated: instead of the default method of creating a
new  copy  of  the file and moving it into place when it is com-
plete, rsync instead writes the updated  data  directly  to  the
destination file.

이로 인해 파일 전체를 덮어 씁니다 .rsync가 다른 방식으로 작동하는 것은 거의 불가능하다고 생각합니다.


답변

전체 rsync에 대한 이론적 작업은 이 백서에 설명되어 있습니다.

논문 참조 : D. Rasch and R. Burns. 내부 동기화 : 모바일 및 무선 장치의 파일 동기화 USENIX 연례 기술 회의, FREENIX 트랙, 91-100, USENIX, 2003.

링크에서 :

… 우리는 기존의 rsync 구현을 수정하여 전체 재구성을 지원합니다.

초록 : […] rsync가 공간이 제한된 장치에서 작동하도록 수정했습니다. 대상 호스트의 파일은 현재 버전의 파일이 사용하는 동일한 스토리지에서 업데이트됩니다. 공간이 제한된 장치는 기존의 rsync 파일을 사용할 수 없습니다. 기존 rsync 파일은 이전 버전과 새로운 버전의 파일 모두에 메모리 나 저장소가 필요하기 때문입니다. 작은 메모리가있는 휴대 전화 및 핸드 헬드 PC의 파일 동기화가 그 예입니다. 인플레 이스 rsync 알고리즘은 파일의 압축 된 표현을 그래프로 인코딩 한 다음 인플레 이스 속성을 달성하기 위해 토폴로지 적으로 정렬됩니다. […]

따라서 이것은 rsync –inplace가 수행하는 작업의 기술적 세부 사항 인 것으로 보입니다. 논문의 시작 부분에 따르면 :

내부 재구성을 통해 파일 동기화 작업을 수행하도록 rsync를 수정했습니다. […] 임시 공간을 사용하는 대신 대상 파일의 변경은 현재 버전이 이미 차지하고있는 공간에서 이루어집니다. 이 도구는 공간이 제한된 장치를 동기화하는 데 사용할 수 있습니다.

분명 해짐에 따라 데이터가없는의 대답 @ , 이것은 그 의미 --inplace동일한 저장 공간을 사용하지만, 여전히 그 공간에 전체 파일을 복사 할 수 있습니다. 특히, 로컬 파일 시스템에서 /로 복사 할 때 rsync는 --whole-file옵션을 가정합니다 . 그러나 다른 네트워크 시스템에있을 때는 --no-whole-file옵션으로 가정합니다 .


답변