文件空洞(file hole)与稀疏文件(sparse file)
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.
文件有空洞的通常被称为稀疏文件。