我的文件系统中有一些复杂的只读数据。它包含 svn 存储库的某些修订版的数千个快照以及回归测试的输出。快照之间的相同文件已使用硬链接进行重复数据删除。这样,存储容量不需要很大,但仍然消耗大量的 inode,这使得 fsck 对我的主文件系统来说痛苦地漫长。
我想将这些数据移动到另一个文件系统,这样就不会太大影响主文件系统。你有什么建议吗? Squashfs 似乎是一个可能的选择,但我必须检查它是否可以有效地处理硬链接。
答案1
Btrfs 对快照具有本机支持,因此您不必使用硬链接来进行重复数据删除。您可以通过创建 btrfs 文件系统并使用所需的最早版本加载它来重新创建当前设置,并拍摄快照,然后将存储库向前推进到您需要快照的每个时间点并在每个时间点拍摄快照步。这应该比硬链接更有效,并且设置也更简单。
我还认为(尽管我对此还很不确定)squashfs 可以透明地删除重复文件,因此即使它不处理硬链接,您仍然会看到好处。如果您永远不需要更改文件系统中的数据,那么 squashfs 可能是最佳选择,因为 fsck 可以被 md5sum 取代;)
答案2
我会比较喜欢XFS因为我对这个文件系统有很好的经验。但我真的建议您使用您的数据和建议的所有文件系统进行测试。
答案3
如果是 fsck 慢,你尝试过 ext4 吗?他们添加了一些功能,使 fsck 非常快不查看未使用的索引节点:
Fsck 是一个非常慢的操作,尤其是第一步:检查文件系统中的所有 inode。在Ext4中,在每个组的inode表的末尾将存储未使用的inode列表(为了安全起见,带有校验和),因此fsck不会检查这些inode。结果是总 fsck 时间从 2 倍缩短到 20 倍,具体取决于使用的 inode 数量 (http://kerneltrap.org/Linux/Improving_fsck_Speeds_in_Ext4)。必须注意的是,是 fsck,而不是 Ext4,将构建未使用的 inode 列表。这意味着您必须运行 fsck 来获取已构建的未使用 inode 的列表,并且只有下一次 fsck 运行会更快(无论如何,您需要传递 fsck 才能将 Ext3 文件系统转换为 Ext4)。还有一个参与 fsck 加速的功能 - “灵活的块组” - 也可以加速文件系统操作。
答案4
我知道有几家商店使用数据域正是为了这个目的。
您的归档脚本可以非常简单(例如 tar 或 rsync 和 cron),并且您无需担心管理硬链接或在大多数文件系统上无法硬链接的目录。除了节省带宽之外,不需要增量副本。所有的魔法都发生在块层的下面。托管 15-20TB 的虚拟数据而仅使用 1-2TB 的实际磁盘空间并不罕见。您仍然有足够的剩余空间用于磁盘备份。
数据将通过 NFS 或 iSCSI 提供,但我不确定这是否是一个问题
当 FreeBSD 获得 ZFS v23 时,我们其他人就可以使用重复数据删除。