28,磁盘文件系统

  • 物理结构,每个硬盘分级:盘片》磁道》扇页 每个扇页为512个字节

  • 块和innod的存储

    • 而每个块大小为扇页的倍数,一般为4k
    • inode i为index的意思,inode用于保存文件的元数据信息,包括权限,文件名。
    struct ext4_inode {
    __le16  i_mode;    /* File mode */
    __le16  i_uid;    /* Low 16 bits of Owner Uid */
    __le32  i_size_lo;  /* Size in bytes */
    __le32  i_atime;  /* Access time */
    __le32  i_ctime;  /* Inode Change 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_lo;  /* Blocks count */
    __le32  i_flags;  /* File flags */
    ......
    __le32  i_block[EXT4_N_BLOCKS];/* Pointers to blocks */
    __le32  i_generation;  /* File version (for NFS) */
     __le32  i_file_acl_lo;  /* File ACL */
    __le32  i_size_high;
    ......
    };```
    
    • i_ mode为文件全系,
    • i_ctime为文件inode修改时间
    • i_atime为文件最近访问时间
    • i_mtime为文件最后修改时间
    • i_block 为该文件大块数据

    ext2和ext3的i_block 的结构如下


    image.png

    其中0-11号直接存放块位置,12为指向间接块的位置,13 指向二层间接块的位置,14指向三层间接块的位置
    上面的方法第一个就是大文件搜索比较耗时,第二个文件存储比较散乱,ext4 文件系统引入了extens的特性,其结构如下。


    image.png

    它是一个树形结构,i_block 中只存储四个 exten_entry 其指向连续的内存块或者下一个extend_header ,其中只有叶子节点存储数据。每个exten_entry 大小为12个字节
    struct ext4_extent_header {
    __le16  eh_magic;  /* probably will support different formats */
    __le16  eh_entries;  /* number of valid entries */
    __le16  eh_max;    /* capacity of store in entries */
    __le16  eh_depth;  /* has tree real underlying blocks? */
    __le32  eh_generation;  /* generation of the tree */
    };
    struct ext4_extent {  __le32  ee_block;  
    /* first logical block extent covers */  
    __le16  ee_len;    
    /* number of blocks covered by extent */  
    __le16  ee_start_hi;  
    /* high 16 bits of physical block */  
    __le32  ee_start_lo;  
    /* low 32 bits of physical block */};
    
  • inode 位图和块位图

    • 硬盘划出一块单独的区域表示inode的使用情况和块的使用情况称为位图,0代表为使用,1代表使用。
    • 这两种位图的大小都为4k
  • 文件系统的格式

    • 由于块位图只有4k只能代表4k*4k 就是128M的空间,所以引入了块组的概念

    一个inode位图+一个块位图+一系列的块+一系列的inode 即称为一个块组。

    • 维护多个块组的列表叫做块组描述符。
    • 超级块 ext4_super_block:描述文件系统有多少个块组,多少inode,每个块组有多少个inode,每个块组有多少个块。
    • Meta Block Groups 特性:由于块组描述符表和超级块是磁盘系统的全局信息,需要全局备份,那么加入每个都备份块描述符表就很占空间,而且限制了文件系统的大小。所以我们将多个块组组合为一个元块组。
      image.png

      如图,每个元块组之只维护自己的块组描述符,然后保存在第一个第二个和最后一个块组中,超级块则是保存在0,3,5,7 的幂的块组中。

  • 目录的存储格式

    • 目录的元数据也是通过inode保存
    struct ext4_dir_entry {
    __le32  inode;      /* Inode number */
    __le16  rec_len;    /* Directory entry length */
    __le16  name_len;    /* Name length */
    char  name[EXT4_NAME_LEN];  /* File name */
    };
    struct ext4_dir_entry_2 {
    __le32  inode;      /* Inode number */
    __le16  rec_len;    /* Directory entry length */
    __u8  name_len;    /* Name length */
    __u8  file_type;
    char  name[EXT4_NAME_LEN];  /* File name */
    };
    

    其中name为文件名列表,假如文件太多,则会以索引的形式保存。

    struct dx_root
    {
    struct fake_dirent dot;
    char dot_name[4];
    struct fake_dirent dotdot;
    char dotdot_name[4];
    struct dx_root_info
    {
    __le32 reserved_zero;
    u8 hash_version;
    u8 info_length; /* 8 */
    u8 indirect_levels;
    u8 unused_flags;
    }
    info;
    struct dx_entry  entries[0];
    };
    

    其中dx_root_info 的 indirect_levels 为间接索引层
    两种表现形式如下


    image.png
  • 软连接和硬链接。

    • 软连接是字节新建一个inode 然后跳转到映射的文件位置
    • 硬连接是两个文件夹使用同一个inode
  • 命令行 ln [参数][源文件目录][目标文件目录]

参数如下 -s为软连接,不带为硬连接

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。