首页 > 代码库 > linux系统下的软连接与硬链接

linux系统下的软连接与硬链接

  前几天在linux系统下安装mongoDB,然后运行脚本导入数据的时候遇到了链接库查询不到的情况,如图 1所示。当时是通过创建软连接的方式解决的这个问题。虽然,通过网上的教程解决了这个问题,但是对于软连接和硬链接始终不是很明白。趁着周末的时间补补课,将软连接和硬链接的概念、特点以及创建的限制系统的学习一下。

技术分享

图 1 缺少文件的提示

  Linux下的连接文件分为两种,一种是类似于windows的快捷方式的软连接,另一种是就是通常所说的硬链接。这两种链接方式都是为了实现文件的共享而存在的。下面根据自己的理解做一个介绍,如果有不对的地方,欢迎大家批评指正。

  在介绍硬链接和软连接之前,首先说明一下linux系统的对于文件的设置。文件都是有文件名和文件中存储的数据组成的,这在linux上被分成两个部分:用户数据部分和元数据部分。用户数据就是文件数据块,记录着文件中真实的内容;元数据包含的是文件的附加属性,如,文件的大小、创建时间、所有者信息、所属的组等。在Linux中用户数据的内容是通过元数据中的inode标识的,也就是说inode号才是文件的唯一标识,而不是文件名。文件名只是为了使用者的记忆和使用的方便,用户可以通过文件名得到对应的inode号码,系统或者程序通过inode号寻找正确的文件数据块,如图2所示。

 技术分享

图 2 文件系统设置

  一、硬链接

  在硬链接下一个inode一般对应多个而文件名,可以通过link或者是ln创建,其本质是在某个目录文件下创建一个文件名链接到某个inode号码的关联记录而已,如图3所示。其有以下特点:

  1. 硬链接具有相同的inode和data,如图4;
  2. 只能对已经存在的文件创立硬链接,而不能对不存在的文件创建硬链接,如图5;
  3. 只能对文件创建硬链接,不能对目录创建硬链接,如图6;
  4. 由于linux系统将不同的文件分类存放在不同的目录系统下,因此不能对不同的文件文件系统交叉建立硬链接,如图7;
  5. 由于硬链接是不同的文件引用相同的inode和data,因此删除一个硬链接不会导致inode和data的消失;只有当所有的链接到这个inode的链接都被删除的时候,最终的data才会被删除;也就是说不同的硬链接彼此之间不相互影响;这种引用的方式类似于智能指针的应用;

技术分享

图 3 硬链接

技术分享

图 4 硬链接相同的inode

技术分享 

图 5 创建不存在的文件的链接

技术分享

图 6 创建目录的硬链接失败的情况

 技术分享

图 7 不同设备之间创建硬链接

  二、软连接

  和硬连接不同,软连接一般存放的是另一文件的目录名的指向(即另一个文件的路径),而不是具有的inode值。因此软连接有着自己的inode的data,这个inod的值是可以和要指向的文件具有的inode值具有相同的值的(如果软连接和所指向的文件具有不同的文件系统),如图8所示。基于上述对于软链接的定义,可以得到软链接的定义如下:

  1. 软链接具有自己的元数据和用户数据;
  2. 可以对不存在的文件创建软链接,甚至可以对文件夹创建软连接;如果对不存在的文件创建软链接,则最终该软链接称为死链接,如果后来创建了该软链接指向的文件,那么该软链接将不再是死链接,如图9所示;
  3. 因为软链接是中的用户数据是另一个文件的路径,因此如果该被指向的文件被删除,那么该链接失效,成为死链接,如下图用红色表示;
  4. 软链接可以交叉文件系统创建,因此软链接的inode和指向的文件的inode可以具有相同的值,可以通过find / -inum xxxx找出具有相同的inod值得文件;

技术分享

图 8 软连接

技术分享

图 9 软连接测试用例

  总结:

  链接机制可以减少不必要文件的重复存在,减轻磁盘的压力。

linux系统下的软连接与硬链接