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


21

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


전체 파일에 쓰는 것을 피할 수 있는지 어떻게 수 있습니까? 변경된 내용을 파악하기 위해 전체 파일을 먼저 읽을 필요 는 없습니까?
Mehrdad

2
@Mehrdad는 그렇습니다.하지만 전체를 읽는 것은 문제가되지 않습니다. 경우 rsync전체 파일을 읽은 다음을 검색하고 필요한 부분 만 업데이트, btrfs를에만 업데이트 된 블록을 복사합니다. 하지만 rsync읽기 전체 파일을 기록, 그것은 문제가 될 수 있습니다.
Petr Pudlák

1
@Mehrdad rsync는 전체 파일을 쓰지 않을 수 있다는 것을 알고있을뿐 아니라 인터넷을 통해 완전히 복사 하지 않고도 그렇게 할 수 있습니다. 영리한 작은 프로그램.
Gunther Piez

답변:


31

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암시 하지 --no-whole-file않습니까?
Geremia

아닌가요 --no-whole-file어쨌든 기본?
Geremia

2
두 경로가 모두 로컬 인 경우 @Geremia가 아닙니다. 그리고 내 예제는 2013 년에 사용하고있는 rsync 버전을 --inplace의미하지는 --no-whole-file않지만 자신의 rsync 버전 으로이 실험을 반복하는 것을 환영합니다.
데이터가없는

글쎄, inplace``동일한 / 다른 블록을 스캔하는 것 ''이 아니라 오프셋 0에서 기존 파일을 바로 덮어 쓰는 것입니다. (다른 경우에는 임시 사본이 만들어지고 이전 대상 파일 만 삭제되고 임시 사본의 이름이 바뀝니다. . 아마도 프로세스가 중단됩니다 경우, 가능한 한 오랫동안로 이전 파일을 유지하기 위해 "안전한"것으로 간주이야 물론이 성능을 위해 더 나쁜, 피크 스토리지 소비 (큰 파일을 생각), 아마도 조각 ...) ....
Frank Nocke

1
다른 방법으로 --no-whole-file항상 암시 한다고 가정 합니다 --inplace. 그렇지 않으면 대부분의 성능 향상이 사라질 것입니다. 그래도이 문서를 찾을 수 없었습니다 ...
Frank Nocke

15

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

   --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.

4

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


그리고 파일의 다른 부분을 덮어 쓰지 않는다는 증거가 있습니까?
Petr Pudlák

ZFS에도 동일하게 적용됩니까?
ewwhite

@ewwhite : ZFS는 BTRFS와 같은 COW (copy-on-write)이므로 예입니다.
Geremia

@ PetrPudlák -vvv는 일치 블록을 건너 뛰는 것을 보여줍니다
Tom Hale

3

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

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


2

매뉴얼 페이지에서 :

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가 다른 방식으로 작동하는 것은 거의 불가능하다고 생각합니다.


2
부품을 업데이트 할 필요가 무엇을 결정한 후, 그냥 할 수 추구하는 그 부분에 대신 전체 파일을 작성하는 그들을 업데이트 할 수 있습니다.
Petr Pudlák

0

전체 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옵션으로 가정합니다 .


1
음, 대답은 무엇입니까?
Xen2050

사과드립니다. 나는 충분히주의를 기울이지 않았다. @ dataless의 답변으로 문제가 해결됩니다.
Diagon
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.