-
物理结构,每个硬盘分级:盘片》磁道》扇页 每个扇页为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为软连接,不带为硬连接
网友评论