您的位置:首页 > 运维架构 > Linux

Linux文件空洞与稀疏文件 转

2016-05-02 17:56 501 查看



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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: