是否可以通过修改 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 的含义,执行工作的代码的级别有多低,以及文件系统是什么。
水平低,不实用,困难,尤其是ext3 & ext4。假设我们希望做等同于 cat foo bar | sponge foo
的事情,但除了元数据被读取或覆盖之外什么都没有。在这种情况下 foo 必须是一个精确的块大小倍数,技巧是获取两个文件的索引节点和目录结构,rm bar
,卸载文件系统,并根据需要调整相关的 inode(例如 dd
和一些十六进制编辑器),以免破坏其他任何东西。
取决于文件系统,这可能很困难,并且需要更新或修改其他一些受影响或阻碍的数据结构。
如果 foo 不是精确的块大小倍数,那么在连接文件的中间会有垃圾数据。
作弊。使用 in-line deduplication. Btrfs should have that feature someday.
的文件系统
如果我想连接位于同一文件系统上的两个非常大的文件,例如 ext3 或 ext4,linux 是否提供 api 通过读取和修改 inode 以编程方式执行此操作direct/indirect 两个文件的指针,修改filesize和superblock的值?如果是这样,是否有任何关于 api/headerfiles 的文档?
注意:我知道可以使用内置的 linux 二进制文件,如 cat、tee 等,但我的问题是以编程方式实现这一点。
是的,这取决于 concatenate 的含义,执行工作的代码的级别有多低,以及文件系统是什么。
水平低,不实用,困难,尤其是ext3 & ext4。假设我们希望做等同于
cat foo bar | sponge foo
的事情,但除了元数据被读取或覆盖之外什么都没有。在这种情况下 foo 必须是一个精确的块大小倍数,技巧是获取两个文件的索引节点和目录结构,rm bar
,卸载文件系统,并根据需要调整相关的 inode(例如dd
和一些十六进制编辑器),以免破坏其他任何东西。 取决于文件系统,这可能很困难,并且需要更新或修改其他一些受影响或阻碍的数据结构。
如果 foo 不是精确的块大小倍数,那么在连接文件的中间会有垃圾数据。作弊。使用 in-line deduplication. Btrfs should have that feature someday.
的文件系统