章节概述
-
本章内容为EXT2文件系统,作为Linux系统最传统的磁盘文件系统,EXT2文件系统是理解Linux下文件系统的关键。
-
本章介绍了EXT2在Linux系统中的历史地位,以及其后的EXT3、EXT4文件系统的当前应用状况;
-
展示了EXT2文件系统的数据结构以及对EXT2文件树系统的遍历;
-
介绍了如何实现EXT2文件系统;
-
展示了如何使用虚拟磁盘的mount_root命令来构建基本的文件系统;6. 介绍了文件系统的等级划分以及3个等级各自的权限功能;7. 介绍了各种级别文件的系统函数的使用以及实现过程。
1. EXT文件系统简介
EXT2文件系统是Linux系统中默认的文件系统,是实现Linux系统最基础的文件操作的基础系统。
EXT3是EXT2的拓展版,相较于EXT2,EXT3增加了一个日志文件,它将文件系统的变更记录在日志中,而日志则可以在文件崩溃后很快的使其恢复。
EXT4则是EXT3的拓展版本,EXT4的主要变化是磁盘块的分配。在EXT4中,块编号为48,分配的磁盘区域是连续的。
本章主要介绍的是最基本的EXT2文件系统。
2.EXT2文件系统的数据结构
-
mkfs命令Linux mkfs(make file system)命令,功能是在特定分区上建立Linux文件系统。命令的标准格式如下: mkfs [-V] [-t fstype] [fs-options] filesys [blocks]参数: device:预备检查的硬盘分区,例如:/dev/sda1 -V:详细显示模式 -t:给定档案系统的型式,Linux 的预设值为 ext2 -c:在制做档案系统前,检查该partition 是否有坏轨 -l bad_blocks_file:将有坏轨的block资料加到 bad_blocks_file 里面 block:给定 block 的大小
-
用mkfs建立EXT2文件系统mkfs.ext2命令与mke2fs命令功能相同。都是用来建立EXT2文件系统。使用如下命令,可以在一个名为vdisk的虚拟磁盘上创建一个EXT2文件系统,有1440个大小为1KB的块。 dd if=/dev/zero of=vdisk bs=1024 count=1440 mke2fs vdisk 1440
-
虚拟磁盘布局EXT2文件系统的虚拟磁盘布局如图:
简而言之,EXT2将磁盘分为若干个块结构,每个块结构负责特定功能,它们是:引导块、超级块、块组描述符、块位图、索引点位图、索引节点、数据块和其它数据块。关于EXT2文件的磁盘布局,在第七章中有详细的说明,在此不再赘述。
3.邮差算法
本章的邮差问题是指将一个二元(多元)对应表转换为一个一元的线性表的转换算法。邮差算法在文件访问上有重大意义,一个良好的算法可以大大加快文件访问速度。
同时使用邮差算法和位屏蔽可以实现快速访问多维的数据个体,而不用转向复杂的结构体。具体的实现方式可以通过邮差算法将索引节点转为磁盘上的索引节点来完场。
4.编程实例
- 头文件安装为了实现有关EXT2文件系统操作的程序,需要安装ext2fs.h头文件,系统默认头文件并不包含它,需要我们自行安装,可由下列命令实现头文件的安装: sudo apt-get install ext2fs-dev
5.遍历EXT2文件系统树
-
已知一个文件的路径,如何依靠这个路径来找到这个文件,是遍历算法需要解决的问题。一个良好的遍历算法可以在短时间内就完成文件的定位读取,而这依靠的是上述的邮差算法。
-
遍历算法遍历算法的基本流程:
最后重复(5)~(6)步n次,如果循环成功结束,就会得到指向路径名的索引节点,凭借它就可以将文件所有的磁盘块打印出来。
6.EXT2文件系统的实现
-
EXT2文件系统的数据结构
其中: (1):PROC是当前运行进程的结构体,包含了指向该进程当前工作目录CWD的内存索引点cwd,还有一个指向打开的文件实例的文件描述符数组fd[]; (2):指向内存中跟索引节点的根指针; (3):openTable条目,当一个进程打开文件时,进程数组fd就会有一个条目指向openTable,而openTable会指向打开文件的内存索引节点; (4):内存索引节点,当需要某个文件时,会把该文件的索引加载到minode槽中以供使用,由于索引节点是唯一的,所以无论何时,每个索引节点的内存中只会存在唯一的副本; (dev,ino)会指向索引节点的来源; refCount则会记录使用minode的进程数; dirty字段表示索引节点是否被篡改; 挂载标志表示索引节点是否被挂载,如果被挂载,mntabPtr就会指向挂载文件的挂载表条目; lock字段保证内存索引节点一次只会被一个进程访问; (5):已挂载的文件系统表; mntabPtr指向挂载条目表; mntPointer指向挂载点的内存索引节点。
-
文件系统的级别文件系统的实现分为三个级别,每个级别处理文件系统的不同部分。
- 第1级别实现基本的文件系统树,实现指定的函数。包含以下文件:
使用第1级别FS命令的用户命令程序有:mkdir、creat、mknod、rmdir、link、unlink、symlink、rm、ls、cd和pwd等
-
第2级别实现文件内容的读/写
-
第3级别实现文件系统的挂载、卸载和文件保护
7.基本文件系统
-
type.h文件包含了EXT2文件系统的数据结构类型,需要ex2fs_dev库的支持;
-
global.c文件 包含了EXT2文件系统的全局变量,如minode和mtable等。这些全局变量就是上述EXT2文件系统数据结构中各个参数和指针。
-
其他实用的函数程序(1)get_block/put_block函数 按块读写虚拟磁盘文件;(2)iget(dev,ino)函数 返回指向包含INODE(dev,ino)的内存唯一minode;(3)THE iput(INODE *mip)函数 释放一个mip指向用完的minode;(4)get()函数 实现文件系统的树遍历算法;(5)getino()/iget()/iput()函数 由路径名向索引节点的转换的系列函数。
-
mount_foot函数用于挂载根文件系统,便于快速访问。
8.文件系统函数
-
1级文件系统函数 mkdir:创建带路径名的新目录 creat:创建新的空文件 rmdir:删除为空的目录 link:链接两个文件 unlink:断连两个文件 symlink:实现任意两文件,包括文件夹的链接 readlink:读取符号文件的目录文件名并返回文件名长度
-
2级文件系统函数 open:打开文件 lseek:依据偏移量再读取文件内容 close:关闭文件 read:从读取文件读取数据 write:向文件写入数据 opendir/readdir:将目录视作文件,再打开/读
-
3级文系统函数 挂载命令: mount filesys mount_point 卸载算法 交叉挂载 文件保护 文件锁定