欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

linux 空洞文件

程序员文章站 2024-02-26 15:31:16
...

文件空洞与空洞文件

     我们都知道 lseek() 系统调用可以改变文件的偏移量,但如果程序调用使得文件偏移量跨越了文件结尾,然后再执行 I/O 操作,将会发生什么情况? read() 调用会返回 0, 表示文件结尾。write() 调用可以在文件尾后的任意位置写入数据。在这种情况下,对该文件的下一次写将延长该文件,并在文件中构成一个空洞,这一点是允许的。从原来的文件结尾到新写入数据间的这段空间被称为文件空洞。
    文件空洞不占用任何磁盘空间,知道某个时点,在文件空洞中写入了数据,文件系统才会为之分配磁盘块。空洞的存在意味着一个文件名义上的大小可能比其占用的磁盘存储总量要大(有时大出很多)。向文件空洞中写入字节,内核需要为其分配存储单元,即使文件大小不变,系统的可用磁盘空间也将减少。

示例

创建一个无空洞的文件

dd if=/dev/urandom2 bs=4096 seek=999 count=1

创建一个有空洞的文件

dd if=/dev/urandom of=testfile2 bs=4096 seek=999 count=1

查看文件大小命令

ls -lh testfile*

查看文件所占磁盘块大小命令

du -h testfile*

结论:
1. 无空洞的文件,文件大小和占用磁盘的大小是一样的。
2. 有空洞的文件,文件大小是4M,而占用块大小是 4K。

实际中的空洞文件的应用场景有两个:
1. 下载电源的时候,发现刚刚开始试下载,文件的大小就以及有几百M。
2. 创建虚拟机的磁盘镜像的时候,你创建了一个100G的磁盘镜像,但是其实装起系统之后,开始也不过只善用了3,4G的磁盘空间,如果一开始就把100G分配出去,资源是很大的浪费。