RSnapshot을 사용하여 변경 사항이 발생한 경우에만 백업

RSnapshot을 사용하여 변경 사항이 발생한 경우에만 백업

나는 rsnapshot내 시스템의 파일 시스템을 원격 서버에 자주 백업합니다.

rsync(익숙 하지만 익숙하지 않은 분들을 위해 작동 방식을 간략히 설명합니다. 백업은 결과 rsnapshot와 매우 유사한 소스 파일 시스템 트리의 파일별 복사본입니다 . "현재" 백업은 다음과 같습니다. cp -a항상 hourly.0이고 이전 이름은 입니다 hourly.1. 이러한 이름은 각 백업이 시작될 때 순환되며 변경되지 않은 파일을 이전 백업 트리의 해당 항목 에 하드 링크하는 rsnapshot데 사용됩니다 .rsync --link-desthourly.0hourly.1

백업이 실패하면 이전 백업이 cp -al현재 백업에 복사(링크)되어 항상 백업이 이루어진 것처럼 나타납니다.

내가 원하는 것은 마지막 백업 이후 변경된 사항이 없으면 백업을 수행하지 않는 것입니다. 여기에는 실패한 백업이 포함될 수도 있고 단순히 마지막 백업 이후 소스 파일 시스템이 수정되지 않은 경우도 포함될 수 있습니다. (원하는 경우 "백업 만들기"를 "불필요한 백업 삭제"로 바꿔 표현할 수도 있습니다.)

hourly.0다른 곳에 하드 링크되지 않은 파일을 트리에서 찾아보고, 없으면 백업 트리만 삭제하는 방안도 고려했습니다 . 이는 백업의 다른 위치에 유효하게 연결된 파일을 처리하지 않으며 디렉터리에 대한 변경 사항은 고려되지 않습니다. 두 개의 백업 트리 비교를 사용하여 그 출력을 살펴보는 것도 고려했지만 rsync --dry-run약간 기분이 좋지 않습니다.

더 나은 해결책이 있습니까?

답변1

스냅샷을 찍은 후 rsnapshot diffwhich 호출을 사용하여 rsnapshot-diff두 스냅샷 간의 차이점을 기록할 수 있습니다. 단지 inode 번호를 비교하므로 매우 효율적입니다.

또는 백업 트리 외부에 파일을 생성하여 각 백업 전 시간을 기록한 다음 touch timestamp새 백업 전에 새 타임스탬프를 생성 touch timestamp.new하고 이전 타임스탬프보다 새로운 시간이 있는 파일이나 디렉터리가 있는지 테스트합니다.

find tree -newer timestamp

그렇지 않은 경우 백업을 만들지 마십시오. 아무튼 mv timestamp.new timestamp다음번에. 이는 파일 및 디렉터리 타임스탬프를 조작하는 애플리케이션이 없다고 가정합니다.

답변2

나는 또한 이것이 가능성이라고 생각합니다. 우수하다기보다는 일반적입니다.제안나는 다음에서 수락했습니다..

listfiles()
{
    (
        # List attributes of file tree, discarding inode number
        cd "$1" 2>/dev/null && find . -type f -ls | sed -r 's/^ *[1-9][0-9]*//' | sort
    )
}

listfiles hourly.1 >/tmp/list1
listfiles hourly.0 >/tmp/list0
cmp -s /tmp/list1 /tmp/list0 && echo "the same" || echo "different"

또한 .txt를 통해 나열되지 않은 파일과 관련된 ACL 및 확장 속성도 무시됩니다 find -ls. 그러나 내 목적상 이는 허용됩니다.

관련 정보