justtreee / blog

31 stars 8 forks source link

【Linux】关于空洞文件 #13

Open justtreee opened 6 years ago

justtreee commented 6 years ago

【问题】:文件在初始地方放1字节,在K位置放1字节(一块的大小就是4K),整文件大小多少?占用硬盘物理空间多大?

【答】文件大小2字节,占用硬盘物理空间4K。

在日常的常识中,我们使用的文件存放在硬盘分区上的时候,有多大的内容就会占用多大的空间,但Linux为了便于管理文件,文件系统都是按块大小来分配给文件的,假如这个文件系统一个块是4096的话,那么这个文件就会占用一个块的,无论实际的内容是1B还是4000B.如果我们有一个4MB的文件,那么它会在分区中占用:4MB/4096B=1000个块.

但在Linux文件读写时,如果文件指针偏移很大一段,然后写入1byte,这样这个文件实际占用1byte空间,但是stat查看文件大小,或者读写时,都会发现文件很大,所有没有写内容的都填充0,且不占用空间,这样的文件叫 sparse file,即空洞文件。

文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector)。每个扇区储存512字节(相当于0.5KB)。操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个"块"(block)。这种由多个扇区组成的"块",是文件存取的最小单位。"块"的大小,最常见的是4KB,即连续八个 sector组成一个 block

举个生活中的例子吧,很多人一起吃饭,这个分配单元就相当于碗的大小,这个文件就好比碗里的饭,每个人的饭量不一样,有人吃的多,就需要两个碗来盛饭,但是有的人吃的少,但也是要占一个碗。了解这个概念以后,理解起来文件大小和占用空间的关系就简单多了。

其实可以实际测试一下,为了效果更佳明显,我没有按照题目一样只放一个字节。

default

对于testfile1,我从一个tar文件那里复制1000个块,每块大小4096字节。通过ls –l 命令我们可以看到文件大小4M,通过du –h 命令可以看到占用硬盘物理空间同样是4M。

而对于testfile2,我只复制了最后的一个块,前面的999个都跳过了,也就是创建了一个空洞文件。可以看到文件大小虽然是4M,但占用硬盘物理空间只有4K。

实际中的空洞文件会在哪里用到呢?常见的场景有两个:

  1. 在下载电影的时候,发现刚开始下载,文件的大小就已经到几百M了.
  2. 在创建虚拟机的磁盘镜像的时候,你创建了一个100G的磁盘镜像,但是其实装起来系统之后,开始也不过只占用了3,4G的磁盘空间,如果一开始把100G都分配出去的话,无疑是很大的浪费.