• 《Unix&Linux系统编程》第十一章学习笔记


    第11章 EXT2文件系统

    Linux一直使用EXT2作为默认文件系统。EXT3是EXT2的扩展,增加了一个日志文件,它将文件系统的变更记录在日志中,日志可在文件系统崩溃时更快地从错误中恢复。EXT4则增加了磁盘块的分配,块编号为48位,它分配连续的磁盘块区(区段)。

    11.1 EXT2文件系统数据结构

    通过mkfs创建虚拟磁盘

    11.2 虚拟磁盘布局

    1.mkfs命令:

    在Linux下,命令

    mke2fs [-b blksize -N ninodes] device nblocks
    

    创建一个由nblocks个块(块大小为blksize字节)和ninodes个索引节点的文件系统。

    2.参数:

    通过man mkfs 查询相关参数

    device:预备检查的硬盘分区,例如:/dev/sda1

    -V:详细显示模式

    -t:给定档案系统的型式,Linux 的预设值为 ext2

    -c:在制做档案系统前,检查该partition 是否有坏轨

    -l bad_blocks_file:将有坏轨的block资料加到 bad_blocks_file 里面

    block:给定 block 的大小

    3.实例:

    在一个名为vdisk的虚拟磁盘文件上创建一个EXT2文件系统,有1440个大小为1KB的块。

    下面是磁盘块的内容:

    Block#0:引导块,文件系统不使用它,用于容纳从磁盘引导操作系统的引导程序。

    Block#1:超级块,用于容纳关于整个文件系统的信息。

    Block#2:块组描述符块,EXT2将磁盘分成几个组(每组8192块),每组用一个块组描述符结构体描述。

    Block#8:块位图,用来表示某种项的位序列。

    Block#9:索引节点位图,用来代表一个文件的数据结构。

    Block#10:索引节点,每个文件都用一个128字节(EXT4的是256字节)的独特索引节点结构体表示。

    • 直接块:i_block[0]至i_block[11]指向直接磁盘块
    • 间接块:i_block[12]指向一个包含256个块编号的磁盘块
    • 双重间接块:i_block[13]指向一个指向256个块的块
    • 重间接块:i_block[14],对于“小型”EXT2文件系统可以忽略

    数据块:紧跟在索引节点后面的文件存储数据块

    目录条目:包含dir_entry结构,可扩充

    11.3 邮差算法

    Linear_address LA = N*block + house;
    Block_address BA = (LA / N , LA % N);
    

    注意:只有从0开始计数时,转换才有效。

    • C语言中的Test-Set-Clear位
      在C语言程序中,最小的可寻址单元时一个字符或字节。
      *将索引节点号转换为磁盘上的索引节点
      在EXT2文件系统中,每个文件都有一个唯一的索引节点结构。每个磁盘块包含:
    INODES_PER_BLOCK = BLOCK_SIZE/sizeof(INODE)
    

    11.4 访问和显示EXT2文件系统的内容

    • 安装ext2fs开发包

    • 显示超级块

    • 显示位图

    • 显示根索引节点

    • 显示目录条目

    11.5 遍历EXT2文件系统树

    1.遍历算法

    • 读取超级块

    • 读取块组描述符块

    • 读取InodeBeginBlock

    • 将路劲名标记为组件字符串

    • 在数据块中搜索name[0]

    • 使用索引节点号ino来定位相应的索引节点

    • 编写一个搜索函数,调用n次search()

    2.将路径名转换为索引节点

    编写一个函数:INODE *path2inode(int fd,char *pathname)

    3.显示索引节点磁盘块

    编写一个showblock

    11.6 基本文件系统

    • type.h:包含了超块、组描述符、索引节点、目录条目结构;打开文件表、挂载表、PROC结构体和文件系统常数

    • global.c:包含文件系统全局变量

    • 实用程序函数:get/put_block()、iget()、iput()、getino()

    • mount-root.c:用于挂载根文件系统

    11.7 1级文件系统函数

    • mkdir算法:创建一个带路径名的新目录

    • create算法:创建一个空的普通文件

    • rmdir算法:删除目录

    • link算法:创建从新文件到旧文件的硬链接(只能用于普通文件,不能用于目录)

    • unlink算法:取消文件链接

    • sylink算法:创建一个从新文件到旧文件的符号链接(可以链接到任何对象,目录或其他设备的文件)

    • readlink算法:读取符号文件的目标文件名并返回目标文件名的长度

    11.8 2级文件系统函数

    • open算法:打开一个文件进行读或写

    • lseek算法:将打开的文件描述符在OFT中的偏移量设置为从文件开头开始或当前位置开始的字节位置

    • close算法:关闭文件描述符

    • read系统调用:将n个字节从打开的文件描述符读入用户空间的缓冲区

    • write系统调用:将n个字节从用户空间的缓冲区写入打开的文件描述符

    • opendir-readdir:打开、读目录

    11.9 3级文件系统

    • 挂载算法:mount

    • 卸载算法:将挂载的文件系统与挂载点分开

    • 交叉挂载点:修改getino(pathname)函数

    • 文件保护:通过文件索引节点中的权限位实现文件保护

    问题与解答

    Q:虚拟机重新开启时无法打开,如下图。

    A:经过网站上搜索查询,进入到存放此台Vmware虚拟机虚拟磁盘文件及配置文件存放的位置,找到后缀为.lck文件夹,将后缀为.lck的文件夹删除,重新打开虚拟机即可。

    Q:下载ext2fs.h头文件显示无法定位到软件包

    A:暂未解决。。。

  • 相关阅读:
    数值微分(数学)(组合数)
    破冰派对(搜索)
    [NOIP2017]宝藏
    [NOIP2013]华容道
    收集邮票(数学期望)
    序列(DP)(组合数)
    luogu1357花园(矩阵运算)(状压DP)
    游戏(期望)
    [NOIP2012]疫情控制
    [NOIP2012] 开车旅行
  • 原文地址:https://www.cnblogs.com/weihehahaha/p/16751139.html
Copyright © 2020-2023  润新知