硬连接和软连接的区别

简述

我们都知道,在linux系统中,本质上是通过inode(index node)来对文件进行访问(或者说数据控制)的。linux的人性化设置,使得平时我们可以通过文件名来访问文件。其实吧,不是一般性的说,文件名,就是inode的别名。


认识目录项,inode以及block

这里有几个简单的知识点:

  1. 一个文件可以被存储在一个或者多个block中;
  2. 每个文件都会并且只能占用一个inode,inode可以指向该文件所在的block,inode中还存储该文件的各种属性,如rwx...;
  3. 想读取该文件,必须经过目录项的文件名来指向到正确的inode号码才能读取。

看到这里,该提出两个问题了:

  1. 什么是目录项?当新建一个目录时,文件系统会分配一个inode和至少一块block给该目录。其中,inode记录该目录的相关权限和属性,并记录分配到的那块block号码。而block则是记录在这个目录下的文件名和这些文件名所对应的inode号码数据,这就是我们所说的数据项
  2. 当几个不同文件名,指向同一个inode号码时,会发生什么事?这就引出了我们要说的内容了,硬连接(hard link)和软连接(symbolic link).
    这幅图可以完美说明这一切:

    为了应题,我把目录项的内容用红色框框出来了。其余那些文件属性是在文件inode中读取出来的。

过程我简单描述一下(这是我个人理解,还有很多细节没写)
系统通过挂载信息找到"/" --> 目录项inode --> 目录项block(block中存有文件名和文件对用的inode,如上图中的python对应inode号码1165874) --> 找到文件inode,验证文件权限和属性 --> 访问文件block(block里存有文件数据)。


硬连接和软连接

其实,硬连接和软连接的区别很简单的,下图可以清晰说明了:

可以很清楚看到,文件名pythonpython2.4的inode是一样的,而且,在蓝色框那里,它们对应的数字都是2(这个2就是连接数)。没错,这就是硬连接
剩下的便是python2 -> python了,它的连接数为1,同时它的inode不同于其他的,但它指向了python,也就是说,inode号码1156324指向了一个block,这个block内存有找到inode号码1165874的信息,这便是软连接,有很多人都说它就像windows上的快捷方式。


硬连接的限制

其他关于硬连接和软连接的,网上一大把了。这里我再说一下硬连接的两个主要限制:

  1. 不能跨文件系统。由于指向的是同一个inode,不同文件系统对inode的定义也不同。
  2. 不能连接到目录。如果你为/etc创建一个硬连接/etc_hard,那么,/etc文件下的所有文件名也要同/etc_hard创建硬连接。每次修改/etc,系统也要修改/etc_hard.这样,会造成很大的系统开销。所以,目前还没实现对目录进行硬连接。

版权声明:保留所有权,转载需声明出处。


posted @ 2017-07-18 17:46  busui  阅读(11476)  评论(0编辑  收藏  举报