《信息安全系统设计与实现》学习笔记5
一、学习笔记
1.EXT2文件系统数据结构
在Linux下,命令mke2fs [-b blksize-N ninodes] device nblocks在设备上创建一个带有nblocks个块(每个块大小为blksize字节)和ninodes个索引节点的EXT2文件系统。设备可以是真实设备,也可以是虚拟磁盘文件。如果未指定blksize,则默认块大小为1KB。如果未指定ninoides,mke2fs将根据nblocks计算一个默认的ninodes数。得到的EXT2文件系统可在Linux中使用。
2.虚拟磁盘布局
一个简单的EXT2文件系统布局
磁盘块主要内容如下
Block#0:引导块 B0是引导块,文件系统不会使用它。它用来容纳一个引导程序,从磁盘引导操作系统。
Block#1:超级块(在硬盘分区中字节偏移量为1024)B1是超级块,用于容纳整个文件系统的信息,下面为超级块中一些重要字段
Block#2:块组描述符块(硬盘上的s_first_data_block+1)EXT2将磁盘块分成几个组。每个组有8192个块(硬盘上的大小为32K)。每组用一个块组描述符结构体来描述。
Block#8:块位图(Bmap)(bg_blockbitmap)位图是用来表示某种项的位序列,例如磁盘块或索引节点。位图用于分配和回收项。在位图中,0位表示对应项处于FREE状态,1位表示对应项处于INUSE状态。一个软盘有1440个块,但是Block#0未被文件系统使用。所以,位图只有1439个有效位。无效位被视作INUSE,设置为1。
Block#9:索引节点位图(lmap)(bginodebitmap)一个索引节点就是用来代表一个文件的数据结构。EXT2文件系统是使用有限数量的索引节点创建的。各索引节点的状态用 B9的Imap中的一个位表示。在EXT2FS中,前10个索引节点是预留的。所以,空EXT2 FS的Imap以10个1开头,然后是0。无效位再次设置为1.
Block#10:索引(开始)节点(bg_inodetable)每个文件都用一个128字节(EXT4中是256字节)的唯一索引节点结构体表示。
3.如何访问并显示EXT2文件系统的内容
(1)显示超级块
(2)显示位图
(3)显示根索引节点
(4)显示目录条目
4.遍历EXT2文件系统树
已知一个EXT2文件系统和一个文件的路径名,例如/a/b/c,问题是如何找到这个文件。 查找文件相当于查找其索引节点。
(1)遍历
①读取超级块。
检査幻数s_magic ( OxEF53 ),验证它确实是EXT2 FS,
②读取块组描述符块(1 + s_first_data_block)
以访问组0描述符。从块组描述符的bg_inode_table条目中找到索引节点的起始块编号,并将其称为InodesBeginBlock,
③读取InodeBeginBlock,获取/的索引节点,即INODE #2。
④将路径名标记为组件字符串
假设组件数量为n,例如,如果路径名=/a/b/c,则组 件字符串是“a”“b”“c”,其中n = 3。用name[0], namefl],…,name[n-l]来表示组件。
⑤从(3)中的根索引节点开始,在其数据块中搜索name[0]。
⑥使用索引节点号ino来定位相应的索引节点。
ino从1开始计数,使用邮差算法计算包含索引节点的磁盘块及其在该块中的偏移量。
(2)将路径名转换为索引节点
(3)显示索引节点磁盘块
5.EXT2文件系统
(1)文件系统的结构
EXT2文件系统内部结构如下
(1)是当前运行进程的PROC结构体,在实际系统中,每个文件操作都是由当前执行 的进程决定的,每个进程都有-个cwd,指向进程当前工作目录(CWD)的内存索引节点. 它还有一个文件描述符数组fd[],指向打开的文件实例:,
(2)是文件系统的根指针。它指向内存中的根索引节点。当系统启动时,选择其中一个设备作为根设备,它必须是有效的EXT2文件系统,根设备的根索引节点(inode #2)作为文件系统的根(/)加载到内存中、该操作称为“挂载根文件系统”
(3)是一个OpenTable条目。当某个进程打开文件时,进程fd数组的某个条目会指向OpenTable, OpenTable指向打开文件的内存索引节点.
(4)是内存索引节点,当需要某个文件时,会把它的索引节点加载到minode槽中以 供使用。因为索引节点是唯一的,所以在任何时候每个索引节点在内存中都只能有一个副 本。在minode中,(dev, ino)会确定索引节点的来源,以便将修改后的索引节点写回磁盘 refCount字段会记录使用minode的进程数。dirty字段表示索引节点是否已被修改-挂载标志表示索引节点是否已被挂载,如果已被挂载.mntabPtr将指向挂载文件系统的挂载表条目.lock字段用于确保内存索引节点一次 只能由一个进程访问,例如在修改索引节点时,或者在读/写操作过程中。
(5)是已挂载的文件系统表。对于每个挂载的文件系统,挂载表中的条目用于记录挂载的文件系统信息,例如挂载的文件系统设备号。在挂载点的内存索引节点中,挂载标志打开,mmabPtr指向挂载表条目。在挂载表条目中,mntPointPtr指向挂载点的内存索引节点。
(2)文件系统的级别
文件系统的实现分为三个级别。每个级别处理文件系统的不同部分。这使得实现过程模块化,更容易理解。在文件系统的实现过程中,FS目录包含实现EXT2文件系统的文件。
第1级别实现了基本文件系统树。
第2级别实现了文件内容读/写函数
第3级别实现了文件系统的挂载、卸载和文件保护。
6.基本文件系统
(1)type.h文件
这类文件包含EXT2文件系统的数据结构类型,比如超块、组描述符、索引节点和目录条目结构。此外,它还包含打开文件表、挂载表、PROC结构体和文件系统常数。
(2)global.c文件
这类文件包含文件系统的全局变量。文件系统操作过程中,全局数据结构被视为系统资源,可灵活使用和释放。每一组资源都由一对分配和释放函数管理。
(3)实用程序函数
util.c file :该文件包含文件系统常用的实用程序函数。最重要的实用程序函数是读/写 磁盘块函数iget()、iput()和getino()。
get_block/put_block函数
我们假设某个块设备,例如真实磁盘或虚拟磁盘,只能以块大小为单位读写。对于真实磁盘,这是因为受到硬件的限制。对于虚拟磁盘,我们假设也是以块大小为单位读/写,这样就可以在需要时将代码移植到真实磁盘上。在虚拟磁盘上,我们先以读|写模式打开它,并使用文件描述符作为设备号。
iget(dev, ino)函数
该函数返回一个指针,指向包含INODE(dev, ino)的内存minode。返回的minode是唯一的,即内存中只存在一个INODE副本。在实际文件系统中,返回的minode被锁定为独占使用,直到它被释放或解锁。
The iput(lNODE *mip)函数
该函数会释放一个mip指向的用完的minode。每 个minode都有一个refCount,表示使用minode. iput()的用户数量为refCount减1。如果refCount非零,则表示minode仍有其他用户,那么调用者只是返回。如果调用者是minode的最后一个用户(refCount = 0 ),那么如果INODE被修改(dirty),它将被写回磁盘。
getino()函数
getino()函数可实现文件系统树遍历算法。它会返回指定路径名的INODE编号(ino)。
getino()/iget()/iput()的使用
在文件系统中,几乎每个操作都以一个路径名开头, 例如mkdir路径名、cat路径名等。只要指定了路径名,就必须将其索引节点加载到内存中备用。
(4)mount-root.c文件
该文件包含mount_root()函数,在系统初始化期间调用该函数来挂载根文件系统。它读取根设备的超级块,以验证该设备是否为有效的EXT2文件系统。然后,它将根设备的根INODE (ino = 2)加载到minode中,并将根指针设置为根minode。它 还将所有进程的当前工作目录设置为根minodeo分配一个挂载表条目来记录挂载的根文件系统。根设备的一些关键信息,如inode和块的数量、位图的起始块和inode表,也记录在挂载表中,以便快速访问。
7.1级文件系统函数
mkdir
命令mkdir pathname创建了一个带路径名的新目录。将新目录的权限位设置为默认值0755 (所有人可以访问和读写,其他人可以访问但只能读取)。
creat
creat创建一个空的普通文件
8.2级文件系统函数
2级文件系统实现了文件内容的读/写操作。它由以下函数组成:open、close、lseek、 read、write、opendir 和 readdir
9.3级文件系统
3级文件系统支持文件系统的挂载、卸载和文件保护。
二、问题及解决办法
上网找了资料想自己学习一下EXT2文件
首先生成一个ext2文件系统。我划出1M的空间来试验,dd命令用来创建一个文件,通过执行这个dd命令生成了一个全零的大小为1024*1KB的文件,即1MB的文件。losetup是设定循环设备(loop service)的,循环设备可以将文件模拟成块设备。然后在块设备上建立我们的ext2文件系统.但是这里总是给我报错,说我没有权限
经过了各种尝试,还是不行,上网暂时也没查到解决办法