Linux 中的软链接和硬链接

前言

在 linux 中,硬链接(hard link)和软链接(symbolic link)是两个非常重要的概念,以前上课的时候听老师讲过这两个概念结果后来给忘了。这篇文章将通过实例,加深我们对这两个概念的印象。

了解 inode

在理解软/硬链接之前,我们必需了解一下, linux 里面 存储文件 的方式。

对于 linux 有一定了解的朋友都知道 linux 里面有一个重要的概念叫做 i 结点,即 inode。

当文件存储在硬盘上,硬盘的最小存储单位叫做 扇区(Sector)。每个扇区储存 512 字节(即 0.5KB )。有人会问,平时讨论文件存储的时候总是说的 (test)又是啥?

实际上,扇区是硬盘的概念,我们的操作系统把扇区的概念透明化,因为这个单位实在太小了,也太过具体不够抽象。因此操作系统引入了块的概念,块,实际上就是连续的多个扇区。

读取硬盘的时候,操作系统不会一个个扇区的读取,这样效率太低,一次性连续读取多个扇区,即一次性读取一个块。这种由多个扇区组成的“块”,是操作系统层面上文件存取的最小单位。块的大小,最常见的是4KB,可以简单的理解为连续八个 sector 组成一个 test。

那么既然文件数据都储存在块中,我们明白了文件存储的方式,如何管理已经存储好的文件呢?

文件存储、文件读取是相对而言非常慢的操作,好的操作系统必然会寻找加快这些操作的方法。我们知道在数据库中有索引的概念,可以很好的提升查询速度。那么不如给每个文件加上索引?最好顺便能把文件信息也放一起好了!

这种储存文件元信息的区域就叫做 inode ,也叫 索引节点

每一个文件都会有对应的 inode ,每个 inode 里面包含了与该文件有关的一些信息,如文件的创建者、文件的创建日期、文件的大小、权限等等。

了解软硬链接

接下来,我们动手实践一下,去观察观察:

首先,我们建立一个源文件 test,再建立两个硬链接和一个软链接文件

1
2
3
4
5
6
7
8
9
$ touch test

$ ln test test-hd1

$ ln test test-hd2

$ ln -s test test-soft

$ ls -li

结果如下图:

图一

我们仔细观察一下发现,test-hd1,test-hd2,test 拥有一样的 i 结点(显示结果的第一列,即 529565)。而 test-soft 拥有另外一个独立的 i 结点。

所以,我们可以发现,建立的硬链接实际上指向的文件地址和我们的源文件是一样的,可以理解源文件本身就是一个硬链接。而软链接则是重新建立了一个独立的文件。

可以这样理解,硬链接就是一个文件的别名/引用(本身大小为 0,因为不会建立 inode 进行存储),指向我们建立的文件。一旦所有指向文件的硬链接都被删除,系统会把这个文件当作垃圾回收掉。

那么软链接如何理解?

软链接可以理解为 win 下的快捷方式。它是一个指针,指向我们建立的文件,但是系统不会因为我们删除了软链接就清除源文件。

软硬链接还有如下区别:

  • 软链接可以跨文件系统,硬链接不可以;
  • 软链接可以对一个不存在的文件名(filename)进行链接(当然此时如果你vi这个软链接文件,linux会自动新建一个文件名为filename的文件),硬链接不可以(其文件必须存在,inode必须存在);
  • 软链接可以对目录进行连接,硬链接不可以。两种链接都可以通过命令 ln 来创建。
  • ln 默认创建的是硬链接。使用 -s 开关可以创建软链接