深刻理解linux中i节点(inode)

对于Unix系列的操做系统,大多都有v节点。可是对于linux来讲,只有通用的i节点,却没有v节点。node

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

 


      linux中,文件查找不是经过文件名称来查找的。其实是经过i节点来实现文件的查找定位的。咱们能够形象的将i节点看作是一个指针fip。当文件存储到磁盘上去的时候,文件确定会存放到一个磁盘位置上,能够这样想象,既然文件数据是存放在磁盘上的,若是咱们知道这个文件数据的地址,当咱们想要读写文件的时候,咱们是否是直接使用这个地址去找到文件就能够了呢?windows

      

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

    

     咱们能够经过一个图来看看目录项,i节点,文件数据四者之间的关系。操作系统

 

从上图能够看到,目录项中包含了文件名和i节点。.net

 

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

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

 

这就引出了一个硬连接和符号连接的概念blog

 

硬连接  ln -d索引

 

符号连接 ln -s。

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

[cpp] view plaincopyprint?

  1. #ln -d  helloA.c  helloB.c  

这样,就获得了helloA.c的硬连接helloB.c

 

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

也就是说。这里,若是咱们使用命令:

[cpp] view plaincopyprint?

  1. # rm  -rf  helloA.c  

helloB.c一样能够正常使用,其内容就是printf("ha");

 

可是若是是符号连接:

 

[cpp] view plaincopyprint?

  1. #ln -s  helloB.c  helloC.c  

 

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

符号连接包含了一个文件名的路劲,若是这个文件名被删除,这符号连接天然就不能正常工做了。

 

我的理解:

硬连接:硬连接只是复制了文件的inode(节点),inode是操做系统指定文件的依据,每一个文件有且只有一个inode,因此操做硬连接就是操做源文件。

软链接:就至关于windows中的快捷方式,是用路径指到文件的,删除源文件会对其形成影响。

相关文章
相关标签/搜索