Linux下操作稀疏文件的函数有哪些?

Grz*_*cki 2 linux filesystems rsync inode sparse-files

Linux下操作稀疏文件的函数有哪些?(假设在 C 中,非常欢迎有关其他系统的注释)例如:

  • 通过去除文件内部的一部分在文件内部打孔
  • 研究结构,例如生成表示分离的连续数据块的开始和结束的对序列
  • 通过重新分配块范围(即不移动实际数据),在某个时候将文件拆分为两个
  • 调查 inode 和其他相关方面?(也许可以以写时复制的方式将一些块分配给多个文件?)

语境:

我想到的最初问题是我man rsync--sparse选择之后:

为什么rsync--sparse选项有冲突--inplace

它是文件系统调用api的限制吗?

从数据结构的角度来看,如果源稀疏文件被视为非连续数据块的序列,那么我对“r”同步的期望会在目标上解除分配源中不存在的那些范围,分配丢失的范围,休息相应地更新(即使使用标准的 rsync 滚动散列算法,将所有剩余序列视为一个,或在每个序列上单独运行)。

参考:

man rsync
Run Code Online (Sandbox Code Playgroud)
   -S, --sparse
          Try to handle sparse files efficiently so they take up less space on the destination.  Conflicts with --inplace because it's
Run Code Online (Sandbox Code Playgroud)

不可能以稀疏的方式覆盖数据。

Ste*_*itt 10

稀疏文件被设计为对用户空间透明:通过寻找过去未使用的区域来创建空洞,并作为零块读取。他们不能使用标准的用户空间的API进行检测,至少目前还没有-如指出,斯特凡Chazelas,至少Solaris和Linux支持SEEK_DATASEEK_HOLE lseek(2)标志,允许用户空间程序找到漏洞,而这些标志可能被添加到POSIX一些观点。

这解释了rsync'--sparse--inplaceoptions之间的不兼容性:在可移植地写入现有文件时,无法在现有数据中创建孔。--sparse通过重写整个文件,跳过(长)零序列来工作,这会导致操作系统和支持它们的文件系统上的文件稀疏。

在 Linux 上,您可以使用fiemapioctle2fsprogs'来检索文件稀疏性的详细信息filefrag(8)。请参阅Linux 上的详细稀疏文件信息。在书写方面,您可以使用fallocate(2)(和方便的fallocate(1)实用程序)在现有文件中打孔,如果孔覆盖整个块,则使其稀疏。支持依赖于文件系统——目前只有 XFS、btrfs、ext4 和 tmpfs 支持这些操作。最新的内核(自4.1)和非常的最新版本util-linux在文件的支持插入孔,移孔(之后的内容fallocate -i,在推出util-linux2.30应该很快被释放)。

您的最后两个问题是文件系统手术,我不确定是否有任何通用系统调用或 ioctl 可用于执行此类操作。reflink- 兼容的文件系统允许文件共享其内容;这可以使用实现FICLONEFICLONERANGE读写控制