소스 파일이 동일하지만 별개인 경우 rsync가 대상의 하드링크를 유지합니까?

소스 파일이 동일하지만 별개인 경우 rsync가 대상의 하드링크를 유지합니까?

소프트웨어 배포를 위해 (Linux 기반) rsync 서버를 실행하고 있습니다. 내 통제 범위를 벗어난 (Windows 기반) 소스 저장소 서버는 rsync를 통해 소프트웨어 패키지를 여기에 푸시하고, 전 세계 약 100개의 위성 서버도 역시 rsync를 통해 이 서버에서 가져옵니다.

소스 저장소에는 큰 중복 파일이 많이 포함되어 있습니다. 이러한 중복 항목을 하드링크로 대체하여 위성 서버의 디스크 공간과 대역폭 소비를 줄이고 싶습니다. 원본 리포지토리 관리자가 원본에서 그렇게 하기를 원하지 않거나 할 수 없어서 배포 서버에서 사후에 하려고 합니다. fdupes중복 그룹을 찾아 단일 파일에 대한 하드링크로 바꾸는 명령을 기반으로 간단한 bash 스크립트를 만들었습니다 . -H 옵션 덕분에 위성 서버로의 rsync 전송은 이러한 하드링크를 원하는 대로 보존합니다. 그러나 소스 저장소에서 전송하면 일관되지 않은 결과가 생성됩니다. 때로는 중복 제거가 보존됩니다. 원본 서버가 중복 제거된 그룹의 모든 파일을 재전송하는데, 원본 파일이 변경되지 않았음에도 중복 제거가 깨지는 경우가 있습니다.

따라서 내 질문: 두 개의 동일하지만 별도의 파일을 동기화하라는 요청을 받고 해당 파일이 이미 대상에 올바른 콘텐츠로 존재하지만 동일한 파일에 대한 하드링크로 존재하는 경우 rsync의 공식적인 동작은 무엇입니까? 파일 재전송의 정확한 기준은 무엇입니까? 원본에 하드링크가 없더라도 해당 상황에서 대상의 하드링크가 보존되도록 하는 방법이 있습니까?

답변1

tl;dr: 대상에서 하드 링크를 통해 파일 수준 중복 제거를 유지하려면 옵션 rsync을 사용하여 실행하세요 --checksum.

내가 수행한 일련의 실험에 따르면 전체 답변은 다음과 같습니다.

두 파일이 소스에 하드링크되지 않은 경우 에서는 rsync각각을 개별적으로 대상에 동기화합니다. 파일이 대상에서 하드링크되었는지 여부는 중요하지 않습니다. 파일 중 하나(또는 둘 다)가 재전송되면 대상의 하드 링크가 끊어지고 그렇지 않으면 그대로 유지됩니다. 즉, --hard-links옵션을 사용하더라도 rsync파일이 소스에서 하드링크되지 않았기 때문에 대상에서 하드링크가 끊어지지 않습니다.

파일 재전송 기준은 --checksum( -c) 및 --ignore-times( -I) 옵션에 따라 다릅니다.

  • 이 옵션을 --checksum지정하면 소스와 대상 간의 크기나 체크섬이 다른 파일만 재전송됩니다. 결과적으로 파일 내용이 변경되지 않은 경우 소스에 존재하지 않더라도 대상의 하드 링크가 유지됩니다.
  • 옵션이 --ignore-times주어지면 모든 파일이 재전송되며 소스에 존재하지 않는 대상의 하드 링크가 끊어집니다.
  • 이 두 옵션 중 어느 것도 제공되지 않으면 에서는 rsync결정을 위해 소스 및 대상 파일의 수정 타임스탬프를 사용합니다. 이 경우 두 소스 파일의 타임스탬프가 다르면 두 타임스탬프 중 하나만 일치할 수 있으므로 대상의 하드 링크가 항상 끊어집니다.

답변2

-H 또는 --hard-links 옵션을 사용하면 소스 하드 링크가 유지됩니다.

그럴 것이다~ 아니다하드 링크 생성 - 동일한 체크섬을 가진 파일을 찾아 삭제한 후 교체할 하드 링크를 추가하여 해당 작업을 수행해야 합니다. 결국, rsync를 통해 모든 콘텐츠 중복 파일을 동일한 파일에 대한 하드 링크로 만드는 것을 원하지 않을 것입니다. 길이가 0인 모든 파일이 하드 링크였다고 상상해 보세요. 하나에 콘텐츠를 추가하면 모든 콘텐츠가 변경됩니다.

관련 정보