![文件更改时“拆分”的硬链接](https://linux22.com/image/160833/%E6%96%87%E4%BB%B6%E6%9B%B4%E6%94%B9%E6%97%B6%E2%80%9C%E6%8B%86%E5%88%86%E2%80%9D%E7%9A%84%E7%A1%AC%E9%93%BE%E6%8E%A5.png)
是否有可能(在经典的 ext4 和/或任何其他文件系统中)创建两个指向相同内容的文件,这样如果一个文件被修改,内容就会重复并且两个文件变得不同?节省硬盘空间非常实用。
语境:我在自己的云服务器上分享了一些重要的视频,可以被很多人修改,因此有些人可能会修改/删除这些文件...我真的很想确保我有这些文件的备份文件,因此我现在需要维护两个目录,正常的 nextcloud 目录和一个“备份”目录,这(至少)使存储它所需的大小增加了一倍。
我正在考虑在 nextcloud 目录之上创建一个 git 存储库,它使添加新视频时的备份过程变得更加容易(只是git add .
),但git
仍然使 blob 和工作目录之间的空间加倍。
理想情况下,可以结合使用的解决方案git
会非常棒(即允许我创建视频更改的历史记录,包括提交、签出......而无需使磁盘空间增加一倍)。
此外,我很好奇有一个各种文件系统的解决方案(特别是如果您对不实现快照的文件系统有技巧的话)。请注意,LVM 快照并不是真正的解决方案,因为我不想备份整个卷,而只想备份一些特定的文件/文件夹。
答案1
在写入时复制文件系统(Btrfs、ZFS)上是。git 附件与您在 ext4 上可能得到的最接近。请注意,您可以mount --bind
将 LVM 支持的卷或 Btrfs 文件系统覆盖在另一个文件系统中的文件夹上。
答案2
我想其他答案没有明确说明这一点,所以是的,可以在 btrfs 上使用转发链接而不是硬链接。
- 硬链接是同一文件的两个不同名称,它们占用同一磁盘块。
- 引用链接是两个不同的文件,它们恰好指向同一块磁盘。
当修改硬链接时,另一个文件名也会显示修改,因为两者都引用同一文件。
修改引用链接时,其他文件不会被修改。编辑内容将写入新的磁盘块,而两个文件中未更改的部分仍然引用相同的磁盘块,从而节省空间。
与硬链接中两个目录条目引用相同的 inode 条目不同,引用链接有两个 inode 条目,并且共享的是数据块。
答案3
是否有可能(在经典的 ext4 和/或任何其他文件系统中)创建两个指向相同内容的文件,这样如果一个文件被修改,内容就会重复并且两个文件变得不同?节省硬盘空间非常实用。
硬链接可以做到这一点,假如任何编辑这些文件的人都是通过创建一个新文件并在原始文件的基础上重命名它来完成的。这会破坏链接,因为新文件仅链接到一个名称,而另一个链接会被重写覆盖。
问题是,一般很难知道程序是否会覆盖同一索引节点中的数据,或者在保存时是否会创建新文件。
将“备份副本”设置为只读可能会有所帮助,因为这样它们就无法修改,但仍然可以删除链接并重新创建相同的名称。但是,当程序无法写入该索引节点时,这可能会导致很多错误。
因此,在我看来,通过硬链接进行文件级重复数据删除是可能的,但前提是您控制写入链接的程序。