是否可以通过修改 inode 数据结构和超级块将两个文件连接在同一个 linux 文件系统上?

Is it possible to concatenate two files on the same linux filesystem by modifying the inode datastructure and superblock?

如果我想连接位于同一文件系统上的两个非常大的文件,例如 ext3 或 ext4,linux 是否提供 api 通过读取和修改 inode 以编程方式执行此操作direct/indirect 两个文件的指针,修改filesize和superblock的值?如果是这样,是否有任何关于 api/headerfiles 的文档?

注意:我知道可以使用内置的 linux 二进制文件,如 cat、tee 等,但我的问题是以编程方式实现这一点。

是的,这取决于 concatenate 的含义,执行工作的代码的级别有多低,以及文件系统是什么。

  1. 水平低,不实用,困难,尤其是ext3 & ext4。假设我们希望做等同于 cat foo bar | sponge foo 的事情,但除了元数据被读取或覆盖之外什么都没有。在这种情况下 foo 必须是一个精确的块大小倍数,技巧是获取两个文件的索引节点和目录结构,rm bar,卸载文件系统,并根据需要调整相关的 inode(例如 dd 和一些十六进制编辑器),以免破坏其他任何东西。 取决于文件系统,这可能很困难,并且需要更新或修改其他一些受影响或阻碍的数据结构。

    如果 foo 不是精确的块大小倍数,那么在连接文件的中间会有垃圾数据。

  2. 作弊。使用 in-line deduplication. Btrfs should have that feature someday.

  3. 的文件系统