美文网首页
28,磁盘文件系统

28,磁盘文件系统

作者: AndyWei123 | 来源:发表于2020-05-06 01:26 被阅读0次
    • 物理结构,每个硬盘分级:盘片》磁道》扇页 每个扇页为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为软连接,不带为硬连接

    相关文章

      网友评论

          本文标题:28,磁盘文件系统

          本文链接:https://www.haomeiwen.com/subject/jobbghtx.html