Linux中的中的EXT系列文件系统格式详解系列文件系统格式详解
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;