inode结构体
inode结构体概述
Linux打开一个文件中的核心点是inode结构体,所以我们就从inode结构体开始讲这个问题。
inode应该来源于“index node”的缩写,所以发音为 [aɪ noʊd]
在Linux系统中,一个文件通常对应一个inode(索引节点),特殊情况下可能有多个文件名与一个inode对应,或者一个文件涉及多个inode,特殊情况我们不作考虑,在这里,我们只需要知道,在Linux系统中,一个文件通常对应一个inode。
inode(索引节点)是文件系统中的数据结构,存储文件的元信息(例如文件大小、权限、所有者、时间戳等),但不包含文件名。
每个文件在文件系统中都会分配一个唯一的inode。
具体来说,inode
在 Linux 内核中是一个结构体,定义在内核的源代码中,具体在头文件 include/linux/fs.h
中。它是文件系统的核心数据结构之一,用于表示文件的元数据。
struct inode
的基本结构
inode
结构体的定义包含许多字段,负责描述文件的各种属性和操作。例如:
struct inode {
umode_t i_mode; /* 文件类型和权限 */
unsigned short i_opflags; /* 操作相关标志 */
kuid_t i_uid; /* 文件所有者的用户ID */
kgid_t i_gid; /* 文件所有者的组ID */
unsigned int i_flags; /* 文件标志 */
const struct inode_operations *i_op; /* 文件操作方法 */
struct super_block *i_sb; /* 所属超级块 */
struct address_space *i_mapping; /* 地址空间 */
loff_t i_size; /* 文件大小 */
struct timespec64 i_atime; /* 最后访问时间 */
struct timespec64 i_mtime; /* 最后修改时间 */
struct timespec64 i_ctime; /* 状态更改时间 */
unsigned int i_nlink; /* 硬链接计数 */
ino_t i_ino; /* inode编号 */
dev_t i_rdev; /* 主设备号和次设备号(如果是设备文件) */
const struct file_operations *i_fop; /* 文件操作结构体,存储着诸如open,read,write等函数 */
/* ...更多字段,用于缓存、锁、权限检查等... */
};
关键字段说明
-
i_mode
:- 保存文件的类型(如普通文件、目录、设备文件)和权限信息。
- 通过掩码可以检查文件类型,例如
S_ISREG
检查是否是普通文件。
-
i_uid
和i_gid
:- 文件的所有者用户ID和组ID。
-
i_size
:- 文件的大小(以字节为单位)。
-
i_atime
/i_mtime
/i_ctime
:- 分别表示最后访问时间、最后修改时间和元数据更改时间。
-
i_nlink
:- 硬链接计数,指向同一个inode的目录项数量。当计数降为0时,文件数据会被释放。
-
i_op
:- 指向一个
inode_operations
结构体,用于定义文件系统对该inode支持的操作(例如创建、删除)。
- 指向一个
-
i_mapping
:- 表示文件的地址空间,通常用来管理文件数据的缓存。
-
i_ino
:- inode编号,文件系统中每个文件的唯一标识。
-
i_rdev
:- 里面存储着主设备号和次设备号信息。
-
i_fop
:- 文件操作结构体,它实际上就是链接着文件操作结构体,比如驱动程序中的文件操作结构体,里面定义着文件的底层打开函数、读函数、写函数等。
inode 的核心作用
-
存储元信息:
- 保存文件的基本属性,比如权限、