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
创建反向modlog,然后可以使用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 /备份/$TODAY /备份/当前
请注意,此“更改日志”实际上仅包含已更改或新文件(仅当您没有忘记时才包含后者--delete
);删除和mv
s 都不会被跟踪。一些修改可能会解决这个问题...