具有写入硬链接副本的文件系统

Cha*_*eon 3 linux filesystems

研究案例:

所有家庭成员通过 OpenVPN 的自动备份系统。

许多文件(尤其是照片)是家庭成员之间共同的。

因此,通过脚本,我用硬链接替换相同的文件。

然后出现一个问题:如果用户更改其文件,则所有用户的文件都会更改。删除文件不是问题,重命名也不是问题。仅更改文件内容。

所以我希望当用户更改其文件(这是一个硬链接)时,然后消除硬链接并使用应用的更改创建原始文件的副本。

这对于任何文件系统或任何黑客或功能来说都是可能的吗?

use*_*686 7

您正在寻找reflink功能,该功能于 2009 年推出。它仅适用于某些文件系统 \xe2\x80\x93 目前的 Btrfs、XFS和即将推出的 Bcachefs。(ZFS 仍在努力。)

\n

在可能的情况下用于--reflink创建 CoW 副本(从 coreutils 9.0 开始这已经是默认设置),或者--reflink=always如果您想确保它永远不会退回到执行完整副本:

\n
cp --reflink OLDFILE NEWFILE\n
Run Code Online (Sandbox Code Playgroud)\n

新文件将具有不同的 inode,但最初将与原始文件共享所有数据范围(可以使用filefrag -v FILE或进行比较xfs_io -rc "fiemap -v" FILE)。

\n
\n

另一种选择是文件系统重复数据删除,它由 Btrfs 和 ZFS 等支持,并允许在现有文件下合并相同的块。在 ZFS 中,这是同步发生的(“在线”或文件写入后立即发生),而在 Btrfs 中,它是作为批处理作业完成的(即“离线”,使用 Bees 或“duperemove”等工具)。不幸的是,ZFS 中的在线重复数据删除对资源使用有重大影响。但是,如果您使用 Btrfs,则可以偶尔duperemove -rd对文件夹运行一次。

\n

最后,无论您使用引用链接还是重复数据删除,您还需要使用本身执行重复数据删除的备份工具(仅使用支持硬链接的备份工具是不够的,因为引用链接看起来不像硬链接)。例如,Restic 和 Borg 使用的归档格式是内容寻址的(很像 Git),因此相同的块将在每个存储库中仅自动存储一次,即使它们出现在单独的文件中。

\n
\n

Linux 上的 OCFS2 集群文件系统至少在名称上也有“reflinks”,但不支持标准的 reflink 创建 API,因此必须使用 OCFS2 特定的工具来创建它们。

\n

在 Windows 上,ReFS 支持名为“块克隆”的引用链接(尽管它似乎没有内置 CLI 工具);NTFS 没有。最后,在 macOS 上,cp -c只要您使用 APFS,就会创建引用链接(CoW 副本)。

\n