![是否有文件系统允许我在 O(1) 的文件中间插入一些块?](https://linux22.com/image/87837/%E6%98%AF%E5%90%A6%E6%9C%89%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F%E5%85%81%E8%AE%B8%E6%88%91%E5%9C%A8%20O(1)%20%E7%9A%84%E6%96%87%E4%BB%B6%E4%B8%AD%E9%97%B4%E6%8F%92%E5%85%A5%E4%B8%80%E4%BA%9B%E5%9D%97%EF%BC%9F.png)
假设
- 我们有巨大的文件F。
- 我们喜欢“围绕”寻找s在 O(1) 时间内创建一个新的空(填充零)块(即不重写所有重新挖掘部分)
- “around”意味着我们可以围绕s到最近的文件系统块大小,并且要插入的块也可以是文件系统块大小
是否有系统调用/文件系统允许这样做?
btrfs_clone
如果不是,使用(mentied)来模仿这种行为是个好主意吗?这里) 如何?
答案1
引用自这个答案:
从 Linux 4.1 开始,错误定位(2)支持该
FALLOC_FL_INSERT_RANGE
标志,该标志允许在文件中间插入给定长度的孔,而无需重写后续数据。然而,它是相当有限的:该洞必须插入在文件系统块边界处,并且插入的洞的大小必须是文件系统块大小的倍数。此外,在 4.1 中,仅 XFS 文件系统支持此功能,4.2 中添加了 Ext4 支持。
从错误定位(1):
fallocate -d [-o offset] [-l length] filename
(...)
-d, --dig-holes
Detect and dig holes. This makes the file sparse in-place, without using extra disk space. The minimum size of the hole depends on
filesystem I/O block size (usually 4096 bytes). Also, when using this option, --keep-size is implied. If no range is specified by --offset
and --length, then the entire file is analyzed for holes.
You can think of this option as doing a "cp --sparse" and then renaming the destination file to the original, without the need for extra
disk space.
See --punch-hole for a list of supported filesystems.
(...)
-p, --punch-hole
(...)
Supported for XFS (since Linux 2.6.38), ext4 (since Linux 3.0), Btrfs (since Linux 3.7) and tmpfs (since Linux 3.5).