변경된 파일을 백업하는 동안 rsync가 소스 디렉터리에 대한 하드 링크를 생성하도록 하려면 어떻게 해야 합니까?

변경된 파일을 백업하는 동안 rsync가 소스 디렉터리에 대한 하드 링크를 생성하도록 하려면 어떻게 해야 합니까?

백업 서버의 동일한 파일 시스템에 두 개의 백업 디렉터리가 있습니다. 첫 번째는 "Clone"이라고 합니다. 여기에는 매일 밤 rsync를 통해 원격으로 업데이트되는 내 노트북의 복제본이 포함되어 있습니다. 두 번째는 "백업"이라고 하며, 복제본의 중요한 부분에 대한 주간 rsync 스냅샷입니다. 공간을 절약하려면 --link-dest를 사용하여 복사본에 대한 하드 링크가 아닌 복제본으로 "백업"을 생성하십시오.

rsync -avum --link-dest=/clone /clone/ /backup

이제 --backup 옵션을 사용하여 변경된 파일의 이전 버전을 백업에서 보존 영역으로 복사하고 싶습니다. 필요한 경우나 실수로 중요한 항목을 삭제한 경우입니다. --link-dest 없이도 잘 작동합니다.

rsync -avumb --backup-dir=/holding/2016_10_22 /clone/ /backup

그러나 이렇게 하면 백업에 변경된 파일의 복사본이 생성되어 공간이 낭비됩니다. 하드 링크가 필요합니다. 하지만 --link-dest parm을 다시 추가하면:

rsync -avumb --backup-dir=/holding/2016_10_22 --link-dest=/clone /clone/ /backup

...그럼에만삭제됨파일이 백업되었습니다. 변경된 파일은 자동으로 하드링크됩니다. 그 이유는 --link-dest가 --copy-dest의 논리를 공유하기 때문입니다. 즉, 복사 대상(또는 링크 대상) 파일을 기준으로 소스 파일이 변경되지 않은 경우에는 전송되지 않고 복사/링크 대상 디렉터리에서 대상 디렉터리로 복사/링크된다. 소스 디렉터리를 링크 대상 디렉터리로 사용하기 때문에 삭제되지 않은 모든 파일은 "변경되지 않은" 상태로 자동 처리됩니다.

이 작업은 두 단계로 수행할 수 있습니다. 먼저 --link-dest 없이 --backup을 수행하고, 다시 --backup 없이 --link-dest를 수행합니다. (최신 버전의 rsync는 동일한 파일을 하드 링크로 대체합니다.) 하지만 저는 이 모든 작업을 한 번에 수행하는 것을 정말 선호합니다.

하드 링크만 생성하면서 --backup을 수행할 수 있는 방법이 있습니까? (내가 정말로 원하는 것은 파일 전송 대신 하드 링크를 사용하는 "일반" rsync입니다. --link-dest를 사용하는 것은 해당 옵션의 의도된 논리를 고려할 때 약간 해킹처럼 보입니다.)

보너스 질문: 매뉴얼 페이지에는 빈 대상에만 --link-dest를 사용하는 것이 선호된다는 내용이 나와 있는 것 같습니다.

기존 파일의 속성이 조정될 수 있고 이는 하드 링크를 통해 대체 대상 파일에 영향을 미칠 수 있으므로 이 옵션은 빈 대상 계층에 복사할 때 가장 잘 작동합니다. 또한 변경사항을 항목별로 분류하는 것은 다소 혼란스러울 수 있습니다.

"엉망"을 항목화하는 부분은 약간 모호합니다. 파일 속성에 크게 신경 쓰지 않는다고 가정하면 null이 아닌 대상에서 --link-dest를 사용하는 것이 실제로 "위험"합니까? 누구든지 예를 들어 줄 수 있습니까?

답변1

위에서 언급했듯이 프로세스는 두 단계로 진행되었습니다.

src = the "live" clone directory, a mirror of my laptop = primary backup
dst = the weekly snapshot of important parts clone
trashdir = the items from src that don't exist in dst, because they have since been deleted, sorted into date-stamped directories

cmd = ("rsync -avumb --stats --delete --delete-excluded --filter='merge %s' --backup-dir=%s %s %s" %
       (filterfile, trashdir, src, dst))

cmd = ("rsync -avum --stats --delete --delete-excluded --filter='merge %s' --link-dest=%s %s %s" %
       (filterfile, src, src, dst))

첫 번째 단계는 복제본의 중요한 부분을 백업하고 마지막 백업 이후 삭제된 파일을 휴지통에 저장하는 것입니다. (어떤 이유에서인지 선택한 파일의 중간 백업만 하고 일주일에 한 번만 업데이트하기를 원합니다.)

두 번째 단계에서는 백업의 파일을 복제본에 대한 하드 링크로 변환합니다. 결과적으로 백업은 실제 공간을 전혀 차지하지 않습니다. 정의에 따르면, 휴지통은 클론 및 백업에서 삭제된 파일만 포함하므로 하드 링크 파일이 아닙니다.

--delete-excluded 플래그가 필요한지 확실하지 않습니다(특히 두 번째 명령에서). 백업을 생성할 때 무시할 복제본 부분을 정의하는 필터 파일을 변경할 경우를 대비해 그대로 둡니다.

나는 5년 안에 휴지통이 클론 크기만큼 커졌으므로 총 크기 = 클론 x2라는 사실을 발견했습니다. 이는 삭제된 파일의 기록이 6년 동안 있었고 날짜별로 쉽게 정리할 수 있었기 때문에 허용될 수 있었습니다.

위의 것 외에도 cp -al날짜가 표시되고 순환되고 하드 링크된 약 한 달 전의 스냅샷에 대한 복제본을 실행하는 스크립트가 있습니다. 여기에는 변경되었지만 삭제되지 않은 파일이 포함됩니다. 한 달의 전체 크기는 클론 크기의 약 절반 정도인 것으로 보입니다.

따라서 총 디스크 공간은 복제본의 약 2.5배입니다.

  • 자체 복제, 밤마다 업데이트
  • 선택한 파일 백업, 일주일 동안 안정적
  • 버전이 지정된 클론의 1개월 스냅샷
  • 6년간의 삭제된 파일

이는 원본 디스크 분실, 파일 덮어쓰기, 이전 버전 필요, 파일 삭제 후 나중에 필요 방지를 위한 좋은 방법이라고 생각합니다.

약간 복잡하고 타사 소프트웨어를 사용하면 달성할 수 있지만 저에게는 효과적이며 사라지거나 기능이 크게 변경될 가능성이 없는 낮은 수준의 도구를 기반으로 구축되었습니다.

(@gsl - 실제로 업데이트를 요청해 주셔서 감사합니다. python3으로 업데이트했을 때 스크립트 중 하나가 손상되어 몇 달 동안 실행되지 않는 것을 발견했습니다. 오류 로그에 더 주의를 기울여야 합니다!)

그러나 저는 이것을 단순화하는 방법에 여전히 관심이 있습니다. 따라서 제가 하고 있는 작업을 좀 더 간단한 방법으로 수행할 수 있다면 언제든지 의견을 주시기 바랍니다.

관련 정보