9.5.2文件的洞

    文件的洞是普通文件的一部分,它是一些空字符但没有存放在磁盘的任何数据块中。洞是Unix文件一直存在的一个特点。例如,下列的Linux命令创建了第一个字节是洞的文件。

    $ echo -n "X" | dd of=/tmp/hole bs=1024 seek=6

    现在,/tmp/hole6145个字符(6144null字符加一个X字符),然而,这个文件只占磁盘上一个数据块。

   引入文件的洞是为了避免磁盘空间的浪费。它们被广泛地用在数据库应用中,更一般地说,用于在文件上执行散列法的所有应用。

    文件洞在Ext2的实现是基于动态数据块的分配:只有当进程需要向一个块写数据时,才真正把这个块分配给文件。每个索引节点的i_size域定义程序所看到的文件大小,包括洞,而i_blocks域存放分配给文件有效的数据块数(以512字节为单位)。

     在前面dd命令的例子中,假定/tmp/hole文件被创建在块大小为4096Ext2分区上。其相应磁盘索引节点的i_size域存放的数为6145,而i_blocks域存放的数为8(因为每4096字节的块包含8512字节的块)。i_block数组的第二个元素(对应块的文件块号为1)存放已分配块的逻辑块号,而数组中的其它元素都为空。