• Linux文件系统--基于EXT2


    一、文件系统基本知识

    ① 存储在永久性存储介质,由程序按照某种格式制作的数据集合叫做文件

    ② 磁盘上管理文件的文件、数据结构和操作构成磁盘文件系统,简称文件系统

    ③ 文件属性

    (1)名称

    (2)位置

    (3)大小

    (4)类型

    (5)保护

    (6)时间、日期

    (7)用户标识

    ④ 进程要通过操作系统来访问磁盘上的文件,也就是说,操作系统是进程与磁盘文件系统之间的中介

    ⑤ 用户对文件的操作

    (1)创建文件

    (2)写文件

    (3)读文件

    (4)删除文件

    ⑥ 操作系统的文件管理系统必须提供两项基本功能:

    (1)一是要建立专门用于文件管理的目录体系

    (2)二是要为用户提供对文件进行操作的系统调用

    ⑦ 文件的简单存储方式

    (1)经过适当的软件处理,磁盘可以看成由若干大小相等的存储块(512Byte)所组成的一个线性空间

    (2)通常一个文件需要占用多个存储块

    (3)磁盘文件系统需要一个目录表来记录文件名称、储存位置等信息,并把这种记录兼做目录项,这个目录表叫做目录文件

    ⑧ 存储块的组织方式

    (1)链接组织方式:

    (2)索引组织方式:为每个文件创建一个长度与文件所占用存储块的数目相等的数,以文件块的逻辑顺序号为数组元素的下标,而以文件存储块的指针为元素的内容,于是就形成了一个文件索引表。

    注:简单来说,索引表就是文件块的逻辑块号与存储块号的对照表

    ⑨ 空闲块的记录

    (1)未被文件占用,或者被已删除文件释放出来的块叫做外存的空闲块

    (2)操作系统用来记录跟踪空闲块的数据结构主要有位图、链表、分组链表等

    ⑩ 文件目录

    (1)一体化文件目录:

    (2)分立式文件目录:分立式目录中,目录被分成两部分:一部分只记录文件的文件名等用户关心的逻辑信息;一部分只记录文件所占用的存储块数目、位置等物理信息。前者叫  做逻辑目录,简称目录;后者叫做索引节点,简称i节点(inode)

    注:由于i节点与文件唯一对应,所以i节点也叫作文件控制块(FCB)

    (3)用于集中记录i节点的文件叫做设备文件,而集中记录逻辑目录的文件叫做逻辑目录文件

    注:硬链接是两个文件指向同一个i节点

     ⑪ 磁盘上的文件系统

    (1)引导控制块:存储引导操作系统所需要的信息

    (2)主分区:存储操作系统内核映像文件

    (3)分区控制块(Super Block):数据分区的第一块为分区控制块,该块中含有本分区所包含的块数、块的大小、空闲块的数量及位置、文件控制块的数量及位置等详细信息,也  叫作超级块或主控文件集

    (4)目录文件:位于分区控制块之后,存放分区内文件的目录文件

    (5)文件控制块(FCB):通常处于文件数据块之前,内含文件的逻辑及物理信息

    注:文件控制块也叫作索引节点(inode)

    二、Ext2文件系统

    ① Ext2采用了分立式目录结构,即一个文件的目录分为目录项和索引节点

    ② Ext2的索引节点:在一个实际分立式目录的文件系统中,索引节点(inode)主要需要两部分内容来支持,一是inode结构;二是对于节点的操作函数

    (1)Ext2的索引节点:Ext2的每个文件(或目录)都有一个唯一的i节点ext2_inode,它保存了一个文件所有与存储相关的属性

    struct ext2_inode {
        __le16    i_mode;        /* File mode */
        __le16    i_uid;        /* Low 16 bits of Owner Uid */
        __le32    i_size;        /* Size in bytes */
        __le32    i_atime;    /* Access time */
        __le32    i_ctime;    /* Creation time */
        __le32    i_mtime;    /* Modification time */
        __le32    i_dtime;    /* Deletion Time */
        __le16    i_gid;        /* Low 16 bits of Group Id */
        __le16    i_links_count;    /* Links count */
        __le32    i_blocks;    /* Blocks count */
        __le32    i_flags;    /* File flags */
      ...
        __le32    i_block[EXT2_N_BLOCKS];/* Pointers to blocks */
        __le32    i_generation;    /* File version (for NFS) */
        __le32    i_file_acl;    /* File ACL */
        __le32    i_dir_acl;    /* Directory ACL */
        __le32    i_faddr;    /* Fragment address */
        ...
    };

      * i_mode:指定文件的类型(普通文件、目录文件、设备文件和网络文件)

      * i_block[]:文件索引表。i_block[]共有15项,其中前12项为直接指向文件数据块的指针,后3项分别为采用多级索引结构的“一次间接指针”、“二次间接指针”和“三次间接指针”

    (2)Ext2的i节点操作函数

    const struct inode_operations ext2_file_inode_operations = {
        .truncate    = ext2_truncate,
    #ifdef CONFIG_EXT2_FS_XATTR
        .setxattr    = generic_setxattr,
        .getxattr    = generic_getxattr,
        .listxattr    = ext2_listxattr,
        .removexattr    = generic_removexattr,
    #endif
        .setattr    = ext2_setattr,
        .permission    = ext2_permission,
        .fiemap        = ext2_fiemap,
    };

    ③ Ext2的目录文件及目录项

    (1)Ext2的目录文件实质上是一个目录项列表,其中每一项都是一个ext2_dir_entry_2结构的数据

    struct ext2_dir_entry_2 {
        __le32    inode;            /* Inode number */
        __le16    rec_len;        /* Directory entry length */
        __u8    name_len;        /* Name length */
        __u8    file_type;
        char    name[EXT2_NAME_LEN];    /* File name */
    };

    (2)Ext2的目录文件采用了一个特殊的链表结构进行存储:(程序通过rec_len作为偏移量来查找下一个目录项)

    (3)每当用户需要打开一个文件时,首先要指定待打开文件的路径和名称,文件系统根据路径名称搜索对应的目录项,然后用该目录项中的i节点号找到该文件的i节点,最后通过访问i节点结构中的i_block[]数据块成员来访问文件

    ④ Ext2在磁盘上的存储结构:Ext2文件系统把所占用的磁盘空间分成若干个块组,每个块组的内部结构如下图

    (1)超级块:保存着整个文件系统的信息

    struct ext2_super_block {
        __le32    s_inodes_count;        /* Inodes count */
        __le32    s_blocks_count;        /* Blocks count */
        __le32    s_r_blocks_count;    /* Reserved blocks count */
        __le32    s_free_blocks_count;    /* Free blocks count */
        __le32    s_free_inodes_count;    /* Free inodes count */
        __le32    s_first_data_block;    /* First Data Block */
        __le32    s_log_block_size;    /* Block size */
        __le32    s_log_frag_size;    /* Fragment size */
        __le32    s_blocks_per_group;    /* # Blocks per group */
        __le32    s_frags_per_group;    /* # Fragments per group */
        __le32    s_inodes_per_group;    /* # Inodes per group */
        __le32    s_mtime;        /* Mount time */
        __le32    s_wtime;        /* Write time */
        __le16    s_mnt_count;        /* Mount count */
        __le16    s_max_mnt_count;    /* Maximal mount count */
        __le16    s_magic;        /* Magic signature */
        __le16    s_state;        /* File system state */
        __le16    s_errors;        /* Behaviour when detecting errors */    ...
       __le16 s_block_group_nr;
    /* block group # of this superblock */ ... __u8 s_uuid[16]; /* 128-bit uuid for volume */ char s_volume_name[16]; /* volume name */ char s_last_mounted[64]; /* directory where last mounted */ ... };

    注:Ext2在每个块组中都配置了一个超级块,正常情况下只是用第一个块组(块组0)中的超级块,其他块组的超级块只是一个备份

    (2)块组描述表:是超级块的补充,提供块组位图存放位置和i节点存放位置

    struct ext2_group_desc
    {
        __le32    bg_block_bitmap;        /* Blocks bitmap block */
        __le32    bg_inode_bitmap;        /* Inodes bitmap block */
        __le32    bg_inode_table;        /* Inodes table block */
        __le16    bg_free_blocks_count;    /* Free blocks count */
        __le16    bg_free_inodes_count;    /* Free inodes count */
        __le16    bg_used_dirs_count;    /* Directories count */
        __le16    bg_pad;
        __le32    bg_reserved[3];
    };

    (3)存储块管理位图:记录块组中数据块的使用情况

    (4)i节点管理位图:记录块组中i节点的使用情况

    (5)i节点表:存放i节点数据结构的表

    (6)数据块:储存数据

  • 相关阅读:
    property里的参数
    property关键字的理解
    OC与C语言的几点区别
    C语言学习心得
    QQ第三方<接口>
    为什么选择Redis
    版本控制器
    url传参及重定向
    开发的四个环境
    Paxos分析
  • 原文地址:https://www.cnblogs.com/wulei0630/p/10599907.html
Copyright © 2020-2023  润新知