rsync가 중단 된 후 다시 시작할 수 있습니까?


188

내가 사용하는 rsync많은 수의 파일을 복사하는 것이 아니라 내 OS (우분투)가 예기치 않게 다시 시작됩니다.

재부팅 후 다시 실행 rsync했지만 터미널의 출력에서 rsync이미 복사 한 것을 여전히 복사했습니다. 그러나 rsync소스와 대상의 차이점을 발견하여 차이점을 복사 할 수 있다고 들었습니다 . 그래서 rsync지난번에 남은 것을 재개 할 수 있는지 궁금 합니다.


예, rsync는 이미 복사 한 파일을 다시 복사하지 않습니다. 탐지가 실패 할 수있는 몇 가지 경우가 있습니다. 이미 복사 된 모든 파일을 복사 했습니까? 어떤 옵션을 사용하셨습니까? 소스 및 대상 파일 시스템은 무엇입니까? 모든 것이 복사 된 후 rsync를 다시 실행하면 다시 복사됩니까?
Gilles

@ 질 : 감사합니다! (1) rsync가 터미널의 출력에서 ​​동일한 파일을 다시 복사하는 것을 보았습니다. (2) 옵션은 다른 게시물과 동일 sudo rsync -azvv /home/path/folder1/ /home/path/folder2합니다. (3) 소스와 대상은 모두 NTFS이고, 구매 소스는 외장 HDD이며, 대상은 내장 HDD입니다. (3) 현재 실행 중이며 아직 완료되지 않았습니다.
Tim

(대용량 파일에 유용) 부분적으로 전송 된 파일을 재개 할 수있는 --partial 플래그도있다
jwbensley

3
@Tim 내 머리 꼭대기에서 최소한 시계 왜곡과 시간 해상도 차이가 있습니다 (2 초 단위로 시간을 저장하는 FAT 파일 시스템의 일반적인 문제, --modify-window옵션이 도움이 됨).
Gilles

1
/ 또는 /가없는 경우 파일 소스 경로 인수의 마지막 끝에 소스 디렉토리와 이름이 같은 서브 디렉토리에 추가 사본을 작성합니다.
Skaperen

답변:


285

우선, 질문의 "재개"부분과 관련하여, 송신단 --partial이 완전히 전송 된 것처럼 사라지는 경우 수신 측에 부분적으로 전송 된 파일을 유지하도록 지시합니다.

파일을 전송하는 동안 파일은 대상 폴더 (예 :) .TheFileYouAreSending.lRWzDC또는 --partial-dir스위치 를 설정 한 경우 특별히 선택된 폴더에 숨겨진 파일로 임시 저장됩니다 . 전송이 실패하고 --partial설정되지 않은 경우이 숨겨진 파일은이 암호 이름 아래의 대상 폴더에 남아 있지만 --partial설정되어 있으면 파일은 파일 이름 TheFileYouAreSending이더라도 실제 대상 파일 이름 (이 경우 )으로 이름이 변경됩니다. 완료되지 않았습니다. 요점은 나중에 중 하나를 다시 rsync를 실행하여 전송을 완료 할 수 있다는 것입니다 --append또는 --append-verify.

그래서, --partial하지 않는 자체가 실패하거나 취소 전송을 다시 시작합니다. 다시 시작하려면 다음 실행에서 위에서 언급 한 플래그 중 하나를 사용해야합니다. 따라서 대상에 괜찮은 것처럼 보이지만 실제로는 불완전한 파일이 대상에 포함되지 않도록하려면을 사용하지 않아야합니다 --partial. 반대로, 대상 디렉토리에 숨겨진 실패한 파일을 남기지 않고 나중에 전송을 완료 할 수 있다는 것을 알고 싶다면 --partial도움이 될 것입니다.

--append위에서 언급 한 스위치 와 관련 하여 실제 "재개"스위치이며 사용 여부에 관계없이 사용할 수 있습니다 --partial. 실제로를 사용 --append하면 임시 파일이 만들어지지 않습니다. 파일은 대상에 직접 기록됩니다. 이와 관련하여 전송에 실패한 --append경우와 동일한 결과를 제공 --partial하지만 숨겨진 임시 파일을 작성하지는 않습니다.

요약하자면, 큰 파일을 이동하고 rsync중지 된 정확한 지점에서 취소되거나 실패한 rsync 작업을 재개하는 옵션을 원할 경우 다음 시도 에서 --append또는 --append-verify스위치 를 사용해야합니다 .

@Alex가 아래에서 지적한 것처럼 버전 3.0.0 rsync에는 이제 새로운 옵션 인 옵션이 있으므로 해당 스위치가 존재하기 전에 --append-verify작동 --append합니다. 의 동작을 원할 수도 --append-verify있으므로로 버전을 확인하십시오 rsync --version. Mac을 사용 중이고 rsyncfrom을 사용하지 않는 경우 homebrew(적어도 El Capitan을 포함하여) 이전 버전을 사용하고 --append대신 을 사용해야 --append-verify합니다. 그들이 왜 행동을 지키지 않았고 --append대신 새로 온 사람을 지명 했는지 --append-no-verify는 약간 당혹 스럽습니다. 어느 쪽이든, --appendrsync버전 3과 동일하기 전에 --append-verify새로운 버전.

--append-verify위험하지는 않습니다 : 항상 양쪽 끝의 데이터를 읽고 비교할뿐만 아니라 데이터가 동일하다고 가정하지 않습니다. 이것은 체크섬을 사용하여 수행하므로 네트워크에서는 쉽지만 실제로 대상에 추가하여 전송을 재개하려면 와이어의 양쪽 끝에서 공유 된 양의 데이터를 읽어야합니다.

두 번째로, "rsync가 소스와 대상 간의 차이를 찾을 수 있으므로 차이점을 복사 할 수 있다고 들었습니다."

맞습니다. 델타 전송이라고하지만 다른 것입니다. 이를 활성화하려면 -c, 또는 --checksum스위치 를 추가하십시오 . 이 스위치가 사용되면 rsync는 와이어의 양쪽 끝에있는 파일을 검사합니다. 이 작업은 청크 단위로 수행되며, 양쪽 끝의 체크섬을 비교하고 서로 다르면 파일의 다른 부분 만 전송합니다. 그러나 @Jonathan이 아래에서 지적한 것처럼 파일의 양 끝이 같은 크기 일 때만 비교가 이루어집니다. 크기가 다르면 rsync가 전체 파일을 업로드하여 동일한 이름으로 대상을 덮어 씁니다.

이를 위해서는 처음에 양쪽 끝에서 약간의 계산이 필요하지만, 예를 들어 작은 크기의 변경이 포함 된 대용량 파일 고정 크기 파일을 자주 백업하는 경우 네트워크로드를 줄이는 데 매우 효율적일 수 있습니다. 기억해야 할 예로는 가상 머신 또는 iSCSI 대상에 사용되는 가상 하드 드라이브 이미지 파일이 있습니다.

--checksum대상 시스템에 완전히 새로운 파일 배치를 전송하는 데 사용하는 경우 rsync는 전송하기 전에 소스 시스템에서 체크섬을 계산합니다. 왜 모르겠어요 :)

간단히 말해 :

당신은 종종 그냥 작업을 취소하고 나중에 다시 시작하는 옵션을 선택하고 싶다 "A와 B에서 물건을 이동"을 rsync를 사용하는 경우 하지 않는 사용 --checksum하지만, 않습니다 사용합니다 --append-verify.

rsync를 사용하여 데이터를 자주 백업하는 경우 --append-verify지속적으로 크기가 커지지 만 한 번 작성된 후에는 거의 수정되지 않는 대용량 파일을 보내는 습관이 없다면 큰 도움이되지 않을 것입니다. 당신은 스토리지에 백업하는 경우 보너스 팁으로, 같은 스냅 숏을 지원 btrfs하거나 zfs, 가산, --inplace스위치하면 변경된 파일이 다시 생성되지 않고 오히려 변경된 블록이 오래된 사람을 통해 직접 기록되기 때문에 당신은 스냅 샷 크기를 줄이는 데 도움이됩니다. 이 스위치는 약간의 변경 만있을 때 대상에서 파일의 복사본을 생성하여 rsync를 피하려는 경우에도 유용합니다.

를 사용 --append-verify하면 rsync는 항상 같은 크기의 모든 파일에서와 같이 동작합니다. 수정 또는 다른 타임 스탬프가 다르면 해당 파일을 자세히 조사하지 않고 소스로 대상을 덮어 씁니다. --checksum이름과 크기가 같은 모든 파일 쌍의 내용 (체크섬)을 비교합니다.

업데이트 2015-09-01 @Alex가 작성한 점을 반영하도록 변경되었습니다 (감사합니다!)

2017-07-14 업데이트 됨 @Jonathan의 의견 을 반영하여 변경되었습니다 (감사합니다!)


4
이것은 말한다 --partial충분하다.
Cees Timmerman


2
@CMCDragonkai 사실, Alexander의 답변을 아래에서 확인하십시오 --partial-dir. 이것에 대한 완벽한 글 머리 기호 인 것 같습니다. 나는 완전히 무언가를 놓쳤을지도 모른다;)
DanielSmedegaardBuus

2
@DanielSmedegaardBuus 느린 연결에서 직접 테스트했으며 이것이 내가 볼 수있는 것입니다 --partial : rsync는 파일을 임시 이름으로 복사하고 연결이 중단됩니다. 원격 rsync는 결국 해당 파일을 일반 이름으로 이동하고 종료 한 다음 를 사용 --partial하거나 사용 하지 않고 다시 실행 --append하면 부분적으로 전송 된 원격 파일의 복사본으로 새 임시 파일이 초기화 된 다음 연결이 끊어진 곳부터 복사가 계속됩니다. (우분투 14.04 / rsync 3.1)
이즈 카타

4
설명 된 동작에 대한 신뢰 수준은 어느 정도 --checksum입니까? 에 따르면 man델타 전송 (아마도 rsync기본 동작) 보다 전송할 파일을 결정하는 것과 더 관련이 있습니다 .
Jonathan Y.

56

TL; DR :

rsync 매뉴얼 페이지에서 권장하는대로 부분 디렉토리를 지정하십시오.

--partial-dir=.rsync-partial

더 긴 설명 :

실제로 --partial-dir옵션을 사용하여이 작업을 수행하는 기본 제공 기능이 있으며 이는 --partial--append-verify/ --append또는 대안에 비해 몇 가지 장점이 있습니다.

rsync 매뉴얼 페이지에서 발췌 :

--partial-dir=DIR
      A  better way to keep partial files than the --partial option is
      to specify a DIR that will be used  to  hold  the  partial  data
      (instead  of  writing  it  out to the destination file).  On the
      next transfer, rsync will use a file found in this dir  as  data
      to  speed  up  the resumption of the transfer and then delete it
      after it has served its purpose.

      Note that if --whole-file is specified (or  implied),  any  par-
      tial-dir  file  that  is  found for a file that is being updated
      will simply be removed (since rsync  is  sending  files  without
      using rsync's delta-transfer algorithm).

      Rsync will create the DIR if it is missing (just the last dir --
      not the whole path).  This makes it easy to use a relative  path
      (such  as  "--partial-dir=.rsync-partial")  to have rsync create
      the partial-directory in the destination file's  directory  when
      needed,  and  then  remove  it  again  when  the partial file is
      deleted.

      If the partial-dir value is not an absolute path, rsync will add
      an  exclude rule at the end of all your existing excludes.  This
      will prevent the sending of any partial-dir files that may exist
      on the sending side, and will also prevent the untimely deletion
      of partial-dir items on the receiving  side.   An  example:  the
      above  --partial-dir  option would add the equivalent of "-f '-p
      .rsync-partial/'" at the end of any other filter rules.

기본적으로 rsync는 전송이 실패 할 때 삭제되는 임의의 임시 파일 이름을 사용합니다. 언급했듯이, --partialrsync를 사용 하면 불완전한 파일 이 성공적으로 전송 된 것처럼 유지하여 나중에 --append-verify/ --append옵션을 사용하여 파일에 추가 할 수 있습니다. 그러나 이것이 최적이 아닌 몇 가지 이유가 있습니다.

  1. 백업 파일이 완전하지 않을 수 있으며 여전히 변경되지 않은 원격 파일을 확인하지 않으면 알 방법이 없습니다.

  2. --backup및 을 (를) 사용하려는 경우 --backup-dir이전에 종료 한 적이없는이 파일의 새 버전을 버전 기록에 추가했습니다.

--partial-dir그러나을 사용하는 경우 rsync는 임시 부분 파일을 보존하고 다음에 파일을 실행할 때 해당 부분 파일을 사용하여 다운로드를 다시 시작하므로 위의 문제가 발생하지 않습니다.


38

-P옵션을 명령 에 추가 할 수 있습니다 .

로부터 man페이지 :

--partial By default, rsync will delete any partially transferred file if the transfer
         is interrupted. In some circumstances it is more desirable to keep partially
         transferred files. Using the --partial option tells rsync to keep the partial
         file which should make a subsequent transfer of the rest of the file much faster.

  -P     The -P option is equivalent to --partial --progress.   Its  pur-
         pose  is to make it much easier to specify these two options for
         a long transfer that may be interrupted.

따라서 대신 :

sudo rsync -azvv /home/path/folder1/ /home/path/folder2

하다:

sudo rsync -azvvP /home/path/folder1/ /home/path/folder2

물론 진행률 업데이트를 원하지 않으면을 사용할 수 있습니다 --partial.

sudo rsync --partial -azvv /home/path/folder1/ /home/path/folder2

@Flimm이 정확하지 않습니다. 중단 (네트워크 또는 수신 측)이있는 경우 --partial을 사용할 때 부분 파일이 유지되고 rsync가 재개 될 때 사용됩니다. 맨 페이지에서 : "--partial 옵션을 사용하면 rsync가 부분 파일을 <b> 나머지 파일의 후속 전송 속도를 훨씬 빠르게 </ b> 유지하도록 지시합니다."
gaoithe

2
@Flimm과 @gaoithe, 내 대답은 정확하지 않았으며 확실히 최신 상태가 아닙니다. 3 +의 버전을 반영하도록 업데이트했습니다 rsync. 그러나 실패한 전송을 재개 --partial하지 않는 것이 중요합니다 . 자세한 내용은 내 답변을 참조하십시오 :)
DanielSmedegaardBuus

2
@DanielSmedegaardBuus 나는 그것을 시도 -P했고 내 경우에는 충분하다. 버전 : 클라이언트는 3.1.0이고 서버는 3.1.1입니다. ctrl-c를 사용하여 하나의 큰 파일 전송을 중단했습니다. 뭔가 빠진 것 같아요.
guettli

vv? 즉 v2 번 사용 했습니까?
mrgloom

rsync는 파일의 일부를 -azvvP?
mrgloom

1

나는 당신이 강제로 전화하고 있다고 생각합니다. rsync따라서 다시 불러올 때 모든 데이터가 다운로드됩니다. --progress옵션을 사용 하여 복사하지 않은 파일 만 복사하고 --delete이미 복사 된 경우 파일을 삭제하는 옵션을 사용하십시오.

rsync -avz --progress --delete -e  /home/path/folder1/ /home/path/folder2

ssh를 사용하여 다른 시스템에 로그인하고 파일을 복사하는 경우,

rsync -avz --progress --delete -e "ssh -o UserKnownHostsFile=/dev/null -o \
StrictHostKeyChecking=no" /home/path/folder1/ /home/path/folder2

이 개념을 이해하는 데 실수가 있으면 알려주세요 ...


1
답변을 편집하고 특별 ssh 호출의 기능과 그에 대한 조언을 설명 할 수 있습니까?
Fabien 2016 년

2
@Fabien 그는 rsync에게 두 개의 ssh 옵션을 설정하도록 지시합니다 (rsync는 ssh를 사용하여 연결). 두 번째 호스트는 연결중인 호스트가 아직 "알려진 호스트"파일에 존재하지 않는 경우 확인 메시지를 표시하지 않도록 ssh에 지시합니다. 첫 번째 파일은 ssh에게 알려진 기본 호스트 파일 (~ / .ssh / known_hosts)을 사용하지 않도록 지시합니다. 대신 / dev / null을 사용합니다. 물론 항상 비어 있습니다. ssh가 호스트를 찾지 못하면 일반적으로 확인 메시지가 표시되므로 옵션 2가 나타납니다. 연결되면, SSH는을 / dev / null, 효과적으로 즉시 그것을 잊어 :)에 지금 알려진 호스트를 기록
DanielSmedegaardBuus

1
...하지만 아마도 rsync 작업 자체에 어떤 영향이 있는지 궁금 할 것입니다. 답은 없습니다. 연결하려는 호스트가 SSH 알려진 호스트 파일에 추가되지 않는 경우에만 사용됩니다. 아마도 그는 많은 수의 새로운 서버, 임시 시스템 등에 연결하는 시스템 관리자 일 것입니다. 몰라요 :)
DanielSmedegaardBuus

4
"복사되지 않은 파일 만 복사하려면 --progress 옵션을 사용하십시오"무엇?
moi

1
여기에 몇 가지 오류가 있습니다. 하나는 매우 심각 합니다. 소스에없는 대상의--delete 파일 삭제합니다 . 덜 심각한 --progress것은 사물이 복사되는 방식을 수정하지 않는다는 것입니다. 복사 할 때마다 각 파일에 대한 진행률 보고서를 제공합니다. (그것을 대체 나는 심각한 오류를 수정 --remove-source-files.)
폴 드 Aoust

1

이 간단한 스크립트를 사용하고 있습니다. 특정 플래그를 자유롭게 조정하거나 매개 변수화하십시오.

#!/bin/bash

while [ 1 ]
do
    rsync -avz --partial [source] [dest]:
    if [ "$?" = "0" ] ; then
        echo "rsync completed normally"
        exit
    else
        echo "Rsync failure. Backing off and retrying..."
        sleep 180
    fi
done

1

늦게 도착했지만 같은 질문이 있었고 다른 대답을 찾았습니다.

--partial플래그 ( "부분적으로 전송 된 파일을 보관"에서 rsync -h)이기 때문에, 대용량 파일에 유용합니다 --append( "짧은 파일에 데이터를 추가")하지만, 질문에 대한 것입니다 많은 수의 파일.

이미 복사 된 파일을 피하려면 -u(또는 --update"수신기에서 최신 파일 건너 뛰기")를 사용하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.