WHAT - 硬链接 hard link 和软链接 symlink

文章目录

一、建立直觉

  • 硬链接(hard link) :多个"文件名",指向同一个文件内容(inode)
  • 软链接(symbolic link / symlink) :一个"快捷方式",指向另一个路径

二、一个比喻

假设有一本书:

硬链接(Hard Link)

  • 有 3 个书名:

    • 《A》
    • 《B》
    • 《C》
  • 但其实都是同一本实体书

特点:

  • 改任何一本,其他"名字"看到的内容也变
  • 删除一个名字,书还在
  • 必须在同一个"图书馆"(文件系统)

软链接(Symlink)

  • 有一本书《A》
  • 另外有个"快捷卡片"写着:去 A 那里看

特点:

  • 卡片只是指路,不存内容
  • A 被删了 → 卡片就失效(悬空)
  • 可以指向任意位置(跨目录/磁盘)

三、技术层面的本质区别

对比 硬链接 软链接
指向 inode(文件内容) 文件路径
是否占用额外空间 几乎不占 很小(存路径)
删除源文件影响 不影响 链接失效
是否可跨文件系统 不可以 可以
是否可链接目录 一般不允许 可以
inode 是否相同 相同 不同

其中可能不太能理解的是:为什么删除源文件不影响硬链接?

这是因为,在文件系统里,"文件内容"和"文件名"是两件完全不同的东西。

一个文件 ≠ 一个东西,而是两层结构:

文件名(目录项) → inode(真实数据)

举个例子,我们看到 file.txt,但系统里是:

file.txt ─────→ inode#1234 ─────→ 数据(内容)

对于硬链接来说:

bash 复制代码
file.txt  ──┐
            ├──→ inode#1234 → 数据
hard.txt  ──┘

所以,删除所谓的源文件,也只是删除一个"名字",inode 还在,数据就还在。

注意,这个 inode 只有在没有任何引用它时,就会被自动回收,才算做真正被删除。

四、命令

创建硬链接

bash 复制代码
ln file.txt hard.txt

创建软链接

bash 复制代码
ln -s file.txt soft.txt

看区别

bash 复制代码
ls -li

会看到:

  • 硬链接:inode 一样
  • 软链接:inode 不一样,且有箭头

五、pnpm 相关机制

我们都知道 pnpm 很省空间。其实:

pnpm 主要用的是:硬链接 + 软链接组合拳

全局 store(核心存储)

bash 复制代码
~/.pnpm-store/

这里存的是:

唯一一份真实文件

node_modules 结构(关键)

pnpm 不像 npm 那样复制依赖,而是:

第一步:硬链接

把 store 里的包:

bash 复制代码
store/react@18 → node_modules/.pnpm/react@18

用的是 硬链接

所以:

  • 不复制文件
  • 直接复用磁盘数据

第二步:软链接(依赖关系)

再通过 symlink 构建依赖树:

bash 复制代码
node_modules/react → .pnpm/react@18/node_modules/react

用的是 软链接

最终效果

bash 复制代码
node_modules/
  react → symlink
  .pnpm/
    react@18/
      node_modules/
        react (hard link 到 store)

六、为什么要"硬 + 软"一起用

这是个非常精妙的设计。

如果只用硬链接

问题:

  • 无法表达依赖关系
  • node_modules 树结构不好维护

如果只用软链接

问题:

  • 每个文件仍然要存在一份真实数据
  • 不能节省空间

pnpm 的组合优势

目标 技术
节省磁盘 硬链接
构建依赖树 软链接

七、现实开发中的典型场景

场景 1:pnpm / monorepo

  • 节省磁盘
  • 快速安装
  • 多项目共享依赖

场景 2:Docker 镜像优化

  • 多层复用文件
  • 减少镜像体积

(底层也类似 inode 复用思想)

场景 3:本地开发调试包

bash 复制代码
npm link
pnpm link

本质就是:

  • 软链接把本地包接入项目

场景 4:日志 / 配置共享

bash 复制代码
ln -s /var/log/app.log ./log

常见于:

  • 多服务共享文件
  • 快速访问

坑点

1. 删除源文件

bash 复制代码
rm original
  • 硬链接:还在
  • 软链接:坏掉

2. Git 行为

  • Git 不跟踪硬链接关系
  • Git 会记录软链接(路径)

3. 跨磁盘

  • 硬链接:失败
  • 软链接:正常

总结

硬链接 = 共享"内容",软链接 = 共享"路径"。

而 pnpm 的本质是:

用硬链接解决"存储问题",用软链接解决"结构问题"。

相关推荐
cyforkk2 小时前
前端限流实战:从 429 状态码处理到消除“双重报错”
前端·状态模式
陈林梓2 小时前
Qiankun 微前端配置详解
前端
英俊潇洒美少年2 小时前
Vue3 的 JSX 函数组件,每次更新都会重新运行吗?
前端·javascript·vue.js
木斯佳2 小时前
前端八股文面经大全:腾讯前端暑期AI面(2026-03-26)·面经深度解析
前端·人工智能·ai·智能体·暑期实习
invicinble2 小时前
对于一个基本的前端后台管理框架的分析和认识
前端
恋猫de小郭2 小时前
Android 17 新适配要求,各大权限进一步收紧,适配难度提升
android·前端·flutter
高桥凉介发量惊人3 小时前
UI 与交互篇 (3/6):动画体系:隐式动画到自定义动画
前端
cyforkk3 小时前
前端架构实战:当服务器关闭时,如何优雅提示 502 错误?
服务器·前端·架构