您还未登录! 登录 | 注册 | 帮助  

您的位置: 首页 > 软件开发专栏 > 系统/运维 > 正文

Linux文件的硬链接与软连接

发表于:2017-08-08 作者:LLZK_ 来源:

  Linux文件系统下有两个特殊的文件,分别叫硬链接文件和软连接文件。硬链接文件是一种引用计数的运用,软连接可以理解为Windows下面的快捷方式。
  硬链接
  硬链接的实质就是通过文件的inode节点进行连接。我们都知道,Linux下每个文件都对应一个inode结点,都有一个单独的inode编号。而硬链接不同,每一个硬链接的inode都与源文件相同。假设我对文件A建立了一个硬链接文件B,此时B的inode编号与A相同。
  每个文件可以建立一个或多个硬链接,这样可以达到“防误删”的功能,当删除了源文件时,还可以通过硬链接文件来访问文件数据。
  我们可以通过下图来理解硬链接:

  引用计数
  系统通过引用计数的方式来管理源文件和这些个硬链接的。
  我们使用stat指令查看文件inode信息,会发现有个Links的选项:
  [lzk@localhost ~]$ stat file
  File: `file'
  Size: 32          Blocks: 8          IO Block: 4096   regular file
  Device: 802h/2050d  Inode: 5740        Links: 1
  Access: (0664/-rw-rw-r--)  Uid: (  500/     lzk)   Gid: (  500/     lzk)
  Access: 2017-04-23 22:22:23.452294600 +0800
  Modify: 2017-04-23 22:21:55.415294411 +0800
  Change: 2017-04-23 23:11:31.365292371 +0800
  Links的初始值为1,没当我们为它创建一个硬链接,它的值就会加1。每当删除一个硬链接文件,它的值就会减1。
  指令ln用来创建硬链接文件。
  ln [源文件] [硬链接文件]
  eg:

  从上例可以看到,当一个文件Links(引用计数)不为1的时候,我们删除一个源文件或者硬链接文件并不会删除文件数据。当Links为1的时候,再删除就会将数据删除。
  ### 关于硬链接的限制
  以下内容摘自:http://blog.sina.com.cn/s/blog_65fdcaa40101f11t.html
  linux系统中的硬连接有两个限制:不能跨越文件系统和不允许普通用户对目录作硬连接。至于第一个限制,很好理解,而第二个就不那么好理解 了。 对任何一个目录用ls -l 命令都可以看到其连接数至少是2,这也说明了系统中是存在硬连接的,而且命令ln -d 也可以让超级用户对目录作硬连接,这些都说明了系统限制对目录进行硬连接只是一个硬性规定,并不是逻辑上不允许或技术上的不可行。那么操作系统为什么要进 行限制呢?答案可能有两个。
  先来说第一个,如果引入了对目录的硬连接就有可能在目录中引入循环,那么在目录遍历的时候系统就会陷入无限循环当中。也许您会说,符号连接不也可以引入循 环吗,那么为什么不限制目录的符号连接呢?原因就在于在linux系统中,每个文件(目录也是文件)都对应着一个inode结构,其中inode数据结构 中包含了文件类型(目录,普通文件,符号连接文件等等)的信息,也就是说操作系统在遍历目录时可以判断出符号连接,既然可以判断出符号连接当然就可以采取 一些措施来防范进入过大的循环了,系统在连续遇到8个符号连接后就停止遍历,这就是为什么对目录符号连接不会进入死循环的原因了。但是对于硬连接,由于操 作系统中采用的数据结构和算法限制,目前是不能防范这种死循环的。
  在说明第二个原因之前,先来看看文件的dentry结构在系统空间中长什么样子和它们是怎么存放在系统空间的。dentry结构主要包含了文件名,文件的inode号,指向父目录dentry结构的指针和其他一些与本次讨论无关的指针,这里关键是那个指向父目录的指针;系统中所有的dentry结构都 是按杂凑值存放在杂凑表中的,这里的杂凑算法很重要,它是取文件名和文件的父目录dentry结构的地址一起杂凑运算出杂凑值的。现在假设有两个目录 /a和/b,其中/b是我们通过ln -d命令建立起来的对/a的硬连接。这个时候内核空间中就会存在一个/a的dentry结构和一个/b的dentry结构,由上面的知识可知,/a和/b 目录下面的每一个文件或目录都各自有对应的dentry结构(因为虽然/a目录下面的文件名没有改变,但是因为dentry结构有指向父目录dentry 的指针和计算杂凑值时考虑了父目录dentry结构的地址,这个时候dentry结构就分身乏术了),而且这种继承还会影响到所有子目录下面的文件,这样 下来就会浪费很多系统空间了,特别是如果被硬连接的目录中存在大量文件和子目录的时候就更加明显了。这也许是第二个原因。
  ## 软连接
  软连接又叫做符号链接,它类似于windows系统的快捷方式。与硬链接不同的是,它没有引用计数,并且它拥有自己的inode。也就是说,软连接文件的inode与源文件不同。
  如何实现链接的呢?我们可以理解为,软连接文件也是一个文本文件,不过它里面包含了源文件的位置信息。如下图:

  我们可以用ln指令的-s选项创建一个文件的软连接。