我希望我理解稀疏文件的概念。我也知道cp
命令--sparse=...
然而,当谷歌搜索实际应用程序时,我发现关于使用通用操作系统文件 I/O API 读取/写入文件的应用程序的透明程度的含糊不清的陈述(我的意思是不是在极低的级别,只是 fopen()、fclose () ETC)
当阅读博客时,它并不干净,解释谈论应用程序(例如测试编辑器)如何通过显式向稀疏文件写入零来“破坏”稀疏文件。我认为这就是重点,如果有一个稀疏文件,并且应用程序写入零,则该文件不会被物理存储。应用程序不必知道这一点,也不必处理间隙之类的事情,这是文件系统的责任。
问题
假设有一个稀疏文件。它会完全透明的是否申请?假设有一个 1G 稀疏文件,其中第一个字节非零,所有其他字节均为零。当“常见”应用程序打开该文件时,我想它可以打开它,将看到它的长度为1G,并且可以查找中间(0.5G),因为它不稀疏,可以写入一个非零字节中间,保存,关闭,它将在文件系统上保持稀疏,不是吗?
文件会“自动”稀疏吗?我的意思是,应用程序只是创建一个文件,然后写入一堆零,然后写入,是否稀疏?如果不是,应用程序应该如何将该文件创建为稀疏文件?
答案1
在大多数情况下,稀疏文件对程序是透明的,并且程序不需要关心它们正在处理的文件是否稀疏。
稀疏文件是通过跳过块、在文件中创建空洞来创建的,而不是通过写入零来创建。如果一个程序寻找文件末尾之后的位置,然后导致文件大小更新(通过写入更多数据),或者“截断”文件长度大于其包含的数据,生成的文件将是稀疏的(如果底层文件系统支持稀疏文件)。
稀疏文件在读取时是透明的(空洞被读取为零),但在写入时则不然:将任何数据写入块都会强制分配并最终写入。特别是,这意味着如果底层文件系统已满,则在不更改文件长度的情况下写入文件可能会失败。这不意味着代码编写文件应该有稀疏文件的特殊情况;它只是意味着应该在所有写入中处理错误(如您所期望的)。
Linux 的实现lseek
提供扩展以允许分析文件中的漏洞。
文件不会自动变得稀疏;这就是 GNU 选项存在的原因cp
——--sparse
它配置cp
为检测自身的零运行并在目标中产生漏洞而不是写入它们。如果文件自动变得稀疏,则没有必要这样做。
在您的场景中,一个开头包含一个字节数据的 1G 文件将在磁盘上有一个块,其中包含该字节,后跟一个块中适合的多个零。文件的其余部分将是一个大洞。在文件中间写入零将分配一个块并用零填充它。然后,该文件将包含一个块、一个近 0.5G 的孔、另一个块和另一个孔。