硬链接和软链接是Linux文件系统中的一个重要的概念,其涉及文件系统中的索引节点(index node又称为inode),而索引节点对象是Linux虚拟文件系统(VFS)的四个基本概念之一。在Linux中文件作为进程创建信息的逻辑单元可被多个进程并发使用。Linux系统顶层文件目录如下图所示: file class 文件分为文件名和数据两部分,这在linux上被分成两个部分:用户数据与元数据。用户数据,即文件数据块,数据块是记录文件真实内容的地方;而元数据则是文件的附加属性,比如文件大小、创建时间等信息。元数据中的inode索引节点号才是文件的唯一标识,而不是文件名。

为解决文件共享,Linux引入了两种链接:硬链接和软链接(又称符号链接)。若一个inode号对应多个文件名,则称这些文件为硬链接。换言之,硬链接就是同一个文件使用了多个别名。硬链接可以使用link或ln命令来创建。硬链接有以下几点特性:

  • 文件有相同的inode及data block
  • 只能对已存在的文件创建硬链接
  • 不能交叉文件系统进行硬链接的创建(因为不同的文件系统可能存在相同的inode号)
  • 不能对目录进行创建,只能对文件进行创建
  • 删除一个硬链接文件不会影响其他相同inode号的文件

软链接与硬链接不同,若文件用户数据块中保存的内容为另一个文件的指向,则该文件就是软链接。换言之,软链接就是一个普通的文件,只是数据块内容有点特殊。软链接有着自己的inode号以及用户数据块。软链接可以用ln -s来创建。软链接的特点如下所示:

  • 软链接有着自己的文件属性及权限
  • 可以对不存在的文件和目录创建软链接
  • 软链接可交叉文件系统
  • 软链接可以对文件和目录创建
  • 创建软链接时,链接计数i_nlink不会增加,而硬链接计数器会增加
  • 删除软链接并不影响被指向文件,但若是原文件被删除,则相关的软链接被称为死链接

硬链接和软链接区别示意图如下: