目录、目录项、文件名、inode、软硬链接的关系

对于Unix系列的操作系统,大多都有v节点。但是对于linux来说,只有通用的i节点,却没有v节点。

下面来探讨一下,linux下的i节点。

 

linux中,文件查找不是通过文件名称来查找的。实际上是通过i节点来实现文件的查找定位的。我们可以形象的将i节点看做是一个指针fip。当文件存储到磁盘上去的时候,文件肯定会存放到一个磁盘位置上,可以这样想象,既然文件数据是存放在磁盘上的,如果我们知道这个文件数据的地址,当我们想要读写文件的时候,我们是不是直接使用这个地址去找到文件就可以了呢?

      

      是的,linux下,i节点其实就是可以这么认为,把i节点看作是一个指向磁盘上该文件存储区的地址。只不过这个地址我们一般是没办法直接使用的,而是通过文件名来间接使用的。事实上,i节点不仅包含了文件数据存储区的地址,还包含了很多信息,比如数据大小,等等文件信息。但是i节点是不保存文件名的。文件名是保存在一个目录项中。每一个目录项中都包含了文件名和i节点。

    

     我们可以通过一个图来看看目录项,i节点,文件数据四者之间的关系。

从上图可以看到,目录项中包含了文件名和i节点。

 

同时,你会发现上图中,目录项A和目录项B的i节点指向同一个存储区,其中这个存储区存放的是printf("ha")的数据。

也就是意味着helloA.c和helloB.c的内容是一样的。

 

这就引出了一个硬链接符号链接的概念

 

硬链接  ln -d

 

符号链接 ln -s。

要想得到helloA.c和helloB.c这种关系,我们可以使用如下命令:

#ln -d  helloA.c  helloB.c 

 

这样,就得到了helloA.c的硬链接helloB.c

 

对于硬链接来说。如果删掉源文件helloA.c,那么磁盘上数据文件时不会删除的。因为i节点上记录了该文件的硬链接数。只有硬链接数是0的时候,删除文件名的时候,该数据在磁盘上才会删除。

也就是说。这里,如果我们使用命令:

# rm  -rf  helloA.c 

 

helloB.c同样可以正常使用,其内容就是printf("ha");

 

但是如果是符号链接:

 

#ln -s  helloB.c  helloC.c 

 

这就是所谓的符号链接,符号链接其实是文件索引的索引。当源文件helloB.c删除之后,其实磁盘数据文件还在,helloC.c也无法使用。

符号链接包含了一个文件名的路劲,如果这个文件名被删除,这符号链接自然就不能正常工作了。

 

i节点包含了大多数与文件有关的信息:文件类型、文件访问权限bit、文件长度、以及指向该文件所占用的数据块位置的指针。stat结构里面大部分的信息都是取自于i节点,除了两项:

文件名和i节点编号

(inode编号的数据类型是ino_t)

 

总结-目录,目录项,索引节点的关系

在Linux操作系统中,目录就是目录文件。

一个目录文件包含了一组目录项,目录项是放在data block中的。(参考《Unix环境高级编程》Page87)

一个目录项主要包括了文件名和索引节点号,索引节点号是指向索引节点表( system inode table )中对应的索引节点的。 或者这样解释一下目录项( 这是大家一起讨论出来的 ),因为目录可以包含子目录,目录是可以层层嵌套的,所以形成文件路径,而文件路径中的每一部分就是所谓的目录项(dentry)。

注:内核后来的版本采用ext文件系统时,目录项中就不是存放索引节点号,然后找到索引节点表,再找到索引节点了。而是目录项中存放文件名和一个指向索引节点的指针。

索引节点就是文件系统处理文件所需要的所有信息都存放在称为索引节点的数据结构中。主要就是文件的属性,包括链接数、文件所有者、文件建立和修改的时间,文件在磁盘的位置,文件大小、使用权限等等。

 

posted @ 2014-01-16 18:40  soaringEveryday  阅读(4843)  评论(0编辑  收藏  举报