Linux下操作稀疏文件的函数有哪些? (假设用 C 语言,非常欢迎有关其他系统的注释)例如:
- 通过删除文件内部的一部分来在文件内部打孔
- 研究结构,例如生成表示分离的连续数据块的开始和结束的对序列
- 通过重新分配块范围(即不移动实际数据),在某个时刻将文件分成两部分
- 调查索引节点和其他相关方面? (也许可以以写时复制的方式将一些块分配给多个文件?)
语境:
我想到的最初问题是在man rsync
选项--sparse
之后:
为什么rsync
选项--sparse
与 冲突--inplace
?
是文件系统调用api的限制吗?
从数据结构的角度来看,如果源稀疏文件被视为非连续数据块的序列,那么我期望“r”同步在目标上取消分配源中不存在的那些范围,分配丢失的范围,其余相应地更新(即使使用标准 rsync 滚动哈希算法,将所有剩余序列视为一个序列,或在每个序列上单独运行)。
参考:
man rsync
-S, --sparse Try to handle sparse files efficiently so they take up less space on the destination. Conflicts with --inplace because it's
不可能以稀疏方式覆盖数据。
答案1
稀疏文件被设计为对用户空间透明:通过寻找过去未使用的区域来创建空洞,并被读取为零块。使用标准用户空间 API 无法检测到它们,至少目前还不能——因为指出经过斯蒂芬·查泽拉斯,至少 Solaris 和 Linux 支持SEEK_DATA
和SEEK_HOLE
lseek(2)
允许用户空间程序查找漏洞的标志,这些标志可能是添加到 POSIX在某一点。
rsync
这解释了'--sparse
和--inplace
options: 写入现有文件时的不兼容性便携式的,无法在现有数据中创建漏洞。--sparse
其工作原理是重写整个文件,跳过(长)零序列,这会导致操作系统和支持它们的文件系统上出现稀疏文件。
在 Linux 上,您可以使用以下命令检索文件稀疏性的详细信息fiemap
读写控制, 和e2fsprogs
'filefrag(8)
;看Linux 上详细的稀疏文件信息。在写作方面,您可以使用fallocate(2)
(以及方便的fallocate(1)
实用程序)在现有文件中打孔,如果孔覆盖整个块,则使其稀疏。支持取决于文件系统 - 当前仅 XFS、btrfs、ext4 和 tmpfs 支持这些操作。最近的内核(自 4.1 起)和非常最近的版本util-linux
支持在文件中插入漏洞,将内容转移到漏洞之后(fallocate -i
在 2.30 中引入util-linux
,应该很快就会发布)。
您的最后两个问题是文件系统手术,我不确定是否有任何通用系统调用或 ioctl 可用于执行此类操作。reflink
- 兼容的文件系统允许文件共享其内容;这可以通过使用来实现和ioctlFICLONE
FICLONERANGE
。