4

If I want to concatenate two very large files residing on the same filesystem, say ext3 or ext4 for example, does linux provide an api to do it programmatically by reading and modifying the inode direct/indirect pointers of the two files, and modifying the filesize and superblock values? If so, is there any documentation on the api/headerfiles for that?

Note: I am aware of built in linux binaries like cat, tee, etc which could be used, but my question is about programmatically achieving this.

4

1 回答 1

3

是的,这取决于连接的含义、执行工作的代码的低级以及文件系统是什么。

  1. 低级,不切实际,困难,特别是对于ext3 & ext4。假设我们希望做 的等价物cat foo bar | sponge foo,但除了元数据被读取或覆盖之外没有其他任何东西。在这种情况下, foo必须是一个精确的块大小倍数,诀窍是获取两个文件的 inode 和 dir 结构rm bar,卸载文件系统,并根据需要调整相关的inode,(比如dd一些十六进制编辑器),以免破坏其他任何东西。取决于可能很困难的文件系统,并且需要更新或修改其他一些受影响或阻碍的数据结构。

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

  2. 欺骗。使用具有内联重复数据删除的文件系统。 Btrfs应该有朝一日具有该功能。

于 2016-08-05T16:24:58.767 回答