int fallocate(int fd, int mode, off_t offset, off_t len);
[...]
折叠文件空间
指定FALLOC_FL_COLLAPSE_RANGE标志(自 Linux 3.15 起可用)mode会从文件中删除一个字节范围,而不会留下漏洞。要折叠的字节范围从字节开始offset并继续 len
。操作完成时,从 location 开始的文件内容offset+len将追加到 location
offset,文件将len变小字节。
[...]
增加文件空间
指定FALLOC_FL_INSERT_RANGE标志(自 Linux 4.1 起可用)mode通过在文件大小内插入一个洞而不覆盖任何现有数据来增加文件空间。该孔将开始
offset并持续len字节。当在文件中插入空洞时,从 开始的文件内容offset将向上移动(即到更高的文件偏移量)len字节。在文件中插入一个洞会按len字节增加文件大小。
在最近的 Linux 系统上这实际上是可能的,但使用块(大部分时间为 4096),而不是字节粒度,并且仅在某些文件系统(ext4 和 xfs)上。
fallocate(2)
从手册页引用:文件系统可能不需要将文件存储在连续区域中(这确实非常不灵活),但通常文件存储在固定大小的块(或连续块的序列)中。这样做可以简化实现,并且块通常是底层设备块大小的倍数。
因此,实现任意长度的块插入会使文件系统格式和实现变得相当复杂,或者需要移动潜在的大量数据。这些都不是很好,并且可以在文件系统 API 之上的用户空间中构建复杂的数据结构。