什么是文件空洞,它如何被使用?

14

据我理解,空洞可能作为元数据维护在inode中,但实际磁盘并未填充空白零。

  1. 有人能用现实生活示例解释一下,在文件中的空洞可以有什么用处吗?

  2. 空洞是否与软预分配相同?从磁盘使用情况的角度来看,即使实际磁盘空间未被使用,但该空间也不可用于其他进程。


3
在虚拟机场景下,孔洞(Holes)的真正优势在于当你从虚拟磁盘中实际删除数据时。假设你已经使用了VM的20GB磁盘空间,并且你决定删除一些数据。如果没有稀疏文件支持,尽管已经删除了数据,但这20GB仍然占用了底层物理硬盘上的空间。但是,如果文件系统支持孔洞,那么VM可以“打”一个对应于所删除文件的孔洞,从而释放物理磁盘空间。在某些文件系统上,fallocate() 支持孔洞打孔。 - itisravi
1
这可能会有所帮助。什么是稀疏文件,为什么我们需要它? - Rick
SO又再次关闭了完全有效的问题... - étale-cohomology
2个回答

17

有空洞的文件通常被称为稀疏文件。

当程序需要访问广泛的地址(偏移量),但不太可能触及所有潜在块时,它们是非常有用的。这可以被虚拟化产品用于存储虚拟磁盘。比如你配置了一个20 GB的虚拟机硬盘,但它不会很快填满数据。创建一个20 GB的稀疏文件,只使用几个磁盘块,然后让虚拟机以低速率创建文件系统和存储文件,会更快。

一旦某些块被清空(即填充了null字节),大型稀疏文件的大小也可以被减小。进行此操作的稀疏文件感知程序可以将其从文件中删除(即在文件中打孔),而不是实际写入块,因为空闲块在被程序读取时返回零。

稀疏文件与预分配相反,它们被称为薄配置或可能也被称为磁盘超额配置。这允许创建比实际硬件支持更多的“虚拟磁盘空间”,并在必要时添加更多的磁盘,以仅在需要时扩展文件系统。


维基百科似乎暗示了你最后一段的相反观点。根据维基百科的描述,这并不是过度承诺,而是预分配。例如,缺点是稀疏文件可能会变得分散;文件系统空闲空间报告可能会误导。填满包含稀疏文件的文件系统可能会产生意想不到的影响(例如磁盘已满或超出配额错误...http://en.wikipedia.org/wiki/Sparse_file - Jimm
1
我仍然不理解在虚拟机上下文中稀疏文件的优势。为什么不仅根据需要逐步增加文件大小呢?例如,如果用户请求VM使用20GB的空间,则先预分配1GB。在实际使用达到某个阈值时再预分配更多空间。 - Jimm
文件可能变得分散并导致意外磁盘已满的情况,这正是由于它们的空间没有被分配。如果它们是预先分配的,就不会出现碎片化。稀疏文件绝对是超额承诺的,与您在问题中提到的相反:对其他进程也没有可用空间。使用稀疏文件,空间可供其他文件使用,根本没有任何保留。 - jlliagre
你还没有理解重点。根据需求增长正是稀疏文件提供的。 - jlliagre
2
你可以随时增加非稀疏文件的大小,只要有足够的磁盘空间。那么,创建稀疏文件有什么好处呢?它会保留块地址吗?听起来好像它并不保留任何东西,那么我想知道创建它的目的是什么? - Jimm
3
是的,你可以说这是一种地址保留,但这种保留几乎不占用磁盘空间。好处在于虚拟操作系统可以立即看到一个大型磁盘,并能够在其上创建适当尺寸的分区,然后以非常经济的方式在这些分区中布置文件系统。如果你选择非稀疏文件方式,你将无法拥有多个可增长的分区(除非使用卷管理),而扩大文件系统会增加无意义的管理负担。 - jlliagre

1
“空洞”在减少磁盘空间使用方面非常“有用”(它们可以提供更多可用空间)。它们在其他方面没有任何用处。当一个稀疏文件包含大块零时,“空洞”作为文件系统表示的一部分就非常“有用”。
“空洞”与预分配没有任何关系。预分配是在文件实际拥有数据之前,使磁盘上的空间可用于文件中的数据。而“空洞”是数据的一种表示方式……具体来说,是由仅包含零的块组成的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接