나는 rsnapshot
내 시스템의 파일 시스템을 원격 서버에 자주 백업합니다.
rsync
(익숙 하지만 익숙하지 않은 분들을 위해 작동 방식을 간략히 설명합니다. 백업은 결과 rsnapshot
와 매우 유사한 소스 파일 시스템 트리의 파일별 복사본입니다 . "현재" 백업은 다음과 같습니다. cp -a
항상 hourly.0
이고 이전 이름은 입니다 hourly.1
. 이러한 이름은 각 백업이 시작될 때 순환되며 변경되지 않은 파일을 이전 백업 트리의 해당 항목 에 하드 링크하는 rsnapshot
데 사용됩니다 .rsync --link-dest
hourly.0
hourly.1
백업이 실패하면 이전 백업이 cp -al
현재 백업에 복사(링크)되어 항상 백업이 이루어진 것처럼 나타납니다.
내가 원하는 것은 마지막 백업 이후 변경된 사항이 없으면 백업을 수행하지 않는 것입니다. 여기에는 실패한 백업이 포함될 수도 있고 단순히 마지막 백업 이후 소스 파일 시스템이 수정되지 않은 경우도 포함될 수 있습니다. (원하는 경우 "백업 만들기"를 "불필요한 백업 삭제"로 바꿔 표현할 수도 있습니다.)
hourly.0
다른 곳에 하드 링크되지 않은 파일을 트리에서 찾아보고, 없으면 백업 트리만 삭제하는 방안도 고려했습니다 . 이는 백업의 다른 위치에 유효하게 연결된 파일을 처리하지 않으며 디렉터리에 대한 변경 사항은 고려되지 않습니다. 두 개의 백업 트리 비교를 사용하여 그 출력을 살펴보는 것도 고려했지만 rsync --dry-run
약간 기분이 좋지 않습니다.
더 나은 해결책이 있습니까?
답변1
스냅샷을 찍은 후 rsnapshot diff
which 호출을 사용하여 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
. 그러나 내 목적상 이는 허용됩니다.