《信息安全系统设计与实现》学习笔记
学习笔记
20191318 王泽文
《Unix/Linux系统编程》
第十一章 EXT2 文件系统
本章讨论 EXT2 文件系统。 本章将引导读者实现一个完全与 Linux 兼容的完整EXT2 文件系统。本章首先描述了EXT2 文件系统在 Linux 中的历史地位以及EXT3/EXT4 文件系统的当前状祝;用编程示例展示了各种EXT2 数据结构以及如何遍历EXT2 文件系统树;介绍了如何实现支持 Linux 内核中所有文件操作的EXT2 文件系统;展示了如何通过虚拟磁盘的mount_root 来构建基本文件系统;将文件系统的实现划分为 3 个级别, 级别 1 扩展了基本文件系统, 以实现文件系统树, 级别 2 实现了文件内容的读/写操作 , 级别 3 实现了文件系统的挂载/装载和文件保护;描述了各个级别文件系统函数的算法,并通过编程示例演示了它们的实现过程;将所有级别融合到一个编程项目中;最后, 将所有编程示例和练习整合到一个完全有效的文件系统中。
EXT2文件系统数据结构
mke2fs [-b blksize -N ninodeel device nblocke
在设备上创建一个带有 nblocks 个块(每个块大小为 blksize 字节)和 ninodes 个索引节点的EXT2 文件系统。- 磁盘块的内容:
Block#O
: 引导块 BO是引导块, 文件系统不会使用它。 它用来容纳一个引导程序, 从磁盘引导操作系统。Block#1
: 超级块(在硬盘分区中字节偏移量为I 024) Bl是超级块, 用于容纳整个文 件系统的信息。Block#2
: 块组描述符块(硬盘上的 s_first_data_block+l) EXT2 将磁盘块分成几个组。 每个组有 8192 个块(硬盘上的大小为 32K)。每组用一个块组描述符结构体来描述。Block#8
: 块位图 (Bmap) (bg_block_bitmap) 位图是用来表示某种项的位序列, 例如磁盘块或索引节点。 位图用于分配和回收项。Block#9
: 索引节点位图 (Imap) (bg_inode_bitmap) 一个索引节点就是用来代表一个文件的数据结构。 EXT2 文件系统是使用有限数盘的索引节点创建的。各索引节点的状态用 B9 的 Jmap 中的一个位表示。Block#10
: 索引(开始)节点 (bg_inode_table) 每个文件都用一个 128 字节 (EXT4 中 是 256 字节)的唯一索引节点结构体表示。
索引节点结构体中一些内容:i_mode
为 ul6 或 2 字节无符号整数。在 i_mode 字段中, 前 4 位指定了文件类型, 接下来的 3 位 ugs 表示文件的特殊用法。 最后 9 位是用于文件保护的rwx权限位。i_size
字段表示文件大小(以字节为单位)。 各时间字段表示自 1970 年 1 月 1 日 0 时 0 分0秒以来经过的秒数。借助以下库函数将它们转换为日历形式:char *ctime(&time_field)
i _ block[15]
数组包含指向文件磁盘块的指针, 这些磁盘块有:- 直接块 :
i_block[O]
至 i_block[ll], 指向直接磁盘块。 - 间接块:
i_block[12]
指向一个包含 256个块编号(对于 1 KB BLKSlZE) 的磁盘块, 每个块编号指向一个磁盘块。 - 双重间接块:
i_block[l3]
指向一个指向 256 个块的块, 每个块指向 256 个磁盘块。 - 三重间接块:
i_block[14]
是三重间接块。 对于 “小型"EXT2 义件系统,可以忽略它。
- 直接块 :
- 数据块:文件存储数据块紧跟在索引节点块后面。
邮差算法:在计算机系统中, 经常出现下面这个问题。 一个城市有M 个街区, 编号从 0到M-1。 每个街区有N座房子, 编号从0 到 N-1。每座房子有一个唯一的街区地址, 用(街区, 房子)表示, 其中0<=街区<M, 0<=房子<N。 来自外太空的外星人可能不熟悉地球上的街区寻址方案, 倾向于采用线性方法将这些房子地址编为 0, 1, ···, N-1, N, N+1 等。 已知某个街区地址 BA= (街区, 房子), 怎么把它转换为线性地址 LA, 反过来,已知线性地址,怎么把它转换为街区地址?如果都从0开始计数,转换就会非常简单。
Linear_addraaa LA=N*block + house;
Blook_address BA=(LA/N, LA % N);
遍历EXT2文件系统树
遍历算法:
- 读取超级块。 检查幻数 s_magic (OxEF53), 验证它确实是EXT2 FS。
- 读取块组描述符块 (1 + s_first_data_block), 以访问组 0 描述符。 从块组描述符的bg_inode_table 条目中找到索引节点的起始块编号, 并将其称为 InodesBeginBlock。
- 读取 InodeBeginBlock, 获取/的索引节点, 即 INODE #2。
- 将路径名标记为组件字符串, 假设组件数景为 n。
- 从 (3) 中的根索引节点开始 , 在其数据块中搜索 name[O]。为简单起见, 我们可以假设某个自录中的条目数扯很少 , 因此一个目录索引节点只有 12 个直接数据块。 有了这个假设, 就可以在 12 个(非零)直接块中搜索 name[O]。
- 使用索引节点号 ioo 来定位相应的索引节点。使用邮差算法计算包含索引节点的磁盘块及其在该块中的偏移量。
EXT2文件系统的实现
文件系统的结构
- 是当前运行进程的PROC结构体。在实际系统中,每个义件操作都是由当前执行 的进程决定的C每个进程都有一个cwd,指向进程当前工作目录(CWD)的内存索引节点c它还有一个文件描述符数组fd[],指面打开的文件实例。
- 是文件系统的根指针。它指向内存中的根索引节点。当系统启动时,选择其中一个设备作为根设备,它必须是有效的EXT2文件系统亡根设备的根索引节点(inode#2)作为 文件系统的根(/)加载到内存中口该操作称为“挂载根文件系统”。
- 是一个openTable条目。当某个进程打开文件时,进程fd数组的某个条目会指向 openTable, openTable指向打开文件的内存索引节点。
- 是内存索引节点当需要某个文件时,会把它的索引节点加载到minode槽中以供使用。
- 是已挂载的文件系统表。
文件系统的级别
文件系统的实现分为三个级别。
基本文件系统
type.h : EXT2 data structure types
这类文件包含EXT2文件系统的数据结构类型,比如超块、组描述符、索引节点和目录条目结构。此外,它还包含打开文件表、挂载表、PROC结构体和文件系统常数。global.c: global variables of FS
这类文件包含文件系统的全局变量。util.c : common utility functions: getino(), iget(), iput (), search () , etc.
该文件包含文件系统常用的实用程序函数。 最重要的实用程序函数是读/写磁盘块函数iget()、iput()和getino()allocate_deallocate.c : inodes/blocks management functions
第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级别FS函数的用户命令程序有: mkdir 、 creat 、 mknod、 rmdir、 link 、 unlink、 symlink、 rm、 ls、 cd和pwd等。
第2级文件系统实现了文件内容的读/写操作。 它由以下函数组成: open 、 close 、 lseek 、 read 、 write 、 opendir 和 readdir。
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
第3级别实现了文件系统的挂载、卸载和文件保护。
mount__umount.c : mount/umount file systems
file_protection : access permission checking
file-locking : lock/unlock files
其他
编程实践
安装ext2fs开发包sudo apt-get install ext2fs-dev
显示超级块
显示位图
显示根索引节点