• 第五周学习笔记


    EXT2文件系统

    知识点归纳以及自己最有收获的内容

    1.EXT2文件系统

    Linux一直使用EXT2(Card等1995)作为默认文件系统;EXT3中增加的主要内容是日志文件;EXT4增加:磁盘块的分配;

    2.EXT2文件系统数据结构

    2.0EXT2在硬盘上的索引节点的数据结构如下:


    EXT2通过索引节点中的数据块指针数组进行逻辑块到物理块的映射。在EXT2索引节点中,数据块中数组共有15项,前12个为直接指针,后三个分别为“一次间接指针”、“二次间接指针”、“三次间接指针”,EXT2默认的物理块大小为1KB,块地址占4个字节,所以每个物理块可以存储256个地址。

    2.1通过mkfs创建虚拟磁盘

    mke2fs [-b blksize -N ninodes] device nblocks
    在设备上创建一个带有nblocks个块(每个块大小为blksize字节)和ninodes个索引节点的EXT2文件系统。

    2.2虚拟磁盘布局

    Block#0:引导块 B0是引导块,文件系统不会使用它。它用来容纳一个引导程序,从磁盘引导操作系统。

    2.3超级块

    Block#1:超级块(在硬盘区分中字节偏移量为1024)B1是超级块,用于容纳整个文件系统的信息。

    2.4块组描述符

    Block#2:块组描述符块(硬盘上的s_first_data_block+1)
    Block#8:块位图
    Block#9:索引节点位图

    2.5索引节点

    Block#10:索引(开始)节点,每个文件用一个128字节(EXT4中是256字节)的唯一索引节点结构体表示

    2.6数据块

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

    2.7目录条目

    目录包含dir_entry结构

    3邮差算法

    例:一个城市有M个街区,编号从0到M-1。每个街区有N座房子,编号从0到N-1。每座房子有一个唯一的街区地址,用(街区,房子)表示,其中0≤街区<M,0≤房子<N。外人不熟悉该街区寻址方案,采用线性方法将房子地址编为0,1,…,N-1,N,N+1等。已知某个街区地址BA=(街区,房子),如何转换为线性地址LA,相反,已知线性地址,如何转换为街区地址?
    LA=N*block + house;
    BA=(LA/N, LA%N); (只有从0开始计数转换才有效)

    4编历EXT2文件系统树

    编历一个EXT2文件系统和一个文件的路径名,例如/a/b/c,问题是如何找到这个文件。查找文件相当于查找其索引节点。

    4.1编历算法

    (1)读取超级块;
    (2)读取块组描述符块(1+s_first_data_block),以访问组0描述符;
    (3)读取InodeBeginBlock,获取/的索引节点,即INODE#2;
    (4)将路径名标记为组件字符串,假设组件数量为n;
    (5)从(3)中的根索引节点开始,在其数据块中搜索name[0];
    (6)使用索引节点号ino来定位相应的索引节点。Ino从1开始计数,使用邮差算法计算包含索引节点的磁盘块及其在该块中的偏移量;
    (7)由于(5)~(6)步将会重复n次,所以最好编写一个搜索函数。

    4.2将路径名转换为索引节点

    已知一个包含EXT2文件系统和路径名的设备,例如/a/b/c/d,编写一个C函数:INODE *path2inode(int fd, char *pathname);返回一个指向文件索引节点的INODE指针;如果文件不可访问,则返回0。

    4.3显示索引节点磁盘块

    编写一个C程序showblock,可打印文件的所有磁盘块(编号);

    5 EXT2文件系统的实现

    实践部分

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

    问题与解决思路

    为什么用df命令比du命令统计整个磁盘的已用空间更快?

    详情可参照:

    http://www.runoob.com/linux/linux-comm-df.html
    http://www.runoob.com/linux/linux-comm-du.html
    因为df命令只需要查看每个块组的块位图即可,而不需要搜遍整个分区。相反,用du命令查看一个较大目录的已用空间就非常慢,因为不可避免地要搜遍整个目录的所有文件。

  • 相关阅读:
    Linux系统配置静态ip
    爬虫之如何找js入口(一)
    asyncio动态添加任务
    关于python导包问题
    python动态添加属性
    requests模块
    反selenium关键字
    PIL模块
    openxlsx模块
    CSV
  • 原文地址:https://www.cnblogs.com/sztsao/p/16704433.html
Copyright © 2020-2023  润新知