前几天在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系统下的软连接与硬链接的更多相关文章

  1. Linux下的软连接和硬链接

    由于教学上的原因,需要下载Android源码,后来使用repo时,系统提示需要python2,我的系统中是两个都有的,但是默认是python3,无法下载,通过创建了个链接搞定,下面就来说说linux下 ...

  2. 认识Linux系统中的inode,硬链接和软链接

    在学习和创建软链接遇到了一点问题,总结一下: 在当前文件夹下面建立了两个临时文件夹tempdir1和tempdir2,然后在tempdir2里面创建了一个hello文件,然后用指令ln -s temp ...

  3. 【linux命令】软连接和硬链接的区别(ln命令)

    Linux 文件系统把硬盘分为三个部分:超级块.inode 列表.数据区 inode 指示:该文件的数据存放在数据区的哪些块内.因为这个“映射”关系不能变更,因此,inode 相当于代表着文件本身.( ...

  4. Linux链接文件——软连接和硬链接

    Linux链接文件——软连接和硬链接 摘要:本文主要介绍了Linux系统中的链接文件. 文件系统 在Linux系统中,将文件分为两个部分:用户数据和元数据. 元数据(inode) 元数据即文件的索引节 ...

  5. linux中软连接和硬链接的区别

    linux中创建软连接和硬链接的方法: 软连接: ln -s oldfile slink 硬连接: ln oldfile hlink linux中创建软连接和硬链接的区别:        原理上,硬链 ...

  6. Linux的软连接、硬链接和find命令

    软链接和硬链接 序号 命令 作用 01 ln –s 被链接的源文件 链接文件 建立文件的软连接,用通俗的是方式类似于Windows下的快捷链接 源文件连接要是有绝对路径,不能使用相对路径,这样可以方便 ...

  7. 深入理解linux系统下proc文件系统内容

    深入理解linux系统下proc文件系统内容 内容摘要:Linux系统上的/proc目录是一种文件系统,即proc文件系统. Linux系统上的/proc目录是一种文件系统,即proc文件系统.与其它 ...

  8. Centos 软连接和硬链接

    1.软链接: 建立软链接:ln -s /usr/local/node-v4.2.6-linux-x86/bin/node /usr/local/bin/node 解释:将/usr/local/node ...

  9. Linux系统下Apache2.4.17的安装过程

    Linux系统下安装Apache Server2.4.17.还是先声明一下,Linux命令我不进行讲解,因为我不是讲Linux命令的.有需要注意的地方,我会上图,没什么值得的注意的地方,我就不上图了. ...

随机推荐

  1. C#防止反编译

    http://blog.csdn.net/wangpei421/article/details/42393095 http://www.cnblogs.com/tianguook/archive/20 ...

  2. JSON.stringify 在OA差旅中转换为字符串传给后端,(使用from表单的形式)

    $('#bookForm').find('#formData').val(transInfo.fromData).end().submit(); 这里的val()中的transInfo.fromDat ...

  3. mysql 序列与pg序列的比较

    mysql序列(这里只谈innodb引擎): 在使用mysql的AUTO_INCREMENT时,使用AUTO_INCREMENT的字段必须建有索引,也可以为索引的一部分.当没有索引时会报错:      ...

  4. Reed-Solomon码,QR

    原文: Reed–Solomon codes for coders参考: AN2407.pdfWIKI: 里德-所罗门码实现:Pypi ReedSolo #译注:最近看到了RS码,发现还挺有意思的,找 ...

  5. Android studio 快捷键(Mac)

    @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...

  6. 怎样让SoapHttpClientProtocol不使用系统默认代理

    方法很简单,但找起来很难. 使用SoapHttpClientProtocol类的Proxy属性. 不能设空值,必须设一个新值. 赶脚底层在链接的时候会判断这个属性是不是null,如果null就会用默认 ...

  7. C#Random函数在循环中每次获取一样的值

    首先需要了解一点Random函数的随机生成是和当前时间有关系,如果在短时间生成随机数,就会导致随机数生成出来是相同的. 不过我们可以在每次随机时指定一个Seed种子值,这样在循环里就可以每次获取不一样 ...

  8. PowerProfile.java与power_profile.xml

    转载自http://blog.csdn.net/green1900/article/details/42427871 现在诸多关于电池管理的应用做的极其绚烂,可实现如耗电应用排行.剩余时间计算.关闭耗 ...

  9. 【学】ECMA6的新特性1

    ECMA6的新特性1 let特性: 1.不允许重复声明 2.没有预解析 3.块级作用域 一对{}包括的区域称为代码块 块级作用域指一个变量或者函数只在该区域才起作用. 例1: console.log( ...

  10. 在Eclipse中使用JUnit4进行单元测试(初级篇)

    首先,我们来一个傻瓜式速成教程,不要问为什么,Follow Me,先来体验一下单元测试的快感! 首先新建一个项目叫JUnit_Test,我们编写一个Calculator类,这是一个能够简单实现加减乘除 ...