此命令在用于创建定期备份的脚本中使用:
rsync -aP --link-dest="$BACKUP_DIR/Latest/TheProject" \
"$SOURCE_DIR/" "$BACKUP_DIR/inProgress/TheProject"
$SOURCE_DIR
是要复制的文件的“实时”位置,例如/opt/TheProject
.$BACKUP_DIR/Latest
是指向最新时间戳的软链接,例如$BACKUP_DIR/20220714-0000
。 (在脚本末尾,该$BACKUP_DIR/inProgress
目录被移动到当前时间戳,例如$BACKUP_DIR/20220714-0000
。)$SOURCE_DIR
并且$BACKUP_DIR
位于不同的文件系统上。
项目中的一些大文件几乎永远不会改变,因此使用--link-dest
.
它工作得很好并且硬链接工作(如使用 所见ls -i
),因此例如$BACKUP_DIR/20220714-0000/somedir/bigfile1.bin
将具有与先前版本相同的 inode$BACKUP_DIR/20220713-0000/somedir/bigfile1.bin
等等。
问题是这种硬链接似乎只会发生在最后整个rsync
操作的过程。
rsync
在运行时,实际上$BACKUP_DIR/inProgress/somedir/bigfile1.bin
有一个不同的索引节点(即使它已完全复制并且正在处理其他文件)。
缺点是它需要足够的空间来首先创建源中所有文件的临时副本,即使命令rsync
运行完成后大部分文件将被释放。
例如,如果有 10 个从不更改的 1GB 文件和一个在备份之间更改的 1KB 文件,则仍然需要 10GB 的可用空间来执行该备份,即使最终仅使用大约 1KB 的额外磁盘空间(因为未修改的文件最终将被硬链接)。
我已经尝试过-H
,--inplace
但似乎没有帮助。是否有一个选项可以rsync
在进行过程中创建这些硬链接(这样它只需要至少足够的可用空间来容纳最大的文件,但不一定是所有文件)?