介绍
Ext2文件系统全称为Second Extended FileSystem(第二扩展文件系统),既然是第二个那么就存在第一个,第一个就是扩展文件系统 Extended FileSystem。当然还有Ext3和Ext4,Ext4还是很不错的的文件系统,但是brtfs是目前的主流Linux文件系统。
磁盘布局
名词
-
引导区
磁盘中的第一块是引导块,这一块不受文件系统的管理,因为第一块是为引导扇区保留的。 -
块组
除了第一块以外,磁盘中的其他内容被划分为n个块组,每个块组由超级块、组描述符、数据块位图、索引节点位图、索引节点表和数据块组成。
块组通过尽可能把一个文件的数据块放到同一个块组来减少文件碎片。
布局图
超级块 super block
超级块是所有块组的管理块,超级块包含文件系统版本、魔数、块组的统计、数据压缩等等数据。超级块占用一个块的空间。
超级块就相当于文件系统的老板,每个块组相当于一条业务线,老板需要知道每条业务线报表信息,老板在一开始就为存储信息这件事情做好了周密的计划和安排。
组描述符
Ext2文件系统只有一个组描述符,组描述符描述了Ext2文件系统中所有块组的信息。
组描述符主要包括:
- 每个块组的块位图块号;
- 每个块组中的索引节点位图块号;
- 统计信息:块组中空闲块的个数、块组中空闲索引节点个数、块组中目录个数
数据块位图
一个块组的数据块位图占用一个块,数据块位图用来描述块组中数据库是否被使用,块组中一个数据块使用1bit信息就可以来确定。
索引节点位图
一个块组的索引节点位图占用一个块,索引节点位图用来描述块组中索引节点表中的索引节点是否使用,块组中一个索引节点使用1bit信息就可以来确定。
索引节点表
索引节点表包含了块组中的索引节点也就是i-node,所有的索引节点是等长的,也就是128字节,我个人认为索引节点最重要的一个设计内容是数据块指针。
目录
在Ext2中目录也是一种特殊的文件,目录存储时把文件名和索引节点号存放到一起。目录的层级结构是通过目录项中的字段:目录项长度字段来关联的。
索引节点 i-node
索引节点描述了一个文件信息,这些信息通常包括文件大小、创建时间、访问时间、修改时间及权限信息。Ext2文件系统索引节点总共128个字节,其中字节数整个索引节点最大的是数据块指针(数据块指针和块大小决定了Ext2文件系统单文件的大小同时访问文件数据是通过数据块寻址来完成的。)数据块指针的代码定义如下:
__le32 i_block[EXT2_N_BLOCKS];
其中__le32表示一个小端的32位数字,也就是4个字节。如果EXT2_N_BLOCKS默认值为15的话,那么数据指针会占用15 * 4 = 60个字节,差不多是索引节点整个存储空间的一半了。
数据块指针与寻址
Ext2文件系统通过对数据块指针进行划分来组织文件数据及寻址,划分方式如下图(假设默认有15个数据块指针):
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IYLjAS32-1648392406760)(en-resource://database/1891:0)]
数据寻址方式如下:
-
前12个数字(也就是数组下标0-11)与文件最初的12个块对应,这12个数字指向12个磁盘块,这12个磁盘块存放文件的前12块数据;
-
第13个数字指向一个磁盘块,但是这个磁盘块又由B/4(B表示磁盘块大小)个数字组成,这些数字分表又指向一个磁盘块,所以第13个数字又称为间接块号或者一级间接索引;
-
第14个数字基于第13个模式又增加了一级,所以第14个数字又称为二级间接索引;
-
第15个数字基于第14个数字模式又增加一级,所以第15个数字又称为三级间接索引。
图形化表示如下(图片来源于维基百科):
基于数据块指针的数据寻址方式,Ext2文件系统的文件数据寻址理论大小限制为:
块大小 | 直接寻址 | 一级间接索引 | 二级间接索引 | 三级间接索引 | 实际大小 |
---|---|---|---|---|---|
1KB | 12KB | 268KB | 64.26MB | 16.06GB | 16.06GB |
2KB | 24KB | 1.02MB | 513.02MB | 256GB | 16.256GB |
4KB | 48KB | 4.04 | 4GB | 4TB | 2TB |
8KB | 96KB | 8.08 | 8GB | 8TB | 2TB |
Ext2文件系统问题
Ext2的问题主要是还是一致性问题,当计算机发生故障时比如:断电、CPU故障等等发生时造成文件系统内容不一致。
总结
- Ext2多级数据寻址方式可以支持小、中和大类型的文件,其中寻址次数最坏情况下最多四次,但是最好情况下是0次,前提是所有数据都缓存在了高速缓存;
- Ext2文件系统设计要点主要是磁盘布局、块组和i-node中的数据寻址方式;
参考
- ext2
- 深入理解Linux内核 第三版