inode与dentry
Linux系统中将文件的属性与数据分开存储,文件中的数据存放的区域称为数据区,文件属性又被称为元数据,存放文件属性的区域称为元数据区,基于这种文件存储方式,Linux文件系统中定义了两个与文件相关的、至关重要的概念:索引结点和目录项。
(1)索引结点
索引结点(index node,简称inode)的实质是一个结构体,主要功能是保存文件的属性信息(如所有者、所属区、权限、文件大小、时间戳等),Linux系统中的每个文件都会被分配一个inode,当有文件创建时,系统会在inode表中获取一个空闲的inode,分配给这个文件。inode存储在inode表中,inode表存储inode和inode的编号(inumber),inode表在文件系统创建之时便被创建,因此文件系统中可存储的文件数量也在文件系统创建时已确定。
文件的inode编号可通过“ls –i”命令查看,如查看当前目录中普通文件test.c的inode编号,示例如下:
[itheima@localhost ~]$ ls -i test.c
665964 test.c
由打印结果可知test.c的inode编号为665964。
对于Linux的每个文件系统来说inode编号唯一,但Linux系统中可以为每个分区安装一个文件系统,因此inode编号并不能唯一标识Linux系统中的一个文件。
(2)目录项
Linux文件系统中的索引结点保存着文件的诸多属性信息,但并未保存文件的文件名。实际上,Linux系统中文件的文件名并不保存在文件中,而是保存在存放该文件的目录中。
Linux系统中定义了一个被称为目录项(dentry)的结构体,该结构体主要存储文件的文件名与inode编号,系统通过读取目录项中的文件名和文件的inumber,来判断文件是否存在于这个目录中。dentry中允许同一个inode对应不同的文件名,但不允许相同的文件名对应不同的inode。
不同于Windows系统中多树并存的目录结构,Linux系统中只以根目录为根结点,向下扩散出多个目录结点,也就是说,所有文件的路径都从根目录开始,而根目录是可以自引用的,任务发起后,内核会根据获得的路径名,自动找到根目录,之后根据路径名中的目录名与文件名,通过逐级检测目录中的目录项,来寻找文件。