第十一章 EXT2文件系统
11.1 EXT2文件系统
Linux一直使用EXT2作为默认文件系统
EXT3是EXT2的扩展,增加主要内容是日志文件
EXT3的最新扩展是EXT4,主要变化是磁盘块的划分
11.2 EXT2文件系统数据结构
11.2.1 通过mkfs创建虚拟磁盘
11.2.2 虚拟磁盘布局
Block#0:引导块
B0是引导块,文件系统不会调用它
11.2.3 超级块
Block#1:超级块
B1是超级块,用于容纳整个文件系统的信息
其中大多数含义都非常明显,只有少数字段需要详细解释。
s_first_data_block:0表示4KB大小,1表示1KB大小
s_log_block_size:确定文件块大小
s_mnt_count:已挂载文件系统的次数
s_magic:标识文件系统类型的幻数
11.2.4 块组描述符
Block#2:块组描述符块
EXT2将磁盘块分成几个组
每个组有8192个块,每组用一个块组描述符结构体描述
11.2.5 块和索引节点位图
Block#8:块位图
位图是用来表示某种项的位序列
位图用于分配和回收项
Block#9:索引节点位图
一个索引节点就是用来代表一个文件的数据结构
EXT2文件系统是使用有限数量的索引节点创建的
11.2.6 索引节点
Block#10:索引开始节点
i_mode为u16或2字节无符号整数
i_size字段表示文件大小
i_mode字段前4位指定文件类型,接下来3位ugs表示文件的特殊用法
i_block[15]包含指向文件磁盘块的指针
直接块:i_block[0]至i_block[11],指向直接磁盘
间接块:i_block[12]指向一个包含256个块编号的磁盘块
双重间接块:i_block[13]指向一个指向256个块的块
三重间接块:i_block[14]
11.2.7 数据块
紧跟在索引节点块后面的是文件存储数据块
11.2.8 目录条目
dir_entry是一种可扩展结构
名称字段包含1到255个字符,不含终止NULL
11.3 邮差算法
11.3.1 C语言中的Test-Set-Clear位
在C语言中,最小的可寻址单元是一个字符或字节
11.3.2 将索引节点号转换为磁盘上的索引节点
在EXT2文件系统中,每个文件都有一个唯一的索引节点结构
11.4 编程示例
11.4.1 显示超级块
11.4.2 显示位图
11.4.3 显示根索引节点
11.4.4 显示目录条目
11.5 遍历EXT2文件系统树
11.5.1 遍历算法
(1)读取超级块
(2)读取块组描述符块,以访问组0描述符
(3)读取InodeBeginBlock,获取/的索引节点
(4)将路径名标记为组件字符串
(5)从(3)中的根索引节点开始,在其数据块中搜索name[0]
(6)使用索引节点号ino来定位相应的索引节点
(7)重复(5)、(6)编写搜索函数
11.5.2 将路径名转换位索引节点
INODE *path2inode(int fd,char *pathname)
11.5.3 显示索引节点磁盘块
11.6 EXT2文件系统的实现
11.6.1 文件系统的结构
11.6.2 文件系统的级别
大致分为三个级别
第一级别实现了基本文件系统树
第二级别实现了文件内容读/写函数
第三级别实现了文件系统的挂载、卸载和文件保护
11.7 基本文件系统
11.7.1 type.h文件
这类文件包含EXT2文件系统的数据结构类型
此外还包含打开文件表、挂载表、PROC结构体和文件系统常数
11.7.2 global.c文件
这类文件包含文件系统的全局变量
11.7.3 实用程序函数
11.7.4 mount-root
11.7.5 基本文件系统的实现
11.8 1级文件系统函数
11.8.1 mkdir算法
创建一个带路径名的新目录
11.8.2 creat算法
创建一个空的普通文件
11.8.3 mkdir-creat算法
11.8.4 rmdir算法
11.8.5 rmdir的实现
11.8.6 link算法
11.8.7 unlink算法
创建一个从new_file到old_file的符号链接
11.8.8 symlink算法
读取符号文件的目标文件名并返回目标文件名的长度
11.8.9 readlink算法
11.8.10 其他1级函数
11.9 2级文件系统函数
11.9.1 open算法
11.9.2 lseek
11.9.3 close算法
close(int fd)操作可关闭文件描述符
11.9.4 读取普通文件
11.9.5 写普通文件
11.10 3级文件系统
11.10.1 挂载算法
mount filesys mount_point
11.10.2 卸载算法
11.10.3 交叉挂载点
11.10.4 文件保护
在Unix/Linux中,可通过文件索引节点中的权限位实现文件保护
11.10.5 实际uid和有效uid
在Unix/Linux中,每个进程都有一个实际uid和一个有效uid
11.10.6 文件锁定