软连接 vs. 硬连接

​连接你们都用过,好比 Windows 中的快捷方式就是一种连接,但是 Linux 里又分硬连接和软连接,它们表示什么意思,又有什么区别呢,本文来给你们作一个解释。html

  

Inode 索引节点

 

要想理解硬连接和软连接的区别,首先要明白什么是 Inode。Inode 是 Index node,索引节点的意思。每一个文件都有一个 inode,里边保存着文件的元数据(meta data),包括:inode 号、文件大小、文件全部者、文件权限、文件类型、建立时间、硬连接数等等,除了文件名之外的全部文件信息都存储在这里。它是文件或者目录在一个文件系统中的惟一标识。node

 

查看一个文件的 inode,能够用 stat 命令,或者 ls -i 选项来查看。下面分别用这两个命令来查看一个文件 myfile.txt 的 inode 号为 102171635shell

 

 

和元数据相对应的是用户数据(user data),或者也叫文件数据块(data block),文件的真实内容是存储在这里边的。咱们经过一个文件名能够查到它对应的 inode,再经过 inode 去查看文件的内容。它们之间的关系能够用下面这张图来表示。服务器

 

 

 

硬连接 Hard Links

 

当多个文件名指向同一个 inode 时,这种连接就被称为硬连接。好比像下面的这种状况,咱们为原始文件 myfile.txt 建立了两个连接,hardlink1 和 hardlink2,它们都指向同一个 inode,因此它们都是硬连接。从图中能够看出,硬连接指向的文件内容其实就是原始文件的内容,因此硬连接的做用之一就是能够节省服务器的磁盘空间。spa

 

 

硬连接的另一个做用就是能够防止文件被“误删”。由于 inode 会记录文件硬连接的次数,只有当硬连接等于 0 的时候,才会把存储着文件内容的数据块删除,因此好比我不当心把 myfile.txt 文件删除了,可是 inode 发现还有另外两个硬连接在,因此不会删除掉数据块,经过两个硬连接咱们仍是能够读取到文件内容。3d

 

硬连接能够经过 ln [选项] [源文件] [连接文件] 命令来建立,不过要注意硬连接只能对已经存在的文件进行建立,而且不可以跨文件系统。下面举一个例子来看一下硬连接和源文件的 inode号是否相同,以及删除掉源文件,是否还能够经过硬连接打开原文件。htm

 

首先建立一个文件 myfile.txt,而后分别给它建立两个硬连接 hardlink1 和 hardlink2。经过 ls -li 命令查看它们的 inode 号,发现相同,因此验证了咱们所说的,硬连接和原文件指向同一个 inode 。另外从长列表中,咱们还能够看到 inode 记录的硬连接次数(包括源文件本身),一共是3次。blog

 

 

接下来删除掉文件 myfile.txt,经过 ls -li 命令再看一下,发现 inode 记录的连接次数变成了 2,经过硬连接咱们仍是能够读取原来的文件内容,说明文件内容数据块并无被删除,只有当硬连接次数变为 0 的时候,文件内容才会真正被删掉。索引

 

 

咱们对硬连接的特色进行一下总结:get

1) 硬连接文件都有相同的 inode 和 数据块

2) 删除掉一个硬连接文件,并不会影响 inode 号相同的其余文件,只有当 inode 记录的连接次数为 0 时,数据块才会被真正删除

3) 硬连接只能对已有文件进行建立

4) 硬连接不能跨文件系统建立

5) 普通用户不能对目录进行硬连接建立

 

 

软连接 Soft Links

 

软连接也被称为符号连接(symbolic link)。Linux 中的软连接和 Windows 的快捷方式很是类似。与硬连接的不一样之处在于:

1) 它的 inode 与原文件不一样

2) 它的数据块存储的是原文件的路径

 

咱们用下面这张图来进行一下说明,咱们为 myfile.txt 建立了一个软连接 softlink。能够看出,它的 inode 和 myfile.txt 的 inode 是两个彻底不一样的索引节点,myfile.txt 的数据块记录的是文件的内容,而软连接的数据块记录的是它指向文件的路径。

 

 

软连接的做用之一也是方便文件的管理,好比原文件的路径比较复杂,咱们能够在简单的路径下建立一个软连接,这样比较方便用户访问。可是和硬连接不一样的是,一旦原文件被删除,那么软连接就成了一个“死连接”,指向了一个不存在的文件。

 

 

 

软连接能够用命令 ln -s [源文件名或目录] [软连接文件名] 来进行建立。和硬连接不一样之处在于,对不存在的文件也能够建立软连接,能够跨文件系统,对文件或者目录均可以建立软连接。

 

举一个例子,好比咱们为 myfile.txt 建立一个软连接 softlink。经过 ls -li 命令查看,发现 inode 号彻底不一样,而且 myfile.txt 的连接次数仍是 1,并无增长,说明这里的连接次数是指硬连接,经过软连接咱们能够读取源文件的内容。

 

 

删除原文件,软连接变成了“死连接”,经过它再去读取原来的文件内容,系统已经提示文件不存在了。

 

 

经过上面的实验验证,软连接的特色以下:

1) 软连接和其所指向的文件具备不一样的 inode,而且其数据块存储的内容为其所指向文件的路径

2) 建立软连接,其指向文件的硬连接次数不会增长

3) 删除软连接并不影响原文件,但删掉原文件,软连接会成为一个“死”连接

4) 软连接能够指向文件,也能够指向目录

5) 软连接能够指向不存在的文件或目录

6) 软连接能够跨文件系统建立

 

 

最后

 

无论用软连接仍是硬连接,都不会将原来的文件复制一份,都只是占用了磁盘较小的空间,但它们的原理仍是彻底不同的。本文从 inode 的角度切入,对软连接和硬连接进行了解释。感兴趣的同窗能够对 inode 结构体再作进一步研究,这样可以帮助咱们更好的理解 Linux 的工做原理。

 

 

相关阅读:

《Linux 目录详解》

《虚拟机安装 Linux 最完整攻略》

《Xshell 与 Xftp 的安装与使用》

《Linux,Unix,GNU 到底有什么样的渊源?》

 

 

 

- The End -