《Linux操作系统原理分析之Linux文件管理(1)》(25)
- 8 Linux文件管理
- 8.1 Linux 文件系统概述
- 8.2 EXT2 文件系统
- 8.2.1 EXT2 文件系统的构造
- 8.2.2 EXT2 超级块(super block)
- 8.2.3 组描述符
- 8.2.4 块位图
- 8.3 EXT2 的 inode 和文件结构
- 8.3.1 EXT2 文件系统 inode 结构
- 8.3.2 inode 表和 inode 位图
- 8.3.3EXT2 文件的物理结构
- 8.3.4 EXT2 的目录结构
8 Linux文件管理
8.1 Linux 文件系统概述
本章主要介绍 EXT2 文件系统的结构特点以及 linux 虚拟文件系统 VFS 的特点及其实现技术。
-
Linux 文件系统的树型结构
Linux 最上层的是根目录,用/表示。
Linux 采用目录分解的方法管理文件目录。在树型目录中的目录项是文件的符号目录。如下图所示:
-
Linux 文件类型
普通文件
目录文件
设备文件
管道文件
链接文件(基于索引节点共享) -
文件的访问权限
Linux 中的每个文件都归于一个特定的用户所有,而且一个用户一般都是与某个用户组相关。所以,linux 设置了三种针对访问者身份的权限:文件所有者、与文件所有者同组的用户、其他用户。
对文件的访问限制主要体现在文件的 3 种操作上,即文件的读取、写入和执行。对 3 种访问者的 3 种操作限制形成了 9 种情况,用 9 位二进制代码表示。
-rwxr-xr-x 1 user wheel 3212 Dec 4 12:36 a.out
8.2 EXT2 文件系统
8.2.1 EXT2 文件系统的构造
一个文件系统一般使用块设备上的一个独立逻辑分区,在这个分区内建立文件系统的树型层次结构 。EXT2 文件系统由逻辑序列块序列组成。EXT2 文件系统把它所使用的磁盘逻辑分区划分为若干块组(block group),并从 0 开始依次编号。每个块组中包含若干数据块,其中存放文件内容。每个组中除数据块之外包括 5 种用于管理和控制的信息块:超级块、组描述符、块位图、inode 位图和 inode 表。这些信息位
于每个块组的前部,后面是文件的数据块。
8.2.2 EXT2 超级块(super block)
EXT2 超级块(super block):用来描述 EXT2 文件系统整体信息的数据结构,主要描述文件在逻辑分区中的静态分布情况,以及描述文件系统的各种组成结构的尺寸、数量等。所有块组中包含的超级块的内容是相同的。系统运行期间 系统运行期间, 需要把超级块中的内容复制到内存缓冲区内。
在 linux 中,EXT2 文件系统超级块定义为 ext2_super_block 结构,定义在/include/linux/ext2_fs.h 中 。EXT2 超级块由两部分组成:
基本超级块:EXT2 文件系统得整体静态信息。
扩充块:反映所在块组的某些动态特性。
超级块本身占用一个物理块(1024B),基本块占 84B,扩充块占 20B,剩余的 920B 定义为元素长度为 4B 的数组 reserved[230],作为备用。
8.2.3 组描述符
组描述符:记录各个组块的描述信息(在位文件分配磁盘空间时需要使用这些信息)。这些组描述符集中在一起,就形成了组描述符表。组描述符可能占用多个物理块。和超级块一样的是:每个组块中的组描述符的内容完全相同,而且它的内容也要读入内存。
在 linux 中,组描述符(32B)是一个 ext2_group_desc 结构,定义在/include/linux/ext2_fs.h 中:
8.2.4 块位图
块位图:记录每块组的数据块的使用情况。它占用一个物理块。所以一个块组中数据块的最大数量是一个物理块的长度的 8 倍。例:对 1024 的物理块而言,其块位图就有 1024*8 位,即可以表示 8K 个数据块,也就是说一个块组的数据区的最大容量是 8M。如果 EXT2 文件系统使用的逻辑分区为 100M,则它可以划分为 12 个块组。
系统运行后,块位图装入一个高速缓存中,但是由于高速缓存空间有限,故只装入当前常用的 8 块(缺省值)位图。
8.3 EXT2 的 inode 和文件结构
8.3.1 EXT2 文件系统 inode 结构
Linux 中 EXT2 文件系统 inode 定义为 struct ext2_inode。它定义在/include/linux/ext2_fs.h。
8.3.2 inode 表和 inode 位图
inode 表:一个块组的所有文件的 inode 的集合。它可能占据多个物理块。每个块组可以包含的 inode 的数目由超级块中的成员项 s_inoders_per_group 给出。
Inode 位图:反映了 inode 表中各个项的使用情况,它的每一位表示 inode 表的一个表项。1 使用;0 空闲。与块位图相似,inode 位图也装入一个高速缓冲中。
8.3.3EXT2 文件的物理结构
采用混合索引结构。Inode 中 i_block[]数组共有 15 个地址。如下图所示:
EXT2 文件默认的物理块尺寸为 1K,EXT2 的块地址长度 4B,所以每个间接块中的索引表可以包括1024/4=256 个物理地址。所以
1.直接地址:允许文件不大于 12K
2.一次间接地址:当文件大于 12K 时采用,允许文件长达 256K+12K
3.二次间接地址: 当文件大于 256K+12K 时采用,允许文件长达 256*256*K+256K+12K
4.三 次 间 接 地 址 : 当 文 件 大 于 256*256K+256K+12K 时 采 用 , 允 许 文 件 长 达256*256*256K+256*256K+256K+12K=16G+64M+256K+12K
但是实际上 linux 是 32 位文件系统,文件尺寸最大为 4G。
EXT2 文件系统按照文件的逻辑块号为索引值查找数据块,逻辑块从 0 依次编号。
例:如何查找逻辑块号 100 对应的物理块。
8.3.4 EXT2 的目录结构
Linux 树型目录结构中,每个文件目录都是一个目录文件,每个目录项都是一个 ext2_dir_entry 结构体,它
就是一个文件的符号目录。定义在/include/linux/ext2_fs.h。
Struct ext2_dir_entry
{
_u32 inode; /*inode 号*/
_u16 rec_len; /*目录项长度*/
_u16 name_len; /*文件名长度*/
Char name[EXT2_NAME_LEN]; /*文件名*/
}
EXT2_NAME_LEN 缺省为 255,也就是文件名最大可以用 255 个字符。另外目录项长度根据文件名长度的大小是可变的。但是必须是 4 的倍数,不用部分用\0 填充。
删除文件时,将相应的 inode 号字段置 0,如果相邻有空白目录项则合并。
添加文件时,找到一个长度合适的空白目录项,并写入相应信息;若空白表项使用后剩余空间大于12B,则把剩余部分仍作为空白目录项。如果找不到合适的空目录项,就在文件尾部建立这个文件的目录项。