Linux文件空洞与稀疏文件 转
1、Linux文件空洞与稀疏文件
2、文件系统数据存储
3、文件系统调试
文件空洞
- 在UNIX文件操作中,文件位移量可以大于文件的当前长度
在这种情况下,对该文件的下一次写将延长该文件,并在文件中构成一个空洞。位于文件中但没有写过的字节
都被设为 0。 - 如果 offset 比文件的当前长度更大,下一个写操作就会把文件“撑大(extend)”
在文件里创造“空洞(hole)”。
没有被实际写入文件的所有字节由重复的 0 表示。空洞是否占用硬盘空间是由文件系统(file system)决定
的
稀疏文件(Sparse File)
- 稀疏文件与其他普通文件基本相同,区别在于文件中的部分数据是全0,且这部分数据不占用磁盘
空间。
下面是稀疏文件的创建与查看
[root@localhost ~]# dd if=/dev/zeroof=sparse-file bs=1 count=1 seek=1024k [root@localhost ~]# ls -l sparse-file -rw-r--r-- 1 root root 1048577 Oct 15 17:50 sparse-file [root@localhost ~]# du -sh sparse-file 8.0K sparse-file [root@localhost ~]# cat anaconda-ks.cfg >> sparse-file [root@localhost ~]# du -sh sparse-file 12K sparse-file [root@localhost ~]# du -sh anaconda-ks.cfg 12K anaconda-ks.cfg [root@localhost ~]#
Linux文件系统inode数据块存储
索引节点采用了多重索引结构,主要体现在直接指针和3个间接指针。直接指针包含12个直接指
针块,它们直接指向包含文件数据的数据块,紧接在后面的3个间接指针是为了适应文件的大小
变化而设计。
Linux稀疏文件inode数据块存储
文件系统存储稀疏文件时,inode索引节点中,只给出实际占用磁盘空间的Block 号,
数据全零且不占用磁盘空间的文件Block并没有物理磁盘Block号。
Linux稀疏文件inode数据块存储
- 文件空洞部分不占用磁盘空间
- 文件所占用的磁盘空间仍然是连续的
实例:
[root@localhost mnt]# du -sh sparse-file 20K sparse-file [root@localhost mnt]# ls -lh sparse-file -rw-r--r-- 1 root root 1.1G Oct 15 10:36 sparse-file [root@localhost mnt]# debugfs: stat sparse-file Inode: 49153 Type: regular Mode: 0644 Flags: 0x0 Generation: 3068382963 User: 0 Group: 0 Size: 1073742848 File ACL: 0 Directory ACL: 0 Links: 1 Blockcount: 40 Fragment: Address: 0 Number: 0 Size: 0 ctime: 0x507b76af -- Mon Oct 15 10:36:31 2012 atime: 0x507b765f -- Mon Oct 15 10:35:11 2012 mtime: 0x507b76af -- Mon Oct 15 10:36:31 2012 BLOCKS: (IND):106496, (256):106497, (DIND):106504, (IND):106505, (262144):106506 TOTAL: 5
Linux文件系统数据块存储多重索引
- Linux文件系统数据存放采用inode多
重索引结构,有直接指针和3个间接指
针。
类似于编程中的变量定义:
unsigned long blk;
unsigned long *blk;
unsigned long **blk;
unsigned long ***blk; - 直接指针直接指向保存数据的Block
号。 - 一级指针指向一个Block,该Block中
的数据是Block指针,指向真正保存数
据的Block。
二级三级指针以此类推。
- 前12个直接指针,直接指向存储的数据区域
如Blocks大小为4096,则前12个直接指针就可以保存48KB文件。 - 一级指针可存储文件大小计算
假设每个指针占用4个字节,则一级指针指向的Block可保存4096/4个
指针,可指向1024个Blocks。一级指针可存储文件数据大小为1024*4096 =
4MB。 - 二级指针可存储文件大小计算
同样按照Blocks大小为4096,则二级指针可保存的Block指针数量为(4096/4) *
(4096/4) = 1024*1024。则二级指针可保存的文件数量大小为(1024*1024)*4096
= 4GB。 - 三级指针可存储文件大小计算
以一级、二级指针计算方法类推,三级指针可存储的文件数据大小为
(1024*1024*1024)*4096 = 4TB。
Linux_File_Hole_And_Sparse_Files