我们有时会遇见或者讨论软链接与硬链接,今天,是时候深入了解他们了。
前置知识扫盲
什么是 inode
inode 可以理解为是文件数据的身份证,一个文件有一个 inode,inode 包含了如文件权限、文件类型、文件大小等重要描述信息。最重要的是,inode 中包含了文件在物理存储空间中的存储地址。
定义介绍
软链接:软链接(又称为符号链接),是一种特殊的文件,它指向另一个文件。我们可以理解为它是一种快捷方式,就像 Windows 系统中的快捷方式一样。
硬链接:硬链接也是一种特殊的文件,它指向文件内容(数据)实际的存储位置。换一种说法,硬链接直接指向硬盘的某个区域。
下面我们分别介绍他们。
硬链接
硬链接也是一个文件,它和原始文件共享信息,这其中也包括 inode 编号。inode 编号相同意味着指向硬盘中的文件数据是相同的。
假如现在有一个 file1,现在创建一个 file1 的硬链接,它是一个新的文件,所以这里记为 file2。现在,file1 与 file2 的关系如下图:
现在,file1 与 file2 指向硬盘的同一区域,也就是说 file1 与 file2 指向的内容是相同的。
优点:
- 节省存储空间:硬链接与源文件共享相同的物理数据块,避免了数据冗余。
- 高效性:硬链接是直接指向数据的节点(
inode),读取和写入速度较快。 - 数据安全性:即使源文件被删除,只要有硬链接存在,数据依然可以通过硬链接访问。 缺点:
- 限制较多:硬链接只能在同一个文件系统中创建,无法跨文件系统。
- 不能链接目录:为了防止循环引用和复杂的文件系统结构,硬链接通常不能链接目录。
- 管理复杂:多个硬链接指向同一个文件时,难以明确文件的真正状态和使用情况。
应用场景
pnpm 依赖硬链接
pnpm 的一大特点就是节省空间,避免了多个相同版本的依赖在多个项目中重复安装的问题。
使用 pnpm 安装项目依赖时,pnpm 会把安装的依赖硬链接到一个统一的文件夹 .pnpm-store,这是为了后面能够复用依赖。当再次使用 pnpm 安装依赖时,如果 .pnpm-store 中存在相同版本的依赖,则直接创建硬链接复用 .pnpm-store 中的依赖。
这样以来,多个项目如果安装同一个依赖,则依赖的源文件只会有一个,大大节省了磁盘空间。同时,由于安装过的依赖不必再次下载,也加快了依赖安装的速度。
软连接
软连接指向的是源文件的地址,软链接与源文件不共享 inode。软链接有自己的 inode 编号,这个 inode 编号指向的存储区域存储到是源文件的地址信息。
假如现在依然有一个 file1,现在又创建了一个 file1 的软链接 file3。现在 file1 与 file3 的关系如下图:
现在,file1 指向的是源文件内容,file3 则指向的是 file2 的地址。
优点:
- 灵活性高:软链接可以跨文件系统创建,也可以指向目录或文件。
- 便于管理:软链接路径明确,便于管理和维护,特别是在文件或目录结构发生变化时。
- 节省空间:软链接本质上只是一个指向目标文件的路径,几乎不占用额外的存储空间。 缺点:
- 性能影响:由于软链接存储的是路径,需要多一步解析路径的过程,因此访问速度可能比硬链接略慢。
- 断链风险:如果软链接的目标文件被删除或移动,软链接会变成“死链接”,导致无法访问。
应用场景
pnpm 基于软链接的依赖结构
pnpm 使用软链接来构建项目的 node_modules 结构,更多更内可以查看 # 基于符号链接的 node_modules 结构
npm link
npm link 是我们在开发一个第三方库的时候经常使用的一个命令。它可以将我们的包文件夹链接到我们的项目中的 node_modules 中,这样我们就可以直接在项目中测试第三方库的代码。
npm link 的本质也是创建软链接。
总结
本文主要介绍了软链接与硬链接的概念及区别。在文件系统中,硬链接和软链接是两种常见的文件管理方式。硬链接和原始文件共享相同的 inode,直接指向文件的数据区域,因此能节省存储空间并提高访问效率。然而,硬链接只能在同一文件系统内创建,并且不能链接目录,管理上也较复杂。相对而言,软链接具有更高的灵活性,能够跨文件系统创建,并且可以链接到目录或文件。尽管软链接在文件系统变化时便于管理且几乎不占用额外存储,但它需要额外的路径解析步骤,访问速度可能稍慢,并且如果目标文件被删除或移动,软链接会变成“死链接”。理解这两者的特点和应用场景,可以帮助我们在不同的需求下做出合适的选择。