是否有可能(在经典的 ext4 和/或任何其他文件系统中)创建两个指向相同内容的文件,这样如果一个文件被修改,内容被复制并且两个文件变得不同?节省硬盘空间非常实用。
背景:我在自己的云服务器上分享了一些重要的视频,可以被很多人修改,因此可能有些人修改/删除这些文件......我真的很想确保我有备份这些文件,因此我现在需要维护两个目录,一个正常的 nextcloud 一个,一个“备份”目录,它(至少)是存储它所需大小的两倍。
我想在 nextcloud 目录上创建一个很棒的 git repo,当添加新视频时,它使备份过程变得更加容易(只是git add .
),但git
仍然是 blob 和工作目录之间的空间的两倍。
理想情况下,可以与 git 结合使用的解决方案会很棒(即,它允许我创建视频更改的历史记录,包括提交、签出......而不会使磁盘空间增加一倍。
此外,我很好奇有各种文件系统的解决方案(特别是如果你有不实现快照的文件系统的技巧)。请注意,LVM 快照并不是真正的解决方案,因为我不想备份我的完整卷,只备份一些特定的文件/文件夹。
谢谢!
在写时复制文件系统(Btrfs、ZFS)上是。git-annex与您在 ext4 上可能获得的一样接近。请注意,您可以
mount --bind
在另一个文件系统中的文件夹上使用 LVM 支持的卷或 Btrfs 文件系统。硬链接可以做到这一点,前提是任何编辑文件的人都通过创建一个新文件并在原始文件之上重命名它来完成它。这会破坏链接,因为新文件只链接到一个名称,而另一个链接会被重写覆盖。
问题是,通常很难知道程序是否会覆盖同一个 inode 中的数据,或者是否会在保存时创建一个新文件。
将“备份副本”设为只读可能会有所帮助,因为它们无法修改,但仍可以删除链接并重新创建相同的名称。但是当程序无法写入该 inode 时,这可能会导致很多错误。
因此,在我看来,通过硬链接进行文件级重复数据删除是可能的,但前提是您控制写入链接的程序。
我猜其他答案没有明确说明这一点,所以是的,在 btrfs 上可以使用reflinks而不是硬链接。
当硬链接被修改时,另一个文件名也会显示修改,因为两者都引用同一个文件。
当一个 reflink 被修改时,另一个文件不会被修改。编辑被写入一个新的磁盘块,而两个文件的未更改部分仍然引用相同的磁盘块,从而节省空间。
https://hackernoon.com/reflinks-vs-symlinks-vs-hard-links-and-how-they-can-help-machine-learning-projects-wz2ej3xa7