rsync --link-dir
매일 스냅샷을 찍는 데 사용하는 것은 하드 링크로 인해 공간을 거의 차지하지 않습니다. 그러나 원래 구조를 미러링하면서 실제 변경된 파일만 포함하는 디렉터리도 갖는 것이 더 좋습니다(전체 백업에 대한 하드 링크). 예를 들어, 이전 디렉터리 구조는 다음과 같습니다.
source/ <- contains the original data
backup/current <- symlink to the most recent snapshot
backup/12102? <- recent daily snapshots (irrelevant)
나중에 필요한 구조는 다음과 같습니다.
source/
backup/current <- symlink to the _updated_ snapshot
backup/previous<- symlink to the snapshot that was was "current" before
backup/12102? <- ...
backup/current.changes <- (symlink to) directory containing _only_ the files that
have changed between "current" and "previous"
답변1
이것은 내가 사용한 스크립트입니다.
#!/bin/bash
set +x
SRC=$1
BCK=$SRC/.snapshots
CUR=$BCK/current
DAT=$(date +%Y-%m/%y%m%d)
DST=$BCK/$DAT
PAR="-aP --chmod=a-w,o-rwx --no-owner"
LNK="--link-dest=$CUR --link-dest=$DST.changeset"
CMP="--compare-dest=$CUR --prune-empty-dirs"
XCL="--exclude-from $BCK/.rsyncignore"
LOG="$BCK/log/$DAT"
LGP="--log-file $LOG"
mkdir -pm750 $DST.incomplete
mkdir -pm750 $DST.changeset.incomplete
mkdir -pm750 $(dirname $LOG)
rsync $PAR $CMP $XCL $LGP.change.log $SRC/ $DST.changeset.incomplete | tee $LOG.change.out
mv $DST.changeset.incomplete $DST.changeset
find $DST.changeset -type d -empty -delete
rsync $PAR $LNK $XCL $LGP.log $SRC/ $DST.incomplete | tee $LOG.out
mv $DST.incomplete $DST
rm -f $CUR
ln -s $DAT $CUR
DST=$1/.snapshots/YYYY-MM/yymmdd
어떤 방식 으로든 스냅샷을 생성하며 $DST.changeset
다음 내용만 포함합니다.만들어진또는수정됨. 삭제(및 간접 참조 mv
)는 인식되지 않지만 세 번째 rsync
스왑은 역 모드로그를 $DST
생성한 다음 직관적인 이름 변경과 함께 구문을 사용하여 불완전한 변경 세트와 병합할 수 있습니다... 또는 로그 출력을 구문 분석하거나 직접 사용할 수 있습니다. 기본적으로 버전 관리를 다시 합니다...$CUR
diff
rsync
git
이전 답변:
내 첫 번째 생각은 이전에 백업한 하드 링크 복사본을 매개 변수와 함께 사용하는 것이었지만 --backup-dir
이렇게 하면더 일찍파일 버전이 변경되었습니다. 제가 찾고 있는 것과 반대되는 버전입니다. 비결은 이것을 뒤집는 것입니다.
- 먼저, 하드 링크를 사용하여 공통 스냅샷을 만듭니다. ( 하드 링크를 명시적 으로 사용하려면 등을
rsync -a --link-dest=/backup/current /source/ /backup/$TODAY.incomplete
사용해야 할 수도 있습니다 )--no-owner --chmod=...
rsync
- 이제 새 스냅샷을 이전 스냅샷으로 덮어쓰되
--backup
변경된 파일을 이동해 보겠습니다.
rsync -ab --backup-dir=/backup/$TODAY.changelog.incomplete --delete /backup/current/ /backup/$TODAY.incomplete mv /backup/$TODAY.changelog.incomplete /backup/$TODAY.changelog
- 축하합니다. 변경 로그를 생성하는 대신 새 스냅샷을 망쳤습니다!
이 문제를 해결하고 정리하세요.
cp -alf /backup/$TODAY.changelog/* /backup/$TODAY.incomplete mv /backup/$TODAY.incomplete /backup/$TODAY mv -f /백업/현재/백업/이전 ln -sf /backup/$TODAY /백업/현재
이 "변경 로그"에는 실제로 변경된 파일이나 새 파일만 포함됩니다(후자는 해당 파일을 잊어버리지 않은 경우에만 해당 ). --delete
삭제나 s는 추적되지 mv
않습니다 . 일부 수정으로 이 문제가 해결될 수도 있습니다...