转载自 http://blog.51cto.com/molinux/505485
超级块
块位图
inode位图
数据块
inode结构
VFS基本原理
整理听课笔记及自己可与搜集的各种资料,按理解总结一些文件系统,并且其中部分内容可参看我的上篇笔记《硬盘存储结构小结》;
文件系统:
系统结构:
块设备:文件组织管理以物理块为单位。物理块是块设备上大小相同的存储区域(如磁盘上的扇区)。一个块究竟多大是在格式化时确定的,例如mke2fs的-b选项可以设定块大小为1024、2048或4096字节。
一个文件系统一般使用块设备上一个独立的逻辑分区;
文件逻辑分区中除了有表示文件内容的逻辑块(称为数据块)外,还设置了包含管理和控制信息的逻辑块。
磁盘上可能有多个逻辑分区,每个分区可以使用不同的文件子系统;
ext2文件系统把逻辑分区划分为块组,并且从0开始编号。每个块组包含的等量的物理块(即块组大小是相同的;物理分区最后一个块组可能小些);在块组的数据块中存储文件或目录;
上图中启动块(Boot Block)的大小是确定的,就是1KB,启动块是由PC标准规定的,用来存储磁盘分区信息和启动信息,任何文件系统都不能使用启动块。启动块之后才是ext2文件系统的开始,ext2文件系统将整个分区划成若干个同样大小的块组(Block Group),每个块组都由以下部分组成:
超级块(Super Block)
描述整个分区的文件系统信息,例如块大小、文件系统版本号、上次mount的时间等等。
超级块位于每个块组的最前面,每个块组包含超级块的内容是相同的(超级块在每个块组的开头都有一份拷贝);
系统运行期间,把超级块复制到系统缓冲区内,只需把块组0的超级块读入内存,其它块组的超级块做为备份
块组描述符表(GDT,Group Descriptor Table)
由很多块组描述符组成,Linux组描述符为32字节,整个分区分成多少个块组就对应有多少个块组描述符。
每个块组描述符(Group Descriptor)存储一个块组的描述信息,例如在这个块组中从哪里开始是inode表,从哪里开始是数据块等等。
和超级块类似,块组描 述符表在每个块组的开头也都有一份拷贝,具有相同内容的组描述符表放在每个块组中做为备份,这些信息是非常重要的,一旦超级块意外损坏就会丢失整个分区的数据,一旦块组描述符意外损坏就会丢失整个块组的数 据,因此它们都有多份拷贝。通常内核只用到第0个块组中的拷贝,当执行e2fsck检查文件系统一致性时,第0个块组中的超级块和块组描述符表就会拷贝到其它块组,这样当第0个块组的开头意外损坏时就可以用其它拷贝来恢复,从而减少损失。
块位图(Block Bitmap)
每个块组都有一个块位图,位于组描述符表之后,用来描述本块组中数据块的使用状况,它本身占一个逻辑块,其中的每个bit 代表本块组中的一个块,这个bit为1表示该块已用,这个bit为0表示该块空闲可用;各位的顺序与块组中数据块顺序一致;
为什么用df命令统计整个磁盘的已用空间非常快呢?因为只需要查看每个块组的块位图即可,而不需要搜遍整个分区。相反,用du命令查看一个较大目录的已用空间就非常慢,因为不可避免地要搜遍整个目录的所有文件。
调优:与此相联系的另一个问题是:在格式化一个分区时究竟会划出多少个块组呢?主要的限制在于块位图本身必须只占一个块。用mke2fs格式化时默认块大小是1024字节,可以用-b参数指定块大小,现在设块大小指定为b字节,那么一个块可以有8b个bit,这样大小的一个块位图就可以表示8b个块的占用情况,因此一个块组最多可以有8b个块,如果整个分区有s个块,那么就可以有s/(8b)个块组。格式化时可以用-g参数指定一个块组有多少个块,但是通常不需要手动指定,mke2fs工具会计算出最优的数值。
inode位图(inode Bitmap)
和块位图类似,本身占一个块,其中每个bit表示一个inode是否空闲可用。
inode表(inode Table)
一个块组中所有文件的inode形成了inode表, 表项序号是inode号;
我们知道,一个文件除了数据需要存储之外,一些描述信息也需要存储,例如文件类型(常规、目录、符号链接等),权限,文件大小,创建/修改/访问时间等,也就是ls -l命令看到的那些信息,这些信息存在inode中而不是数据块中。每个文件都有一个inode,一个块组中的所有inode组成了inode表。
inode表占多少个块在格式化时就要决定并写入块组描述符中,mke2fs格 式化工具的默认策略是一个块组有多少个8KB就分配多少个inode。由于数据块占了整个块组的绝大部分,也可以近似认为数据块有多少个8KB就分配多少 个inode,换句话说,如果平均每个文件的大小是8KB,当分区存满的时候inode表会得到比较充分的利用,数据块也不浪费。如果这个分区存的都是很 大的文件(比如电影),则数据块用完的时候inode会有一些浪费,如果这个分区存的都是很小的文件(比如源代码),则有可能数据块还没用完inode就 已经用完了,数据块可能有很大的浪费。如果用户在格式化时能够对这个分区以后要存储的文件大小做一个预测,也可以用mke2fs的-i参数手动指定每多少个字节分配一个inode。
数据块(Data Block)
根据不同的文件类型有以下几种情况
1. 对于常规文件,文件的数据存储在数据块中。
2. 对于目录,该目录下的所有文件名和目录名存储在数据块中,注意文件名保存在它所在目录的数据块中,除文件名之外,ls -l命令看到的其它信息都保存在该文件的inode中。注意这个概念:目录也是一种文件,是一种特殊类型的文件。
3. 对于符号链接,如果目标路径名较短则直接保存在inode中以便更快地查找,如果目标路径名较长则分配一个数据块来保存。
4. 设备文件、FIFO和socket等特殊文件没有数据块,设备文件的主设备号和次设备号保存在inode中。
inode结构:
inode是EXT2基本构件,表示文件系统树型结构的节点。
EXT2文件系统中的每个文件由一个inode描述,且只能由一个inode描述。
inode与文件一起存放在外存,系统运行时,把inode写入内存建立映像,加快文件系统速度。
虚拟文件系统VFS简介:
作用:
Linux的虚拟文件系统VFS屏蔽了各种文件系统的差别,为处理各种不同文件系统提供了统一的接口。
工作原理:
描述:
VFS并不是一种实际文件系统
EXT2等物理文件系统是存在于外存空间的,而VFS 仅存在于内存
VFS是在系统启动时建立,在系统关闭时消失的,物理文件系统是长期存在于外存。
VFS中包含着向物理文件系统转换的一系列数据结构,如VFS超级块、VFS的inode等、各种操作函数的转换入口。
文件系统注册:
向系统内核注册文件系统的两种方式:
1. 系统引导时在VFS中注册,在系统关闭时注销。
2. 把文件系统做为可装卸模块,安装时在VFS中注册,并在模块卸载时注销
文件系统的安装(也可称为mount挂载):
文件系统除在VFS中注册,还必须安装到系统中。
要安装的文件系统必须已经存在于外存磁盘空间上,每个文件系统占用一个独立的磁盘分区,并且具有各自的树型层次结构。
EXT3是RedHat Linux 5的标准文件系统,所以系统把EXT3文件系统的磁盘分区做为系统根文件系统
EXT2以外的文件系统安装在根文件系统下的某个目录下,成为系统树型结构中的一个分枝。
用于安装其它文件系统的目录称为安装点或安装目录
图示:
参考:http://www.chinaup.org/man/linux_c/ch29s02.html