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