如果我想连接驻留在同一文件系统上的两个非常大的文件,例如ext3或ext4,linux是否通过读取和修改两个文件的inode直接/间接指针,以编程方式提供api,以及修改文件大小和超级块值?如果是的话,是否有关于api / headerfiles的文档?
注意:我知道可以使用内置的linux二进制文件,如cat,tee等,但我的问题是以编程方式实现这一点。
答案 0 :(得分:3)
是的,取决于连接的含义,以及执行工作的代码的级别低,以及文件系统是什么。
低级别,不切实际,困难,尤其是 ext3 & EXT4 。假设我们希望相当于cat foo bar | sponge foo
,但除了元数据被读取或覆盖之外没有任何东西。在这种情况下, foo 必须是精确的块大小,并且诀窍是获取两个文件的inode和dir结构rm bar
,卸载文件系统,并调整相关的inode但是请你,(说dd
和一些十六进制编辑器),以免破坏其他任何东西。
取决于可能困难的文件系统,并且需要更新或修改一些其他受影响或阻碍的数据结构。
如果 foo 不是精确的块大小,那么在连接文件的中间就会出现垃圾数据。
作弊。使用in-line deduplication的文件系统。 Btrfs应具有该功能someday.