稀疏文件,这是UNIX类和NTFS等文件系统的一个特性。 开始时,一个稀疏文件不包含用户数据,也没有分配到用来存储用户数据的磁盘空间。 当数据被写入稀疏文件时,NTFS逐渐地为其分配磁盘空间。一个稀疏文件有可能增长得很大。
稀疏文件以64KB(不同文件系统不同)为单位增量增长,因此磁盘上稀疏文件的大小总是64KB的倍数。 稀疏文件就是在文件中留有很多空余空间,留备将来插入数据使用。 如果这些空余空间被ASCII码的NULL字符占据,并且这些空间相当大,那么,这个文件就被称为稀疏文件,而且,并不分配相应的磁盘块。?
这样,会产生一个问题,文件已被创建了,但相应的磁盘空间并未被分配,只有在有真正的数据插入进来时,才会被分配磁盘块, 如果这时文件系统被占满了,那么对该文件的写操作就会失败。
办法: 为防止这种情况,有两种办法: (1)不产生稀疏文件 (2)为稀疏文件留够空间。 在计算机科学方面,稀疏文件是文件系统中的一种文件存储方式,在创建一个文件的时候,就预先分配了文件需要的连续存储空间, 其空间内部大多都还未被数据填充,现在有很多文件系统都支持稀疏文件,包括大部分的Unix和Windows的NTFS 。 稀疏文件被普遍用来磁盘图像,数据库快照,日志文件,还有其他科学运用上。
Linux文件空洞与稀疏文件
在UNIX文件操作中,文件位移量可以大于文件的当前长度,在这种情况下,对该文件的下一次写将延长该文件,并在文件中构成一个空洞。位于文件中但没有写过的字节都被设为0。 如果offset 比文件的当前长度更大,下一个写操作就会把文件“撑大(extend)” 在文件里创造“空洞(hole)”。没有被实际写入文件的所有字节由重复的0 表示。空洞是否占用硬盘空间是由文件系统(file system)决定的。
稀疏文件(Sparse File) 稀疏文件与其他普通文件基本相同,区别在于文件中的部分数据是全0,且这部分数据不占用磁盘空间。 ?
下面是稀疏文件的创建与查看 [root@localhost ~]# dd if=/dev/zero of=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 12Ksparse-file [root@localhost ~]# du -sh anaconda-ks.cfg 12Kanaconda-ks.cfg [root@localhost ~]#
Linux文件系统inode数据块存储
索引节点采用了多重索引结构,主要体现在直接指针和3个间接指针。直接指针包含12个直接指 针块,它们直接指向包含文件数据的数据块,紧接在后面的3个间接指针是为了适应文件的大小 变化而设计。
文件系统存储稀疏文件时,inode索引节点中,只给出实际占用磁盘空间的block号,数据全0,且不占用磁盘空间的文件block并没有物理磁盘block号。
linux稀疏文件Inode数据块存储: 文件空洞部分不占用磁盘空间 文件所占用的磁盘空间仍然是连续的
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。
?
|