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

今天在知乎上看到一篇十分有趣的问题:node

如何评价微软高级工程师痴迷于soft link这一linux常见概念?linux

虽然又是知名撕逼王曾某的撕逼帖,可是我仍是想就题目中连接的问题简单地讲讲。bash

什么是连接?

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

它是用来干什么的?

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

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

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

首先,从使用的角度讲,二者没有任何区别,都与正常的文件访问方式同样,支持读写,若是是可执行文件的话也能够直接执行。指针

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

为了解释清楚,咱们首先在本身的一个工做目录下建立一个文件,而后对这个文件进行连接的建立:get

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

This is a plain text file.复制代码

如今咱们建立了一个普通地不能再普通的文件了。而后咱们对它建立一个硬连接,并查看一下当前目录:string

$ 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 都指向同一个文件在硬盘中的区块
  • 软连接: 保存了其表明的文件的绝对路径,是另一种文件,在硬盘上有独立的区块,访问时替换自身路径。
相关文章
相关标签/搜索