Luv*_*eet 13 filesystems system file disk sparse-file
什么是稀疏文件,为什么需要它?我唯一能得到的是它是一个非常大的文件,它是高效的(千兆字节).效率如何?
dir*_*obs 11
假设您有一个包含许多空字节的文件\x00.这些空字节\x00称为空洞.存储空字节效率不高,我们知道文件中有很多字节,所以为什么要将它们存储在存储设备上?我们可以改为存储描述那些零的元数据.当进程读取文件时,这些零字节块是动态生成的,而不是存储在物理存储上(从维基百科看这个原理图):
这就是稀疏文件高效的原因,因为它不会在磁盘上存储零,而是保存足够的数据来描述将生成的零.
注意:逻辑文件大小大于稀疏文件的物理文件大小.这是因为我们没有将零物理存储在存储设备上.
编辑:
当你运行:
$ dd if=/dev/zero of=output bs=1G count=4
Run Code Online (Sandbox Code Playgroud)
此处的命令将4G块空字节复制到output.要看到:
$ stat output
File: ouput
Size: 4294967296 Blocks: 8388616 IO Block: 4096 regular file
--omitted--
Run Code Online (Sandbox Code Playgroud)
你可以看到这个文件有8388616块分配给它,这些块只存储从空字节复制/dev/zero而且它们确实占用物理磁盘空间,它们是存储在磁盘上的空洞(稀疏零).dd做了你要求的,将数据块从一个文件复制到另一个文件.
现在,运行此命令以检测孔并使文件就地稀疏:
$ fallocate -d output
$ stat output
File: swapfile
Size: 4294967296 Blocks: 0 IO Block: 4096 regular file
--omitted--
Run Code Online (Sandbox Code Playgroud)
你注意到了什么吗?块的数量现在为0,因为仅存储空字节的块被解除分配.记住,output's block什么都不存储,只有一堆空零,fallocate -d检测到只包含空零的块并取消分配它们,因为这个文件的所有块都包含零,它们都被解除分配.
还要注意尺寸是如何保持不变的.这是文件的逻辑(虚拟)大小,而不是磁盘上的大小.至关重要的是要知道现在output不占用物理存储空间,它有0块分配给它,因此我并没有真正使用磁盘空间.运行后保留的大小,fallocate -d因此当您稍后从文件中读取时,您将获得文件系统在运行时为您生成的空字节.output但是,物理大小为零,它不使用数据块.
请记住,当您读取output文件时,文件系统在运行时动态生成空字节,它们实际上并不存储在磁盘上,并且报告的文件大小stat是逻辑大小,物理大小为零output.在这种情况下,当进程读取文件时,文件系统必须生成4G空字节.
使用dd以下命令生成稀疏文件:
$ dd if=/dev/zero of=output2 bs=1G seek=0 count=0
$ stat
stat output2
File: output2
Size: 4294967296 Blocks: 0 IO Block: 4096 regular file
Run Code Online (Sandbox Code Playgroud)
GNU dd内部使用lseek和ftruncate,所以检查truncate(2)和lseek(2).
axi*_*iac 10
稀疏文件是一个大部分为空的文件,即它包含值为0(零)的大字节块。
在磁盘上,文件的内容存储在固定大小的块中(通常为 4 KiB 或更大)。当此类块中包含的所有字节均为 时0,实现稀疏文件的文件系统不会将该块存储在磁盘上,而是将信息保留在文件元数据中的某处。
使用稀疏文件的优点:
0,因此它只需设置0输入缓冲区中的所有字节并且数据已准备好;无需访问慢速存储设备;0),并将块 ID 放入空块列表中(在文件元数据中);没有数据写入磁盘。有关稀疏文件的更多信息可以在Wikipedia 页面上找到。