rsync --link-dest 仅在整个传输结束时匹配硬链接

rsync --link-dest 仅在整个传输结束时匹配硬链接

此命令在用于创建定期备份的脚本中使用:

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在进行过程中创建这些硬链接(这样它只需要至少足够的可用空间来容纳最大的文件,但不一定是所有文件)?

相关内容