什么是链接?

链接简单说实际上是一种文件共享的方式,是 POSIX 中的概念,主流文件系统都支持链接文件。

它是用来干什么的?

你可以将链接简单地理解为 Windows 中常见的快捷方式(或是 OS X 中的替身),Linux 中常用它来解决一些库版本的问题,通常也会将一些目录层次较深的文件链接到一个更易访问的目录中。在这些用途上,我们通常会使用到软链接(也称符号链接)。

软链接和硬链接的区别是?

下面我们进入正题,来探讨一下软硬两种链接到底有什么区别?

首先,从使用的角度讲,两者没有任何区别,都与正常的文件访问方式一样,支持读写,如果是可执行文件的话也可以直接执行。

那区别在哪呢?在底层的原理上。

为了解释清楚,我们首先在自己的一个工作目录下创建一个文件,然后对这个文件进行链接的创建:

$ touch myfile && echo "This is a plain text file." > myfile
$ cat myfile This is a plain text file.

现在我们创建了一个普通地不能再普通的文件了。然后我们对它创建一个硬链接,并查看一下当前目录:

$ ln myfile hard
$ ls -li -rw-r--r-- unixzii staff : hard
-rw-r--r-- unixzii staff : myfile

ls 结果的最左边一列,是文件的 inode 值,你可以简单把它想成 C 语言中的指针。它指向了物理硬盘的一个区块,事实上文件系统会维护一个引用计数,只要有文件指向这个区块,它就不会从硬盘上消失。

你也看到了,这两个文件就如同一个文件一样,inode 值相同,都指向同一个区块。

然后我们修改一下刚才创建的 hard 链接文件:

$ echo "New line" >> hard
$ cat myfile This is a plain text file.
New line

可以看到,这两个文件果真就是一个文件。
下面我们看看软链接(也就是符号链接)和它有什么区别。

$ ln -s myfile soft
$ ls -li -rw-r--r-- unixzii staff : hard
-rw-r--r-- unixzii staff : myfile
lrwxr-xr-x unixzii staff : soft -> myfile

诶,你会发现,这个软链接的 inode 竟然不一样啊,并且它的文件属性上也有一个 l 的 flag,这就说明它与之前我们创建的两个文件根本不是一个类型。

下面我们试着删除 myfile 文件,然后分别输出软硬链接的文件内容:

$ rm myfile
$ cat hard This is a plain text file.
New line
$ cat soft cat: soft: No such file or directory

之前的硬链接没有丝毫地影响,因为它 inode 所指向的区块由于有一个硬链接在指向它,所以这个区块仍然有效,并且可以访问到。

然而软链接的 inode 所指向的内容实际上是保存了一个绝对路径,当用户访问这个文件时,系统会自动将其替换成其所指的文件路径,然而这个文件已经被删除了,所以自然就会显示无法找到该文件了。

为验证这一猜想,我们再向这个软链接写点东西:

$ echo "Something" >> soft

$ ls hard myfile soft

可以看到,刚才删除的 myfile 文件竟然又出现了!这就说明,当我们写入访问软链接时,系统自动将其路径替换为其所代表的绝对路径,并直接访问那个路径了。

总结

到这里我们其实可以总结一下了:

  • 硬链接: 与普通文件没什么不同,inode 都指向同一个文件在硬盘中的区块
  • 软链接: 保存了其代表的文件的绝对路径,是另外一种文件,在硬盘上有独立的区块,访问时替换自身路径。

 

Linux之软链接与硬链接的更多相关文章

  1. Windows和Linux创建软链接和硬链接

    1.Wondows创建软链接和硬链接 mklink [/d] [/h] link target /d--创建目录软链接:默认为文件软链接:创建目录链接时必须使用该选项不然创出的软链接无效 /h--创建 ...

  2. [转帖]Linux 下软链接和硬链接的区别

    Linux 下软链接和硬链接的区别 http://os.51cto.com/art/201911/605267.htm 软连接 文件是小的 只是一个链接 删除和其他处理不影响 原始文件的计数 删除源文 ...

  3. linux中软链接和硬链接的区别与小结

    ln命令 该命令在文件之间创建链接.这种操作实际上是给系统中已有的某个文件指定另外一个可用于访问它的名称.对于这个新的文件名,我们可以为之指定不同的访问权限,以控制对信息的共享和安全性的问题. 如果链 ...

  4. linux下软链接与硬链接及其区别

    linux下创建链接命令 ln -s 软链接 这是linux中一个非常重要命令,请大家一定要熟悉.它的功能是为某一个文件在另外一个位置建立一个不同的链接,这个命令最常用的参数是-s, 具体用法是:ln ...

  5. linux 创建软链接和硬链接

    Linux 系统中有软链接和硬链接两种特殊的“文件”. 软链接可以看作是Windows中的快捷方式,可以让你快速链接到目标档案或目录. 硬链接则透过文件系统的inode来产生新档名,而不是产生新档案. ...

  6. linux文件软链接与硬链接

    1.命令格式: ln [参数][源文件或目录][目标文件或目录] 软链接只会在你选定的位置上生成一个文件的镜像,不会占用磁盘空间. 2.命令功能: Linux文件系统中,有所谓的链接(link),我们 ...

  7. Linux 中软链接和硬链接的使用

    Linux 链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link). 硬链接和软链接 硬链接 --- ln 要链接的文件 新硬链接名 软连接 --- l ...

  8. Linux下软链接与硬链接的区别

    由于下面会说到inode,所以如果没有了解过,请务必搞懂inode的真正含义,厚颜无耻的推荐我的一篇博客:Linux磁盘与文件系统管理 如果我们在系统中新建一个文件,我们看到的文件名实际上只是表面现象 ...

  9. 描述Linux下软链接和硬链接的区别(计时2分钟)

    在linux系统中,链接分两种 :一种被称为硬链接(Hard Link),另一种被称为符号链接或软链接(Symbolic Link). 1)默认不带参数情况下,ln命令创建的是硬链接. 2)硬链接文件 ...

随机推荐

  1. aix 6.1系统怎么安装?这里有详细图文教程

    今年六月,我们公司出现了一次非常严重的数据丢失的事故.生产服务器崩溃导致所有的业务都陷于停滞,而且由于涉及到公司机密又无法贸然到数据恢复公司进行恢复,可是自己又无法解决.权衡利弊还是决定找一家有保密资 ...

  2. linux的脚本应用for循环答应变量

    #!/bin/bash for var in A B C ; do echo "var is $var" done

  3. Java 持久化操作之 --io流与序列化

    1)File类操作文件的属性 1.File类的常用方法 1. 文件的绝对完整路径:getAbsolutePath() 文件名:getName() 文件相对路径:getPath() 文件的上一级目录:g ...

  4. 微信接口(一)创建菜单&自动回复

    刚划拉完微信.做一个笔记这里的数据是写死的,还有一份是通过查询数据库进行自动回复,自定义菜单设置的.不过因为使用到数据库,最好在网站后台吧微信平台开发集成进去.所以代码较多就先不放了.有问题的地方请留 ...

  5. Linux下的Shell编程(2)环境变量和局部变量

    Shell Script是一种弱类型语言,使用变量的时候无需首先声明其类型. 局部变量在本地数据区分配内存进行存储,这个变量归当前的Shell所有,任何子进 程都不能访问本地变量.这些变量与环境变量不 ...

  6. yum 安装Apache

    1.查看是否安装Apache,命令:  rpm    -qa    httpd 2.yum install httpd ,yum安装Apache 3.chkconfig    httpd  on  s ...

  7. Hibernate(四):Hello World

    下载hibernate开发包: 在本章之前需要继承hibernate开发插件到eclipse,详细操作请参考我的博文:<Hibernate(一):安装hibernate插件到eclipse环境& ...

  8. Tensorflow模型加载与保存、Tensorboard简单使用

    先上代码: from __future__ import absolute_import from __future__ import division from __future__ import ...

  9. www的构建技术

    www的构建技术分别是: html超文本标记语言,页面的文本显示 http超文本传输协议,信息传输转移的约定 url统一资源定位符,客户端浏览超文本的地址集合

  10. urllib.request.Request

    import urllib.request #可以将url先构造成一个Request对象,传进urlopen #Request存在的意义是便于在请求的时候传入一些信息,而urlopen则不 reque ...