当前位置 主页 > 服务器问题 > Linux/apache问题 >

    Linux中的EXT系列文件系统格式详解

    栏目:Linux/apache问题 时间:2020-02-04 08:14

    Linux文件系统

    常见的硬盘如上图所示,每个盘片分多个磁道,每个磁道分多个扇区,每个扇区512字节,是硬盘的最小存储单元,但是在操作系统层面会将多个扇区组成块(block),是操作系统存储数据的最小单元,通常是8个扇区组成4K字节的块。
    对于Linux文件系统,需要考虑以下几点:

    文件系统需要有严格的组织形式,使文件能够以块为单位存储 文件系统需要有索引区,方便查找一个文件分成的多个块存在了什么位置 如果有文件近期经常被读写,需要有缓存层 文件应该用文件夹的形式组织起来方便管理和查询 Linux内核要在自己的内存里维护一套数据结构,保持哪些文件被哪些进程打开和使用

    Linux里面一切皆文件,都有以下几种文件(从ls -l结果的第一位标识位可以看出来):

    - 表示普通文件 d 表示文件夹 c 表示字符设备文件 b 表示块设备文件 s 表示套接字socket文件 l 表示软链接

    Inode和块存储

    下面就以EXT系列格式为例来看一下文件是如果存在硬盘上的。首先文件会被分成一个个的块,分散得存在硬盘上,就需要一个索引结构来帮助我们找到这些块以及记录文件的一些元信息,这就是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 */
     union {
      struct {
       __le32 l_i_version;
      } linux1;
      struct {
       __u32 h_i_translator;
      } hurd1;
      struct {
       __u32 m_i_reserved1;
      } masix1;
     } osd1;    /* OS dependent 1 */
     __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;
     __le32 i_obso_faddr; /* Obsoleted fragment address */
     union {
      struct {
       __le16 l_i_blocks_high; /* were l_i_reserved1 */
       __le16 l_i_file_acl_high;
       __le16 l_i_uid_high; /* these 2 fields */
       __le16 l_i_gid_high; /* were reserved2[0] */
       __le16 l_i_checksum_lo;/* crc32c(uuid+inum+inode) LE */
       __le16 l_i_reserved;
      } linux2;
      struct {
       __le16 h_i_reserved1; /* Obsoleted fragment number/size which are removed in ext4 */
       __u16 h_i_mode_high;
       __u16 h_i_uid_high;
       __u16 h_i_gid_high;
       __u32 h_i_author;
      } hurd2;
      struct {
       __le16 h_i_reserved1; /* Obsoleted fragment number/size which are removed in ext4 */
       __le16 m_i_file_acl_high;
       __u32 m_i_reserved2[2];
      } masix2;
     } osd2;    /* OS dependent 2 */
     __le16 i_extra_isize;
     __le16 i_checksum_hi; /* crc32c(uuid+inum+inode) BE */
     __le32 i_ctime_extra; /* extra Change time (nsec << 2 | epoch) */
     __le32 i_mtime_extra; /* extra Modification time(nsec << 2 | epoch) */
     __le32 i_atime_extra; /* extra Access time (nsec << 2 | epoch) */
     __le32 i_crtime; /* File Creation time */
     __le32 i_crtime_extra; /* extra FileCreationtime (nsec << 2 | epoch) */
     __le32 i_version_hi; /* high 32 bits for 64-bit version */
     __le32 i_projid; /* Project ID */
    };