文件的洞是普通文件的一部分,它是一些空字符但没有存放在磁盘的任何数据块中。洞是Unix文件一直存在的一个特点。例如,下列的Linux命令创建了第一个字节是洞的文件。
$ echo -n "X" | dd of=/tmp/hole bs=1024 seek=6
现在,/tmp/hole有6145个字符(6144个null字符加一个X字符),然而,这个文件只占磁盘上一个数据块。
引入文件的洞是为了避免磁盘空间的浪费。它们被广泛地用在数据库应用中,更一般地说,用于在文件上执行散列法的所有应用。
文件洞在Ext2的实现是基于动态数据块的分配:只有当进程需要向一个块写数据时,才真正把这个块分配给文件。每个索引节点的i_size域定义程序所看到的文件大小,包括洞,而i_blocks域存放分配给文件有效的数据块数(以512字节为单位)。
在前面dd命令的例子中,假定/tmp/hole文件被创建在块大小为4096的Ext2分区上。其相应磁盘索引节点的i_size域存放的数为6145,而i_blocks域存放的数为8(因为每4096字节的块包含8个512字节的块)。i_block数组的第二个元素(对应块的文件块号为1)存放已分配块的逻辑块号,而数组中的其它元素都为空。