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.ls和du查看的文件大小不一样
du查看的是被文件实际占据数据块的总大小,因为‘洞’是没有被分配datablock的,所以不包含‘洞’的大小
ls查看的是文件实际占用文件系统的大小,包含了‘洞’的大小
学习资料参考于:
https://www.ibm.com/developerworks/cn/linux/l-cn-filesrc2/
- linux文件中的洞
- Linux 中的文件分割
- linux中的操作文件
- linux中的文件压缩
- linux中的.lib文件
- linux中的文件模式
- Linux中的文件权限
- linux 中的proc文件
- Linux中的文件权限
- linux中的链接文件
- linux中的链接文件
- LINUX中的文件权限
- linux 中的设备文件
- Linux中的文件读写
- linux中的m4文件
- Linux中的makefile文件
- linux 中的文件锁
- linux中的文件移动
- MXutilsLib库文件使用
- MYSQL添加远程用户或允许远程访问三种方法
- 浮生.感
- 聊聊高并发之隔离术
- floyd求传递闭包
- linux文件中的洞
- 主机拨号上网,虚拟机如何同时上网
- 关于ES、PES、PS以及TS码流
- HDU 1081 To The Max(dp最大子矩阵和)
- 面试题3:二位数组的查找
- redis的持久化
- Zen 3系列新品发布会今日在莫斯科举行
- LeetCode[283] Move Zeroes
- 函数式编程的好处