文件空洞(file hole)与稀疏文件(sparse file)

发布时间 2023-08-31 19:56:29作者: 星空778

 

1、引言

在linux上文件大小和占用空间是两个概念,文件大小表示文件数据的长度,空间占用表示数据占用的磁盘空间。

文件大小 < 空间占用:通常磁盘空间是按照4K一块管理的,创建一个文件其内容只有256字节,文件大小实际显示只有256字节,但其磁盘占用空间为4K
文件大小 > 空间占用:文件内部有空洞
注:文件大小用ls命令查看,占用空间用du命令查看

 

2、文件空洞(file hole)

在UNIX文件操作中,文件位移量可以大于文件的当前长度,在这种情况下,对该文件的下一次写将延长该文件,并在文件中构成一个空洞,这一点是允许的。位于文件中但没有写过的字节都被设为 0。
如果 offset 比文件的当前长度更大,下一个写操作就会把文件“撑大(extend)”。这就是所谓的在文件里创造“空洞(hole)”。没有被实际写入文件的所有字节由重复的 0 表示。

空洞是否占用硬盘空间是由文件系统(file system)决定的。

 

翻译一下:

设置文件的offset超过文件结尾,并在offset后写入数据。

[root@k8s-master home]# echo "this is test"> test
[root@k8s-master home]# stat test
  File: ‘test’
  Size: 13          Blocks: 8          IO Block: 4096   regular file
Device: fd00h/64768d    Inode: 68421600    Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: unconfined_u:object_r:home_root_t:s0
Access: 2023-08-31 16:36:43.468169308 +0800
Modify: 2023-08-31 16:36:43.468169308 +0800
Change: 2023-08-31 16:36:43.468169308 +0800
 Birth: -
# 文件大小是13字节,磁盘占用空间是4K
 
[root@k8s-master home]# truncate -s 1M test
[root@k8s-master home]# stat  test
  File: ‘test’
  Size: 1048576     Blocks: 8          IO Block: 4096   regular file
Device: fd00h/64768d    Inode: 68421600    Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: unconfined_u:object_r:home_root_t:s0
Access: 2023-08-31 16:36:43.468169308 +0800
Modify: 2023-08-31 16:37:46.133994390 +0800
Change: 2023-08-31 16:37:46.133994390 +0800
 Birth: -
# 文件大小是1M,磁盘占用空间4K

3、应用场景

  • 并发下载:下载时如果没有空洞文件,多线程下载时文件就只能从一个地方写入,这就不能发挥多线程的作用了;如果有了空洞文件,可以从不同的地址同时写入,就达到了多线程的优势;
  • 节省资源:虚拟机分配了 100G 的磁盘空间,但其实系统安装完成之后,开始也不过只用了 3、4G 的磁盘空间,如果一开始就把 100G 分配出去,资源是很大的浪费。

4、稀疏文件(sparse file)

Files with holes are usually referred to as sparse files.

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