【问题标题】:Creating a hard link to partial file contents in linux在 linux 中创建指向部分文件内容的硬链接
【发布时间】:2011-12-12 01:06:39
【问题描述】:

我有文件 A,它的大小为 200 MB。现在我想创建一个指向 fileA 的硬链接,命名为 fileB,但我只希望这个文件指向 fileA 的前 100 mb。所以基本上我需要 fileB 指向相同的数据块,但长度不同。它不一定是真正的硬链接,它可以是代理内容的虚拟文件。

我正在考虑以某种方式复制 Inode 并更改长度,但我认为这可能会导致文件系统一致性问题(当数据块移动时等)。是否有任何 linux 工具或用户级系统调用可以让我这样做?

【问题讨论】:

  • 我给了你一个很好的答案,但是这个问题确实属于serverfault,而不是这里。
  • @Omnifarious 我不同意这是服务器故障。这可以解释为一个编程问题(例如,“我会对 ... 做什么样的系统调用?”)
  • 感谢您的提醒,我将问题编辑到灰色区域。

标签: linux filesystems


【解决方案1】:

您不能以您所说的方式直接执行此操作。有些文件系统可以做到这一点。例如LessFS 可以做到这一点。我也相信btrfs 的底层结构支持这一点,所以如果有人把钩子放进去,它就可以在用户级别访问。

但是,对于任何 ext 文件系统都没有办法做到这一点,我相信它隐含在 LessFS 中。

在 btrfs 中有一种非常丑陋的方法。如果你做一个快照,然后将快照文件截断到100M,你就有效地达到了你的目标。

我相信这也适用于 btrfs 和足够新的 cp 版本,您可以使用 cp 复制文件,然后截断一个副本。 cp 的版本必须有--reflink 选项,如果您想对此更加确定,请提供--reflink=always 选项。

【讨论】:

    【解决方案2】:

    添加到@Omnifarious 的答案:

    您所描述的不是硬链接。硬链接本质上是通过路径名对 inode 的引用。 (软链接是对路径名的引用,通过路径名。)没有机制可以说,“我想要这个 inode,但略有不同,只有前 k 个块”。写时复制文件系统可以在幕后为您做到这一点。如果您使用的是这样的文件系统,那么您只需说

    cp fileA fileB && truncate -s 200M fileB
    

    当然,这也适用于非写时复制文件系统,但它会占用额外的 200 MB 而不仅仅是文件系统开销。

    现在,也就是说,您仍然可以使用 FUSE 在 Linux 上轻松实现类似的功能。您可以实现一个文件系统来镜像某些目标目录,但只需人为地设置文件的最大长度(例如 200 MB)。

    FUSE

    FUSE Hello World

    【讨论】:

      【解决方案3】:

      也许您可以查看ChunkFS。我认为这是您需要的(我没有尝试过)。

      【讨论】:

        猜你喜欢
        • 2018-07-09
        • 1970-01-01
        • 2019-07-15
        • 1970-01-01
        • 1970-01-01
        • 2013-06-10
        • 2014-05-25
        • 2011-06-08
        • 1970-01-01
        相关资源
        最近更新 更多