간단히 말해서:

간단히 말해서:

한 번은 rsync많은 수의 파일을 복사했지만 운영 체제(Ubuntu)가 예기치 않게 다시 시작되었습니다.

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

재부팅 후 rsync다시 실행해 보았는데, 터미널 출력 결과 rsync이전에 복사했던 내용이 계속 복사되어 있는 것을 확인했습니다. 그런데 소스와 타겟의 차이점을 찾아내는 것은 가능하다고 들었으니 rsync차이점만 복사하면 됩니다.

원본과 대상 모두 NTFS입니다. 원본은 외장형 HDD이고 대상은 내장형 HDD입니다.

rsync제 경우에는 지난번에 남은 부분을 복원할 수 있는지 궁금합니다 .

답변1

먼저, 질문의 "복원" 부분에 관해서는 --partial수신 측에 부분적으로 전송된 파일을 보관하도록 지시하고 전송 측이 사라지면 완전히 전송된 것처럼 됩니다.

파일이 전송되면 해당 파일은 대상 폴더(예: .TheFileYouAreSending.lRWzDC)에 숨겨진 파일로 임시 저장되거나, 스위치를 설정한 경우 특별히 선택한 폴더에 저장됩니다 --partial-dir. 전송이 실패하고 --partial설정되지 않은 경우 숨겨진 파일은 해당 신비한 이름으로 대상 폴더에 남아 있지만, 설정되면 파일 이름이 실제 대상 파일 이름(이 경우 ) --partial으로 변경됩니다 . TheFileYouAreSending불완전한. 요점은 --append나중에 rsync를 다시 사용하거나 실행하여 전송을 완료 할 수 있다는 것입니다 --append-verify.

그래서 --partial아니야그 자체실패했거나 취소한 전송을 재개합니다. 이를 복원하려면 다음에 실행할 때 위 플래그 중 하나를 사용해야 합니다. 따라서 정상적인 것처럼 보이지만 실제로는 불완전한 파일이 대상에 포함되지 않도록 해야 하는 경우에는 이 방법을 사용하면 안 됩니다 --partial. , 그리고 나중에 이전을 완료할 수 있다는 것을 알고 계신다면 --partial제가 도와드릴 수 있을까요?

--append위에서 언급한 스위치 와 마찬가지로 이 스위치도 사용 여부에 관계없이 실제 "복구" 스위치입니다. 실제로 --partial이 스위치를 사용할 때 --append임시 파일이 생성되지 않습니다 . 파일이 대상에 직접 기록됩니다. 이 경우 --append전송 실패와 동일한 결과를 제공하지만 숨겨진 임시 파일을 생성하지 않습니다.--partial

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

@Alex가 아래에서 지적했듯이 버전 3.0.0부터 해당 스위치가 존재하기 전처럼 작동하는 rsync새로운 옵션이 있습니다 . 이것은 아마도 여러분이 항상 원하는 동작일 것입니다 . 따라서 버전을 확인하십시오 . Mac을 사용 중이고 from 을 사용하지 않는 경우 (적어도 El Capitan까지) 이전 버전을 사용하게 되므로 대신 해당 버전을 사용해야 합니다 . 왜 그들이 새로운 사람에게 이름을 붙이는 대신 이런 행동을 계속하지 않았는지는 다소 의아스럽습니다. 어느 쪽이든 이전 버전 3은 최신 버전과 동일합니다 .--append-verify--append--append-verifyrsync --versionrsynchomebrew--append--append-verify--append--append-no-verify--appendrsync--append-verify

--append-verify위험하지 않습니다. 단순히 동일하다고 가정하기보다는 항상 양쪽 끝의 데이터를 읽고 비교합니다. 이를 위해 체크섬을 사용하므로 네트워크에서는 쉽지만 대상에 추가하여 실제로 전송을 재개하려면 회선의 양쪽 끝에서 공유되는 데이터의 양을 읽어야 합니다.

둘째, "rsync가 원본과 대상 간의 차이점을 찾을 수 있으므로 차이점을 복사할 뿐이라고 들었습니다."라고 말씀하셨습니다.

예, 증분 전송이라고 하지만 다른 의미입니다. 이 기능을 활성화하려면 -c, 또는 --checksum스위치를 추가하세요. 이 스위치를 사용하면 rsync는 줄의 양쪽 끝에 파일이 있는지 확인합니다. 이 작업을 청크로 수행하고 양쪽 끝의 체크섬을 비교하며, 서로 다른 경우 파일의 다른 부분만 전송합니다. 그러나 @Jonathan이 아래에서 지적한 것처럼 비교는 파일 양쪽 끝의 크기가 동일한 경우에만 수행됩니다. 크기가 다르면 rsync가 전체 파일을 업로드하여 동일한 이름의 대상을 덮어쓰게 됩니다.

처음에는 양쪽 끝에서 몇 가지 계산이 필요하지만 매우 큰 파일이나 일반적으로 작은 변경 사항이 포함된 고정 크기 파일을 자주 백업하는 경우 네트워크 로드를 줄이는 데 매우 효과적일 수 있습니다. 떠오르는 예로는 가상 머신이나 iSCSI 대상에 사용되는 가상 하드 드라이브 이미지 파일이 있습니다.

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

간단히 말해서:

rsync를 자주 사용하여 "A에서 B로 항목 이동"을 하고 해당 작업을 취소하고 나중에 다시 시작하는 옵션을 원하는 경우,아니요을 사용 --checksum하지만하다사용 --append-verify.

rsync를 자주 사용하여 항목을 백업하는 경우 --append-verify크기가 커지지만 작성된 후 거의 수정되지 않는 대용량 파일을 보내는 데 익숙하지 않은 한 rsync를 사용하는 것은 아마도 큰 도움이 되지 않을 것입니다. 추가 팁으로, 스냅샷 지원 스토리지(예: btrfs또는zfs--inplace

를 사용하면 --append-verifyrsync는 동일한 크기의 모든 파일에 대해 작동하는 것처럼 작동합니다. 수정 사항이나 다른 타임스탬프가 다른 경우 해당 파일을 더 이상 확인하지 않고 대상을 소스로 덮어씁니다. --checksum이름과 크기가 동일한 각 파일 쌍의 내용(체크섬)이 비교됩니다.

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

2017-07-14에 업데이트됨@Jonathan이 작성한 점을 반영하도록 변경되었습니다(감사합니다!)

답변2

간단히 말해서:

rsync 매뉴얼 페이지에서 제안한 대로 디렉토리의 일부를 지정하십시오.

--partial-dir=.rsync-partial

더 자세한 설명:

실제로 옵션을 사용하여 이 작업을 수행하는 내장 함수가 있는데, 이는 and/alternative --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-dirrsync를 사용하면 임시 부분 파일을 유지하고 해당 부분 파일을 사용하여 다음에 실행될 때 다운로드를 계속하므로 위의 문제가 발생하지 않습니다.

답변3

-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

답변4

몇 가지 중요한 규칙:

  1. rsync-W, --whole-file옵션이 제공되지 않는 한 delta-xfer 알고리즘을 사용하여 다른 청크를 다시 보낼지 여부를 결정합니다 .
  2. rsync--inplace옵션이 없으면 데이터를 임시 디렉터리에 쓰고 완료되면 대상으로 이동합니다 .
  3. delta-xfer가 활성화된 경우 부분적으로 전송된 데이터 블록의 체크섬 계산을 건너뛰려면 --append옵션을 추가할 수 있지만 부분적으로 전송된 데이터의 ID를 직접 확인해야 합니다.
  4. --append을 의미하며 --inplace이는 그 자체로 다음을 의미합니다.--partial

제 경우에는 CPU와 디스크 부하를 많이 주지 않고 델타 파일을 보내고 싶습니다. 명령은 다음과 같습니다.

rsync -avPL --inplace --append --bwlimit 30m -e 'ssh -o StrictHostKeyChecking=no' <src> <dst>

관련 정보