在linux中创建部分文件内容的硬链接

时间:2011-02-20 01:28:25

标签: linux filesystems

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

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

3 个答案:

答案 0 :(得分:3)

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

但是,没有办法对任何ext文件系统执行此操作,我相信它会在LessFS中隐式发生。

在btrfs中有一种非常难看的方式。如果您创建快照,然后将快照文件截断为100M,则您已有效地实现了目标。

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

答案 1 :(得分:1)

添加到@ Omnifarious的回答:

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

即可
cp fileA fileB && truncate -s 200M fileB

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

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

FUSE

FUSE Hello World

答案 2 :(得分:0)

也许你可以查看ChunkFS。我认为这就是你所需要的(我没试过)。