Linux文件系统十问---深入理解文件存储方式(rhel6.5,EXT4)【转】 (2)

将磁盘的基础简单了解,我们正式来看一下linux的文件系统。那么,对于文件系统中我们熟悉目录和文件我们又了解多少呢?先来创建一个空的目录和文件: 

Linux文件系统十问---深入理解文件存储方式(rhel6.5,EXT4)【转】

我们知道,ls命令第五列显示的是文件占用空间的大小,那么,先来提出几个问题:

为什么目录目录占用的空间是4096?

为什么空文件占用的空间是0?

如果空文件占用的空间是0,那么该文件的文件名,权限等相关属性存在哪里?

2:空文件不占空间?

这里用一下df -i命令。 

Linux文件系统十问---深入理解文件存储方式(rhel6.5,EXT4)【转】

其实我们可以根据以上命令发现在创建了一个新文件时,消耗掉了一个inode,inode的概念前面博文有讲。

inode的大小可以用dumpe2fs查看: 

Linux文件系统十问---深入理解文件存储方式(rhel6.5,EXT4)【转】

可以看到一个inode有256bytes大小。

所以,我们可以回答开篇提出的第二个问题,当touch一个新文件时其实是占用磁盘空间的,实际占用是一个inode的大小,inode的大小在文件系统格式化的时候就已经确定。

再来说新建目录,同样,使用df -i命令来查看: 

Linux文件系统十问---深入理解文件存储方式(rhel6.5,EXT4)【转】

 
可以看出,新建一个空目录也会占用一个inode。所以,现在开篇的第三个问题也有答案了,新建一个空目录时,占用的空间是1个block+1个inode。

3:空目录的4KB

Linux文件系统十问---深入理解文件存储方式(rhel6.5,EXT4)【转】

 
特地查看了一些目录,发现不管目录里内容的多少,目录所占空间大多都是4K。那么这4K是干什么的呢?

先进入建立的空目录查看:

Linux文件系统十问---深入理解文件存储方式(rhel6.5,EXT4)【转】

接着建立两个新的空文件:

Linux文件系统十问---深入理解文件存储方式(rhel6.5,EXT4)【转】

空文件不占block,所以,4K还是没什么变化。这时创建更多的文件名长的空文件:

Linux文件系统十问---深入理解文件存储方式(rhel6.5,EXT4)【转】

这时,4K就变成了12K。占用了3个block。所以开篇的第四个问题就有了答案,文件名是存在目录所占用的block中的。 
所以,第六个问题我们现在也可以回答了,文件名太长对系统性能当然会有影响,因为这可能会导致更多的磁盘IO。如果文件名特别特别长,文件数量相当大的时候就要考虑文件名是否导致目录所占的block太多。占空间大小倒是小事,磁盘便宜,但是你得考虑下在目录下查找文件时操作系统的感受,操作系统可需要用你你提供的文件名进行字符串比较,而且运气不好的话需要将其名下所有block都搞一遍才行啊。(当然了,你的文件名长度不变态,而且数量没有达到十万数量级的话实际上这个开销也不会太大,但是这个开销你还是知道的为好)

来说开篇问题五,文件名最长多长呢?linux系统为了避免程序员不节制地使用长文件名,强加了个限制,不能超过255byte。

开篇问题七,一个目录下能创建多少个文件?其实这个最多是受限与你目录所在分区的inode数量。有一百万个inode,你最多就可以新建一百万个文件。但是,单个目录下文件数量***不要过万,否则会带来系统性能的问题。

4:文件的block

来做个关于文件的实验,创建一个空目录,然后在其下建立一个空文件,在这个文件里写入一个数字再保存。

Linux文件系统十问---深入理解文件存储方式(rhel6.5,EXT4)【转】

8K中有4K是目录的,也就是说系统为一个只有一个数字的文件分配了4K。其实文件的block比较简单的了,不像目录的block里会存很多文件系统的结构体,文件的block里只会保存文件的数据。上面这个实验表明,操作系统分配空间时是以block为最小单位。也就是说只要你的文件数据不为空,操作系统就至少会给你分配一个block来存储,直到你超过了4KB,操作系统再给你分配下一个block。

开篇问题八:新建一个1K大小的文件实际会占用一个block大小的空间。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgjssw.html