刨根问底:ext3/ext4文件系统最大空间及单个文件大小演算法则
从ext3和ext4文件系统来窥探空间和文件大小的演算法则
学习操作系统就不得不研究磁盘以及磁盘文件系统,磁盘是底层物理设备,而文件系统则是管理磁盘的上层工具,文件系统规划了磁盘存放数据的格式,确定了一个操作系统能够支持多大的磁盘空间,每个分区能够支持多大的数据空间,以及每个文件所能支持的大小。通常对系统管理员而言,最需要的知道的就是最大磁盘空间,最大分区空间以及最大文件的大小。本论题只讨论这三种大小到底是怎么算出来的,而不是死记硬背。知道了原理,以后不管遇到什么文件系统,都会有章可循,至少知道需要那些数据可以算出这三种需求的大小。此外,这里不谈磁盘的组成以及文件系统的布局,只说演算方法,可能涉及的相关知识点,请查看相关资料。
很多人可能都是死记几个数值,却不知道为什么是这个数值,这里就来剖析一下:
1.硬性规定
ext3:
1).ext3文件系统采用32bit的块地址索引空间;
2)在inode条目中,引用一个块空间符号需要4byte的大小;
3)对于一个inode来说,设计了12个直接指针索引,一个间接指针索引,一个双间接指针索引,以及一个三间接指针索引
注:
a.这些规定都是文件系统自身的程序代码所决定的,也就是说这是开发时就设计好的,没有为什么,只有是什么;对于其它文件系统也是一样;
b.所谓双间接指针索引和三间接指针索引指的是两级结构和三级结构,相当于linux中的根文件系统目录树一样;
附ext3文件系统中inode内部结构图:
ext4:
1).ext4文件系统采用48bit的块地址索引空间;
2).在inode条目中,不在是使用指针索引的方式来进行与block的映射,而是采用extent来替代指针;此前在ext3中的15个
指针被替换成5个extent,一个extent占用3byte空间;一个extent描述了一组连续的block,当不够用时extent依旧可以采
用间接指针的索引,但没有个数限制。
注:对于extent计算单个文件大小的算法,还没摸索出,没看懂源码。你要是看懂了留言啊。
2.演算法则
好,知道了上面的源码设计规则,下面就可以进行计算了。
ext3:
1).最大支持的文件大小
首先要知道,在linux文件系统,一个block的大小可以为1k,2k,4k,当block的大小为4k时为最大。在linux系统中,每一个文件都要使用一个inode号,因此要想计算出单个文件所支持的最大空间,只要知道inode中能够引用多少个block,而block取最大值4k的时候计算出来的值就是所能支持的单个文件的最大空间。
从上面的硬性规定中可以看出:
a.一个inode支持12个直接指针,因此就表示了12个block
b.一个inode支持一个间接指针,也就是一个指针指向了一个block块,将该block块作为指向最终block的直接指针,这里是一个block为4K,指向一个block要占用4byte的空间,因此一个block的间接指针可以指向4K/4byte的block,即2^10
c.双间接指针最终则指向:2^10*2^10=2^20 个block
d.三间接指针最终执行:2^10*2^10*2^10=2^30 个block
因此最终的block的个数为:12+2^10+2^20+2^30
则最终的大小为:(12+2^10+2^20+2^30)x4KByte
则换算成TB的大小为:(12+2^10+2^20+2^30)x4KByte/1024/1024/1024=4TB
到此,可知ext3文件系统,在block为4K的时候,其支持的单个文件大小为最大,最大为4TB。
注:当然这是理论值,在业界应该都知道实际值与理论值总是会有点偏差,但无伤大雅
2)最大分区大小(即文件系统大小)
在操作系统中,文件系统都是针对分区而言的,一个磁盘必须先分区才能格式化文件系统(即使你将磁盘所有容量划分一个分区).格式文件系统后才能挂载使用,此时就必须知道一个文件系统到底支持多大的分区大小。
在ext3文件系统中,采用32bit的块索引空间,且其采用int的无符号整型,因此一个分区的最大空间为:
2^32*4KByte=16TB
由此,得知在ext3文件系统中,当block为4K时,一个分区的空间将最大,且最大空间为16TB
3)最大磁盘容量
有时候当我们需要更大的磁盘容量空间的时候,会增加磁盘来达到需求。但是最后分区使用时会发现提示不支持这么大的空间。这是为什么?
对于整块磁盘而言,因为存在MBR区域,而MBR中有64byte的空间只能表示4个分区,每个分区16btye来表示,因此对于ext3文件系统支持的最大分区为16TB,那最大系统磁盘容量为:16TB*4=64TB
注:这里有人要问几个问题了
a.有人问:你这里说4个分区,不是有逻辑分区吗,使用逻辑分区划分磁盘可以划分很多磁盘分区。那不是应该无限制吗?
answer:逻辑分区是扩展了磁盘分区的个数,但是逻辑分区也是从4个主分区中的一个主分区扩展出来的,因此所有逻辑分区的空间也不过是最后一个最大主分区的空间扩展出来的。
b.有人问:不对,在linux系统中,新磁盘可以作为分区后挂载到系统中的某个目录下来使用。
answer: 新磁盘虽然可以挂载到系统中的某个目录下来使用,但是对于新磁盘而言也是在ext3文件系统下,新磁盘的本身最大也是64TB。因此这里基于的是在ext3文件系统下,block大小为4K时所能支持的最大磁盘容量,超过了这个大小,分区表无法识别了。千万不要理解成操作系统所能使用的空间大小。
ext4:
1)单个文件的最大空间
由于ext4默认不再使用指针的形式做block映射,而是使用extent来管理所能描述的block个数,本人还未理解extent到底是个什么机制,因此不做计算。但一致的说法是,单个文件可大16TB,相当于ext3的最大分区大小.
2)最大分区大小(即文件系统大小)
ext4使用48bit的块地址索引空间,因此在block为4k的情况下,大小为:
2^48*4KByte=1EB=1024PB=1024*1024TB
这个空间可以说在目前的环境下足够用了。
3)最大磁盘容量
根据ext3的分析结论可知:1EB*4=4EB
OK,就说这么多了,不知道你理解否。反正我是懂了。(^_^)
本文出自 “生死如梦莫多情” 博客,请务必保留此出处http://mingyang.blog.51cto.com/2807508/1580314