《信息安全系统设计与实现》学习笔记

学习笔记

20191318 王泽文

  《Unix/Linux系统编程》


第十一章 EXT2 文件系统

  本章讨论 EXT2 文件系统。 本章将引导读者实现一个完全与 Linux 兼容的完整EXT2 文件系统。本章首先描述了EXT2 文件系统在 Linux 中的历史地位以及EXT3/EXT4 文件系统的当前状祝;用编程示例展示了各种EXT2 数据结构以及如何遍历EXT2 文件系统树;介绍了如何实现支持 Linux 内核中所有文件操作的EXT2 文件系统;展示了如何通过虚拟磁盘的mount_root 来构建基本文件系统;将文件系统的实现划分为 3 个级别, 级别 1 扩展了基本文件系统, 以实现文件系统树, 级别 2 实现了文件内容的读/写操作 , 级别 3 实现了文件系统的挂载/装载和文件保护;描述了各个级别文件系统函数的算法,并通过编程示例演示了它们的实现过程;将所有级别融合到一个编程项目中;最后, 将所有编程示例和练习整合到一个完全有效的文件系统中。


  EXT2文件系统数据结构

  1. mke2fs [-b blksize -N ninodeel device nblocke在设备上创建一个带有 nblocks 个块(每个块大小为 blksize 字节)和 ninodes 个索引节点的EXT2 文件系统。
  2. 磁盘块的内容:
    1. Block#O: 引导块 BO是引导块, 文件系统不会使用它。 它用来容纳一个引导程序, 从磁盘引导操作系统。
    2. Block#1 : 超级块(在硬盘分区中字节偏移量为I 024) Bl是超级块, 用于容纳整个文 件系统的信息。
    3. Block#2: 块组描述符块(硬盘上的 s_first_data_block+l) EXT2 将磁盘块分成几个组。 每个组有 8192 个块(硬盘上的大小为 32K)。每组用一个块组描述符结构体来描述。
    4. Block#8: 块位图 (Bmap) (bg_block_bitmap) 位图是用来表示某种项的位序列, 例如磁盘块或索引节点。 位图用于分配和回收项。
    5. Block#9: 索引节点位图 (Imap) (bg_inode_bitmap) 一个索引节点就是用来代表一个文件的数据结构。 EXT2 文件系统是使用有限数盘的索引节点创建的。各索引节点的状态用 B9 的 Jmap 中的一个位表示。
    6. 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 义件系统,可以忽略它。
    7. 数据块:文件存储数据块紧跟在索引节点块后面。

  邮差算法:在计算机系统中, 经常出现下面这个问题。 一个城市有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文件系统树

  遍历算法:

  1. 读取超级块。 检查幻数 s_magic (OxEF53), 验证它确实是EXT2 FS。
  2. 读取块组描述符块 (1 + s_first_data_block), 以访问组 0 描述符。 从块组描述符的bg_inode_table 条目中找到索引节点的起始块编号, 并将其称为 InodesBeginBlock。
  3. 读取 InodeBeginBlock, 获取/的索引节点, 即 INODE #2。
  4. 将路径名标记为组件字符串, 假设组件数景为 n。
  5. 从 (3) 中的根索引节点开始 , 在其数据块中搜索 name[O]。为简单起见, 我们可以假设某个自录中的条目数扯很少 , 因此一个目录索引节点只有 12 个直接数据块。 有了这个假设, 就可以在 12 个(非零)直接块中搜索 name[O]。
  6. 使用索引节点号 ioo 来定位相应的索引节点。使用邮差算法计算包含索引节点的磁盘块及其在该块中的偏移量。

  EXT2文件系统的实现

  文件系统的结构

  1. 是当前运行进程的PROC结构体。在实际系统中,每个义件操作都是由当前执行 的进程决定的C每个进程都有一个cwd,指向进程当前工作目录(CWD)的内存索引节点c它还有一个文件描述符数组fd[],指面打开的文件实例。
  2. 是文件系统的根指针。它指向内存中的根索引节点。当系统启动时,选择其中一个设备作为根设备,它必须是有效的EXT2文件系统亡根设备的根索引节点(inode#2)作为 文件系统的根(/)加载到内存中口该操作称为“挂载根文件系统”。
  3. 是一个openTable条目。当某个进程打开文件时,进程fd数组的某个条目会指向 openTable, openTable指向打开文件的内存索引节点。
  4. 是内存索引节点当需要某个文件时,会把它的索引节点加载到minode槽中以供使用。
  5. 是已挂载的文件系统表。

  文件系统的级别

  文件系统的实现分为三个级别。

  基本文件系统

  1. type.h : EXT2 data structure types 这类文件包含EXT2文件系统的数据结构类型,比如超块、组描述符、索引节点和目录条目结构。此外,它还包含打开文件表、挂载表、PROC结构体和文件系统常数。
  2. global.c: global variables of FS 这类文件包含文件系统的全局变量。
  3. util.c : common utility functions: getino(), iget(), iput (), search () , etc. 该文件包含文件系统常用的实用程序函数。 最重要的实用程序函数是读/写磁盘块函数iget()、iput()和getino()
  4. 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

  显示超级块

  显示位图

  显示根索引节点


原文地址:https://www.cnblogs.com/wzwyoshino/p/15416986.html