前几天在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. js中java式的类成员

    function Range(from,to,x){ //实例(对象)字段 this.x=x; } //类字段 Range.Y="类字段"; //类方法 Range.s=funct ...

  2. 【转载】 Java 7之基础 - 强引用、弱引用、软引用、虚引用

    原文地址:http://blog.csdn.net/mazhimazh/article/details/19752475 1.强引用(StrongReference) 强引用是使用最普遍的引用.如果一 ...

  3. ROS->The Official Tutorial

    系统安装 我的使用环境是Ubuntu 16.04LTS 32bit # deb cdrom:[Ubuntu 16.04 LTS _Xenial Xerus_ - Release amd64 (2016 ...

  4. Spring中javaMail通过SMTP发送邮件

    public final class Emails { /** The java mail sender. */ private static JavaMailSender javaMailSende ...

  5. SQL 导出表结构到Excel

    SQL 导出表结构到Excel SELECT 表名 then d.name else '' end, 表说明 then isnull(f.value,'') else '' end, 字段序号 = a ...

  6. My Demo Reels

    Some elementary algorithms about discrete differential geometry http://www.cnblogs.com/yaoyansi/p/56 ...

  7. storm基础系列之二----zookeeper的作用

    在storm集群中,我们常常使用zookeeper作为协调者.那么具体发挥的是什么作用呢? 概括来说,zookeeper是nimbus和supervisor进行交互的中介.具体来说有二: 1.nimb ...

  8. es6 const

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  9. [MySQL] 高可用架构MMM简单介绍

    一.来源及原理: 众所周知,MySQL自身提供了AB复制(主从复制),然后可以很轻松实现master-master双向复制,同时再为其中一个Master节点搭建一个Slave库. 这样就实现了MySQ ...

  10. udacity google deep learning 学习笔记

    1.为什么要在卷积网络中加入pooling(池化) 如果只利用卷积操作来减少feature map的大小,会失去很多信息.所以想到一种方法,减小卷积时的stride,留下大部分信息,通过池化来减小fe ...