美文网首页Java相关互联网技术内功修炼Linux
5分钟让你明白“软链接”和“硬链接”的区别

5分钟让你明白“软链接”和“硬链接”的区别

作者: Cyandev | 来源:发表于2016-07-08 18:00 被阅读28782次

今天在知乎上看到一篇十分有趣的问题:
如何评价微软高级工程师痴迷于soft link这一linux常见概念?

虽然又是知名撕逼王曾某的撕逼帖,但是我还是想就题目中链接的问题简单地讲讲。

什么是链接?

链接简单说实际上是一种文件共享的方式,是 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

25869085 -rw-r--r--  2 unixzii  staff  27  7  8 17:39 hard
25869085 -rw-r--r--  2 unixzii  staff  27  7  8 17:39 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

25869085 -rw-r--r--  2 unixzii  staff  36  7  8 17:45 hard
25869085 -rw-r--r--  2 unixzii  staff  36  7  8 17:45 myfile
25869216 lrwxr-xr-x  1 unixzii  staff   6  7  8 17:47 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 都指向同一个文件在硬盘中的区块
  • 软链接: 保存了其代表的文件的绝对路径,是另外一种文件,在硬盘上有独立的区块,访问时替换自身路径。

相关文章

  • 链接文件

    ln 软链接和硬链接的区别

  • 软链接和硬链接的区别

    在Linux上,一个文件被分为两部分(如图一):用户数据 (user data) 与元数据 (metadata)。...

  • M. linux之软链接和硬链接

    1.对文件创建软链接 2.对文件创建硬链接 软链接硬链接复制的区别 1.硬链接实际上是为文件建一个别名,链接文件和...

  • 经典问题

    1. 软链接和硬链接特性及区别 Linux链接分两种,一种被称为硬链接(Hard Link),另一种被称为软链接,...

  • Linux硬链接和软链接的区别

    不可以对目录做硬链接,可以对目录做软链接 软链接可以跨文件系统,硬链接不能跨文件系统 硬链接文件名称指向源文件的i...

  • 5分钟让你明白“软链接”和“硬链接”的区别

    今天在知乎上看到一篇十分有趣的问题:如何评价微软高级工程师痴迷于soft link这一linux常见概念? 虽然又...

  • 硬链接与软链接区别

    硬链接与软链接区别: 文件都有文件名与数据,这在 Linux 上被分成两个部分:用户数据 (user data) ...

  • 简谈linux中软链接和硬链接的区别

    linux中软链接和硬链接的区别: 在linux系统中,链接分为2种:一种被称为硬链接(Hard Link),另一...

  • 硬链接和软链接

    最近的一个项目,做的是开发者平台文件的下载。业务本身没有什么技术难度,但就在项目测试过程中发现,iOS 平台部分文...

  • 软链接和硬链接

    修改硬链接会影响源文件的内容,也会影响软链接的内容;修改源文件也会影响硬链接和软链接; 删除源文件,输入命令:ll...

网友评论

  • 陌小喵喵:挺好的,一边看一边自己试,比较容易理解
  • lesliefang:硬链接是指针,所有的硬链接都是指向同一个磁盘块。 删除一个指针不会真正删除文件,只有把所有的指针都删除才会真正删除文件。 软连接是另外一种类型的文件,保存的是它指向文件的全路径, 访问时会替换成绝对路径
  • YiQinGuo:硬链接会导致机器的io增加吗
  • 0d234c599cd0:软连接就是window中常说的快捷方式。
  • mukekeheart:mark一下
  • AugustHarris:一看就是makedown编辑的😬
  • 5e32342cbab1:基础不够,不是特别理解。😄

本文标题:5分钟让你明白“软链接”和“硬链接”的区别

本文链接:https://www.haomeiwen.com/subject/bwlrjttx.html