Linux文件链接分两种

  • 硬链接(Hard Link)
  • 符号链接(Symbolic Link):相当于Windows下的快捷方式。

#Hard Link(硬链接)
硬链接指通过索引节点来进行链接。
文件都有文件名与数据,这在Linux上被分成两个部分:用户数据 (user data) 与元数据 (metadata)。用户数据,即文件数据块 (data block),数据块是记录文件真实内容的地方;而元数据则是文件的附加属性,如文件大小、创建时间、所有者等信息。元数据中的 inode 号(inode 是文件元数据的一部分但其并不包含文件名,inode 号即索引节点号)才是文件的唯一标识而非文件名。文件名仅是为了方便人们的记忆和使用,系统或程序通过 inode 号寻找正确的文件数据块。如下图展示了程序通过文件名获取文件内容的过程。
inode
换言之,硬链接就是同一个文件使用了多个别名。
硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬链接到重要文件,以防止“误删”的功能。

#Symbolic Link(符号链接)
也叫软连接。符号链接文件类似于Windows的快捷方式。它实际上是一个特殊的文件。在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。

两种链接文件都可以由ln命令生成。
ln命令使用演示:

1
2
3
4
5
6
7
8
sodino$ echo "abcdefg" > original.txt //创建一个文件名为"original.txt"且文本内容为"abcdefg"
sodino$ ln original.txt hard_link.txt //为文本文件创建一个硬链接文件
sodino$ ln -s original.txt symbolic_link.txt //为文本文件创建符号链接
sodino$ ls -l -i // -i:显示inode节点信息
total 24
8160 -rw-r--r--@ 2 sodino staff 8 Mar 6 16:18 hard_link.txt
8160 -rw-r--r--@ 2 sodino staff 8 Mar 6 16:18 original.txt
8261 lrwxr-xr-x 1 sodino staff 12 Mar 6 16:18 symbolic_link.txt -> original.txt

由上面的操作,显示original.txt与hard_link.txt的inode节点信息是一至的,都是8160,都显示硬链接节点数为2
而符号链接文件则显示使用不同的inode节点,且后续显示其指向真正的目标文件是original.txt
硬链接和符号链接还有如下区别:

  1. 编辑原文件original.txt的内容则硬链接文件hard_link.txt的内容也跟着一起变化了,同样编辑硬链接文件hard_link.txt的内容,原文件original.txt的内容也随之变化,两者保持一致。
    但无论原文件和硬链接文件的内容如何变化,符号链接文件都不受影响。
  2. 删除原文件original.txt后,符号链接文件则失效会提示“找不到源文件”,但硬链接文件的内容仍存在,不受影响仍可正常编辑。只有原文件和其它所有的硬链接文件删除后,文本内容才会被真正的删除。
  3. 不允许对文件夹创建硬链接,但符号链接仍对文件夹有效。毕竟硬链接是针对拥有单独数据块的文件所进行的操作。
  4. 只有在同一文件系统中的文件之间才能创建硬链接。即不同硬盘分区上的两个文件之间不能够建立硬链接。这是因为硬链接是通过节点点指向原始文件的,而文件的inode节点在不同的文件系统中可能会不同。