虚拟文件系统是内核中的软件层,它为用户态程序提供了文件系统接口。虚拟文件系统的存在使得不同类型的文件系统可以在Linux中共存。索引节点(Inode)和目录项是2个重要的对象。这篇文章将浅浅的了解一下Inode和目录项。
Inode 文件的身份证
在Linux系统中,每个文件都有一个索引节点(Inode), 在单个文件系统中索引节点是唯一的。不同的文件系统中可以使用相同的索引节点(硬链接无法跨文件系统创建的原因)。 索引节点中记录了文件的元数据信息,主要包含如下内容:
可以使用stat来获取文件的索引节点信息
[root@localhost ~]# stat anaconda-ks.cfg
文件:anaconda-ks.cfg
大小:757 块:8 IO 块大小:4096 普通文件
设备:253,0 Inode: 9794337 硬链接:1
权限:(0600/-rw-------) Uid: ( 0/ root) Gid: ( 0/ root)
上下文:system_u:object_r:admin_home_t:s0
访问时间:2026-02-03 23:27:00.181727845 +0800
修改时间:2026-02-03 23:27:01.092732417 +0800
变更时间:2026-02-03 23:27:01.092732417 +0800
创建时间:2026-02-03 23:27:00.181727845 +0800
目录项
目录项中存储了文件名和Inode的映射关系, 在一个文件系统中可以存在多个目录项指向同一个索引节点,这些目录项被称为硬链接。目录项的结构如下
struct linux_dirent64 {
ino64_t d_ino; /* 64位的文件Inode编号*/
off64_t d_off; /* 64-bit offset to next structure */
unsigned short d_reclen; /* Size of this dirent */
unsigned char d_type; /* File type */
char d_name[]; /* 文件名 */
}
Linux系统中访问文件的过程
在Linux系统中,要访问一个文件要查找与文件关联的信息,必须遍历目录文件以找到该文件对应的目录项,随后加载索引节点, 最后根据索引节点来找到磁盘上的文件内容来获取该文件的元数据。
例如:
假设在Linux系统中存在/home/test/test.log,Linux访问test.log文件的流程如下:
(1) Linux内核从根目录开始,遍历内部所有目录项,找到名为home的条目,获取到对应的索引节点编号(inode1)。 通过inode1从磁盘获取到inode元数据信息,通过元数据信息找到/home在磁盘中的存储位置
(2) 接着读取/home这个目录文件,继续遍历/home内部目录项,找到test,再获取它的索引节点编号(inode2)。 通过inode2从磁盘获取到inode元数据信息,通过元数据信息找到/home/test在磁盘中的存储位置
(3) 最后读取/home/test目录文件, 遍历目录项,匹配到目标文件名test.log,同时拿到该文件的索引节点编号(inode3)。 通过inode3从磁盘获取到inode元数据信息,通过元数据信息找到/home/test/test.log在磁盘中的存储位置。