한 번은 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-verify
rsync --version
rsync
homebrew
--append
--append-verify
--append
--append-no-verify
--append
rsync
--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-verify
rsync는 동일한 크기의 모든 파일에 대해 작동하는 것처럼 작동합니다. 수정 사항이나 다른 타임스탬프가 다른 경우 해당 파일을 더 이상 확인하지 않고 대상을 소스로 덮어씁니다. --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는 전송이 실패하면 삭제되는 임의의 임시 파일 이름을 사용합니다. 앞에서 언급했듯이 --partial
rsync를 사용하면 불완전한 파일을 보존할 수 있습니다.전송이 성공한 것처럼--append-verify
나중에 / 옵션을 사용하여 --append
추가 할 수 있습니다 . 그러나 이러한 상황이 최적이 아닌 데에는 몇 가지 이유가 있습니다.
백업 파일이 불완전할 수 있으며 원격 파일(여전히 변경되지 않은 파일)을 확인하지 않고는 알 수 있는 방법이 없습니다.
--backup
및 을 사용하려고 하면--backup-dir
이전 버전 기록에 존재하지 않았던 파일의 새 버전이 추가된 것입니다.
그러나 --partial-dir
rsync를 사용하면 임시 부분 파일을 유지하고 해당 부분 파일을 사용하여 다음에 실행될 때 다운로드를 계속하므로 위의 문제가 발생하지 않습니다.
답변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
몇 가지 중요한 규칙:
rsync
-W, --whole-file
옵션이 제공되지 않는 한 delta-xfer 알고리즘을 사용하여 다른 청크를 다시 보낼지 여부를 결정합니다 .rsync
--inplace
옵션이 없으면 데이터를 임시 디렉터리에 쓰고 완료되면 대상으로 이동합니다 .- delta-xfer가 활성화된 경우 부분적으로 전송된 데이터 블록의 체크섬 계산을 건너뛰려면
--append
옵션을 추가할 수 있지만 부분적으로 전송된 데이터의 ID를 직접 확인해야 합니다. --append
을 의미하며--inplace
이는 그 자체로 다음을 의미합니다.--partial
제 경우에는 CPU와 디스크 부하를 많이 주지 않고 델타 파일을 보내고 싶습니다. 명령은 다음과 같습니다.
rsync -avPL --inplace --append --bwlimit 30m -e 'ssh -o StrictHostKeyChecking=no' <src> <dst>