《信息安全系统设计与实现》学习笔记5
第11章 EXT2文件系统
教材学习内容总结
本章主要讲述了EXT2文件系统。首先描述了EXT2 文件系统的历史,并对比了 EXT3/EXT4 文件系统。用程序示例展示了EXT2的数据结构,并将文件系统的实现划分为3个级别,级别1扩展了基本文件系统,以实现文件系统树,级别2实现了文件内容的读/写操作,级别3实现了文件系统的挂载/装载和文件保护。
1、EXT2文件系统
(1)虚拟磁盘布局
(2)磁盘块内容
Block#0:引导块,用于容纳从磁盘引导操作系统的引导程序
Block#1:超级块,用于容纳关于整个文件系统的信息
Block#2:块组描述符块,EXT2将磁盘块分成几个组,每组用一个块组描述符结构体描述
Block#8:块位图,用来表示某种项的位序列
Block#9:索引节点位图,用来代表一个文件的数据结构
Block#10:索引节点块,每个文件都用一个128字节的独特索引节点结构体表示
目录条目:目录包含dir_entry结构
2、基本文件系统
(1)type.h文件
包含EXT2文件系统的数据结构类型,还包含打开文件表、挂载表、PROC结构体和文件系统常数。
(2)global.c文件
包含文件系统的全局变量。
(3)实用程序函数
util.c file:包含文件系统常用的实用程序函数
get_block/put_block函数:该函数将虚拟磁盘块读/写到内存的缓冲区中。
iget(dev,ino):该函数返回一个指针,指向包含INODE(dev,ino)的内存minode。
The put(INODE *mip):该函数释放一个mip指向的用完的minode。
getino():该函数实现文件系统树遍历算法。
(4)mount-root
mount_root.c文件:包含mount_root()函数,在系统初始化期间调用该函数来挂载根文件系统。
3、文件系统函数
文件系统结构
文件系统的实现分为三个级别。
第1级别实现了基本文件系统树。
第2级别实现了文件内容读/写函数。
第3级别实现了文件系统的挂载、卸载和文件保护。
(1)1级文件函数
mkdir_creat.c : make directory, create regular file
ls_cd_pwd.c : list directory, change directory, get CWD path
rmdir.c : remove directory
link_unlink.c : hard link and unlink files
symlink_readlink.c : symbolic link files
stat.c : return file information
misc1.c : access,chmod, chown, utime, etc.
1)mkdir算法
mkdir pathname
创建一个带路径名的新目录
2)creat算法
创建一个空的普通文件
3)rmdir算法
rmdir实现
link命令:link old_file new_file
4)unlink算法
symlink命令:symlink old_file new_file
(2)2级文件函数
open_close_lseek.c : open file for RBAD | WRITE|APPEND,close file and lseek
read.c : read from file descriptor of an opened regular file
write.c : write to file descriptor of an opened regular file
opendir_readdir.c : open and read directory
1)open算法
2)lseek
3)close算法
(3)3级文件函数
mount__umount.c : mount/umount file systems
file_protection : access permission checking
file-locking : lock/unlock files
1)挂载算法
挂载操作命令:
2)卸载算法
4、实践
创建虚拟磁盘
在名为vdisk的虚拟磁盘文件上创建一个EXT2文件系统,有1440个大小为1KB的块。
dd if=/dev/zero of=vdisk bs=1024 count=1440
mke2fs vdisk 1440
查看各分区挂载
查看超级块
5、问题
为什么每个块组中的块数是8192个?
答:因为用1个块作为位图保存本块组block的使用情况(bit为1表示对应的block被使用,bit为0表示对应的block空闲),1个block是1024字节,共有1024*8=8192个bit。所以,每个块组最多只能是81292个块。