题引:
昨天心血来潮的写了一篇有关vue中使用pnpm的排雷方法。发现对pnpm中软链接和硬链接的理解还是不是那么深刻。在此情况下,于是花了半天的时候查询了相关的资料。以下是自己的理解,期间会用前端的知识表达哈哈哈。
解答:
当我们使用操作系统时,不管是Linux还是Window等,都会涉及到 硬链接(hard link) 和 软链接( symbolic link)。当然,我们不是非了解不可,但不能不满足自己的好奇心(来源于pnpm)。
1.什么是软链接?
可以理解为Window的快捷方式,当给文件创建一个快速的访问路径时,该文件依赖于源文件。当该源文件被删除时,该链接不可用。
graph TD
软链接 --> 源文件
当源文件被删除时,软链接可以理解为null,则失去作用。
1.1.软链接的特点
- 可以应用于目录
- 可以跨文件系统
- 有自己的索引节点(inode)号
- 权限无关紧要
- 大小为指定的绝对路径所包含的字符总数
1.2.如何实现软链接
因为实际有限,只展示Window系统的操作。 在这之前需要先说一下 mklink 这个命令
C:\Users\QD>mklink
创建符号链接。
MKLINK [[/D] | [/H] | [/J]] Link Target
/D 创建目录符号链接。默认为文件
符号链接。
/H 创建硬链接而非符号链接。
/J 创建目录联接。
Link 指定新的符号链接名称。
Target 指定新链接引用的路径
(相对或绝对)。
基于上面的代码命令,我们将会用到 /D 这个命令。下面我将创建一个文件file,并将他软链接到file1
C:\Users\QD>mkdir file
//因为是同个路径,所以省略。如果需要跨盘,则要填写绝对路径
C:\Users\QD>mklink /D file1 file
为 file1 <<===>> file 创建的符号链接
命令敲完之后,我们会发现该目录生成了一个file文件及对应的file1快捷文件
软链接成功后,软链接文件和源文件都是 双向绑定 的,即两者是同步更新的。但是相对源文件来说,软链接文件的占用空间更小,因此我们可以利用该功能清理C盘较大的文件,把文件移动到其他盘,再软链接回C盘,是不会影响使用的。
1.3.作用
- 实现低内存的快捷方式
- 清理C盘空间
- ......
2.什么是硬链接?
相比软链接,硬链接是比较复杂。因为在操作系统的文件系统中,保存在磁盘分区的文件不管是什么类型都会给它分配一个 唯一标识(编号)。由于Window未开源的原因,可以明确知道在Linux称为 索引节点(inode index),因此我们也先暂用该概念来使用。当多个文件名指向同一个索引节点时,这可以被理解成是硬链接。硬链接的作用是允许一个文件(索引节点)拥有多个引用路径(被多次引用)。因此即使源文件被删除了,也不会影响通过硬链接产生的文件使用。因为删除只是切断自身对索引节点的链接。就像在JavaScript中,一个对象内存栈可以被多次引用,即使初始的对象赋值为null,该对象的引用依然存在,直到该对象的内存栈没有引用时,GC(Garbage Collection)才会对其回收。
graph TD
源文件 --> 索引节点
硬链接1 --> 索引节点
硬链接2 --> 索引节点
2.1.硬链接的特点
- 以文件副本的形式存在,但不占用实际空间
- 不允许给目录创建硬链接(文件夹不可硬链接)
- 硬链接只能在同一个文件系统中才能创建
- 删除其中一个硬链接或者源文件并不会影响其他硬链接的使用
2.2.如何实现硬链接
软连接的命令行是 /D,而硬链接的是 /H。本地已经创好test.txt,直接拿来使用
C:\Users\QD\file1>mklink /H test1.txt test.txt
为 test1.txt <<===>> test.txt 创建了硬链接
C:\Users\QD\file1>mklink /H test2.txt test1.txt
为 test2.txt <<===>> test1.txt 创建了硬链接
通过硬链接,也是和软链接一样保持着双向数据更新绑定的。
2.3.作用
- 在多用户的操作系统里,对数据做一个硬链接,利用硬链接的同步更新,就可以防止别人误删你的源文件了
- 硬链接桌面上明显的游戏数据,被女朋友删了还能玩
- ......
3.两者的区别
除了两者使用特点的不同之外,对于删除产生的副作用影响是两者最大的区分了。在软链接中,源文件删除之后所有的软链接都会失效;在硬链接中,只要文件的索引节点引用不为空,则不会影响使用。