Linux系统硬链接和软链接介绍

时间:2021-08-27 09:30:12

1、链接的概念

在Linux系统中链接分为硬链接和软连接两种,一种为硬链接,另一种为软连接或符号链接(symbolic Link)。ln命令就是创建链接文件的,在默认不带参数的情况下,执行ln命令创建的链接就是硬链接。

2、硬链接

硬链接是指通过索引节点(inode)来进行链接。在Linux(ext2,ext3)文件系统中,保存在磁盘分区中的文件不管是什么类型都会给它分配一个编号,这个编号被称为索引节点(inode)。如果多个文件名指向同一个inode是正常且允许的。这种情况的文件就称为硬链接。硬链接的作用之一就是允许一个文件拥有多个有效路径名,这样用户就可以建立硬链接到重要的文件。以防止误删除源数据(很多硬件存储,如netapp存储 中的快照功能就应用了这个原理,增加一个快照就多了一个硬链接)。为什么一个文件建立了硬链接就会防止数据误删呢?

因为文件系统(ext2)的原理是,只要文件的索引节点还有一个以上的链接。只删除其中一个链接(即仅仅删除了该文件的链接指向)并不影响索引节点本身和其他的链接(即文件数据实体并未被删除),只有当文件的最后一个链接被删除后,此时如果有新数据要存储到硬盘上时或者系统通过fsck做磁盘检查的时候,被删除文件的数据块及目录的链接才会被释放,空间被新数据占用并覆盖。此时,数据就再也无法找回了。也就是说,Linux系统中删除静态(未被使用的文件)文件(目录也是文件)的条件是与之相关的所有硬链接文件均被删除(暂时这样理解即可,后文会讲和进程的占用有关)。

硬链接就相当于文件的另外一个入口,如下图所示。文件的权限放在Inode节点当中,但是文件的名称(文件名)并未保存在inode节点当中,所以每个inode可以对应多个不同文件名的相同数据块的文件。

注:文件名保存在文件目录的block数据块中

Linux系统硬链接和软链接介绍

3、硬链接的创建

直接执行命令ln 源文件 硬链接文件 即可创建硬链接

硬链接的类型为(-)普通文件类型

Linux系统硬链接和软链接介绍

第一组数字表示文件的inode节点,权限后边的数字2表示文件的硬链接数量。

小结:

  • 硬链接文件是具有相同inode节点号的不同文件;
  • 删除硬链接文件或者删除源文件之一,文件实体依然存在并未被消除;
  • 只有删除了源文件及所有对应的所有硬链接文件,文件实体才会被删除;
  • 当所有的硬链接文件及源文件被删除后,再存放新的数据会占用文件(包括inode和block)的空间,或者磁盘做fsck检查时数据也会被回收。
  • 硬链接文件是文件的又一个入口
  • 欲删除通过ln(不带参数)创建的硬链接文件,使用rm -f删除硬链接文件即可。
  • 可以通过给文件设置硬链接文件,来防止重要文件被误删除。

3、软连接

软连接也成为符号链接(symbolic link)。Linux 软连接文件就类似于windows系统中的快捷方式。它实际上是一个特殊的文件。在软连接中,软连接文件实际上就是一个文本文件,这个文件中包含有软连接指向另外一个文件的位置信息内容(通过readlink命令,(readlink 软连接文件名称)可以查看软连接记录的位置信息内容,因此通过访问这个快捷方式就可以迅速定位到软连接所指向的源文件的实体。下图为软连接文件的示意图:

Linux系统硬链接和软链接介绍

Linux系统硬链接和软链接介绍

执行软连接命令 ln -s 源文件或目录 软连接文件名称

小结:

  • 软连接文件类似windows的快捷方式,软连接存放的是源文件的路径并且指向源文件;
  • 当源文件被删除时,软连接文件依然存在但无法访问指向的源文件(软连接失效);
  • 软连接文件和源文件的Inode不同,即软链接和源文件是不同的文件,文件类型也不同,源文件可能是d,-,b,但软连接文件是l文件;
  • 软连接文件用rm -f删除(不能使用-r),因为软连接不是目录文件,使用-r将删除上层的目录文件。请谨慎使用。

4、示例:

  • 普通文件示例

Linux系统硬链接和软链接介绍

  • 目录文件示例

Linux系统硬链接和软链接介绍

  • 基础知识普及(为什么目录文件的硬链接数初始就为2)?

补充:当一个目录为空时,其“.”的硬链接数初始为2,如果此时在当前目录下创建一个子目录,则“."的硬链接数将加1,如果再创建一个文件硬链接数再加1,…….,因为创建一个目录时会在每个目录产生一个"..”指向上层目录的硬链接,该机制直接造成上层目录的硬链接数增加。如果创建子目录的子目录,则爷目录的硬链接不会增加。如果在当前目录创建文件,则关于当前目录"."的硬链接将不会增加。

Linux系统硬链接和软链接介绍

关于文件链接的总结:

  • 对于删除软链接文件对源文件及硬链接文件无影响;
  • 删除硬链接文件对源文件及软链接文件无影响;
  • 删除源文件对硬链接文件无影响,但是会导致软链接文件失效,白字红底闪烁;
  • 同时删除源文件硬链接文件,整个文件会真正的被删除;
  • 很多硬件设备的快照功能,都是利用了硬链接的原理;
  • 源文件和硬链接文件具有相同的索引节点号,可以认为是同一个文件或一个文件的多个入口;

源文件和软链接文件索引点号不同,是不同的文件,软链接文件相当于源文件的快捷方式,含有源文件的目录指向信息;

关于目录链接的总结

  • 对于目录不可以创建硬链接,但可以创建软连接;
  • 对于目录的软链接是生产场景运维中常用的技巧(例题中有关apache 2.2.17目录指向的简化)
  • 目录的硬链接不能跨越文件系统(从原理可以理解,因为每个文件系统具有独立的Inode编号,每个文件系统的Inode编号可能重合,如何跨文件系统创建硬链接,很有可能造成Inode冲突)
  • 每个目录下面都有一个硬链接“.”号,和上级目录的硬链接“..”

Linux系统中硬链接和软链接的区别

  • 默认不带参数情况下,ln命令创建的是硬链接,带-s参数创建的是软连接
  • 硬链接文件与源文件的Inode节点号相同,而软链接文件的inode节点号与源文件不同
  • ln命令不能对目录创建硬链接,但可以创建软链接,对目录的软链接会经常被用到;
  • 删除软链接文件,对源文件及硬链接文件无任何影响;
  • 删除文件的硬链接文件,对源文件及软链接文件无任何影响;
  • 删除链接文件的源文件,对硬链接文件无影响,会导致其软链接失效(红底白字闪烁);
  • 同时删除源文件机器硬链接文件,导致文件才会被真正删除;
  • 很多硬件设备的快照功能,使用的就类似硬链接的原理;
  • 软链接可以跨文件系统,硬链接不可以跨文件系统。

链接知识拓展

1、Linux系统文件的删除原理

Linux系统硬链接和软链接介绍

通过上图可以得知以下几点信息:

  • 文件的删除与软链接无任何关系;
  • 文件是否有进程占用,有一个进程占用文件,则i_count加1,如果进程释放文件,则i_count减1.当i_count为0时,文件被删除了。i_count默认为0;
  • 文件的释放受文件进程控制,当有进程使用这个文件时,删除文件时文件占用的空间无法释放。
  • 文件的硬链接数有一个硬链接i_link加1,减少一个硬链接i_link减1,当i_link为0时,文件就被删除了;
  • 当i_link和i_count都为0时,此时才可以真正删除文件数据,回收空间。