我有fileA,其大小为200 MB。现在我想创建一个名为fileB的fileA硬链接,但我只希望这个文件指向fileA的前100 MB。所以基本上我需要fileB指向相同的数据块,但长度不同。它不一定必须是真正的硬链接,它可以是代理内容的虚拟文件。
我正在考虑以某种方式重复Inode并改变长度,但我认为这可能导致文件系统一致性问题(当数据块移动时等)。是否有任何Linux工具或用户级系统调用可以让我这样做?
答案 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)。
答案 2 :(得分:0)
也许你可以查看ChunkFS。我认为这就是你所需要的(我没试过)。