linux文件中的洞

来源:互联网 发布:微信数据精灵 编辑:程序博客网 时间:2024/04/27 14:13

1.洞的概念

      在数据库之类的应用程序中,可能会提前分配一个固定大小的文件,但是并不立即往其中写入数据。数据只有在真正需要的时候才会写入到文件中。如果为这些根本不包含数据的文件立即分配数据块,那就势必会造成磁盘空间的浪费。为了解决这个问题,传统的Unix系统中引入了文件洞的概念,文件洞就是普通文件中包含空字符的那部分内容,在磁盘上并不会使用任何数据块来保存这部分数据。也就是说,包含文件洞的普通文件被划分成两部分,一部分是真正包含数据的部分,这部分数据保存在磁盘上的数据块中;另外一部分就是这些文件洞。(在Windows操作系统上也存在类似的概念,不过并没有使用文件洞这个概念,而是称之为稀疏文件。)

   ext2文件系统也对文件洞有着很好的支持,其实现是建立在动态数据块分配原则之上的,也就是说,在 ext2文件系统中,只有当进程需要向文件中写入数据时,才会真正为这个文件分配数据块。

       ext2文件系统中,inode的数据结构是ext2_inode,ext2_inode有两个与文件大小有关的域:i_size和 i_blocks,二者分别表示文件的实际大小和存储该文件时真正在磁盘上占用的数据块的个数,其单位分别是字节和块个数。通常来说,i_blocks 与块大小的乘积可能会大于或等于 i_size的值,这是因为文件大小并不都是数据块大小的整数倍,因此分配给该文件的部分数据块可能并没有存满数据。但是在存在文件洞的文件中,i_blocks与块大小的乘积反而可能会小于 i_size 的值。

 

2.创建有‘洞’的文件

创建带有文件洞的文件:

# echo -n "X" | dd of=/tmp/test/hole bs=1024 seek=7# ls -li /tmp/test/hole15 -rw-r--r-- 1 root root 7169 Nov 26 11:03 /tmp/test/hole# hexdump /tmp/test/hole 0000000 0000 0000 0000 0000 0000 0000 0000 0000*0001c00 0058                                   0001c01
第一个命令生成的 /tmp/test/hole 文件大小是 7169 字节,其前 7168 字节都为空,第 7169 字节的内容是字母 X。正常来讲,7169 字节的文件需要占用两个数据块来存储,第一个数据块全部为空,第二个数据块的第 3073 字节为字母 X,其余字节都为空。显然,第一个数据块就是一个文件洞,在这个数据块真正被写入数据之前,ext2 并不为其实际分配数据块,而是将 i_block 域的对应位(或间接寻址使用的索引数据块中的对应位)设置为0,表示这是一个文件洞。该文件的内容如下图所示:



3.lsdu查看的文件大小不一样

du查看的是被文件实际占据数据块的总大小,因为‘洞’是没有被分配datablock的,所以不包含‘洞’的大小

ls查看的是文件实际占用文件系统的大小,包含了‘洞’的大小


学习资料参考于:

https://www.ibm.com/developerworks/cn/linux/l-cn-filesrc2/

0 0
原创粉丝点击