硬链接和软链接

什么是“链接” ?

记得 2008 年刚接触 windows 的时候,我“卸载”软件都是这么干的 => 将桌面上软件的图标移动到回收站,清空回收站,然后我就觉得软件已经被我卸载了

现在看来,当时的我只是删除了 windows 上应用软件的一个快捷方式而已,并没有将软件真正从我的电脑上卸载

而那时被我删掉的快捷方式就是“链接”的一种实现,显然,“链接”这种东西早就被应用在了计算机中,在我们的生活中扮演着不可或缺的角色

所以,你可以将“链接”狭义地理解成 windows 上的快捷方式,但接下来对“链接”的用途做更多的阐述

当用户独占计算机,经常用“链接”干什么 ?

这里讲的是大多数普通人在日常使用场景中会有意无意使用“链接”的情况

对于 windows 用户

  • 快捷方式就是“链接”的一种实现,我们可以在一个容易找到的地方(比如桌面)创建应用的快捷方式来方便我们快速启动应用程序,而不是每次都逐层目录寻找应用程序到底在哪

对于 linux 用户 和 macOS 用户

  • 和在 windows 中给应用程序创建快捷方式类似,我们通常会在一个容易被找到的目录中给一些目录层次较深的文件创建“链接”,以此方便我们的访问
  • 除此以外,我们还经常使用“链接”处理一些库的版本兼容性的问题

上述提到的链接,均指软链接(也称符号链接 symblic_link),在 linux 中链接的常见用法如下

image-20210922102919472

为什么需要有“链接”这种功能 ?

  1. 首先你得知道,同一个操作系统是允许多个用户同时接入共享使用的

    从“分时操作系统”时代起,就已经开始支持多用户宏观同时微观分时地访问操作系统了,就是说一个操作系统可以有多个用户,这些用户可以共享地使用计算机中的资源,甚至他们可以同时接入操作系统

    多用户同时接入操作系统时,尽管我们感觉上像是自己独占整个系统但其实并不是(比如同一个 windows 上超级管理员和普通用户可以同时登入只不过系统微观上分时服务罢了)

    听不懂也不没关系,有一个视频很形象,就是

  2. 其次你还得知道,什么叫共享

    共享和文件复制是不一样的,用户共享文件意味着只有一份文件

    比如系统中有一份独一无二的文件,用户 A 对其拥有读写权限,用户 B 对其也拥有读写权限,就说这两个用户共享该文件

    一旦用户 A 修改了该文件的数据,那么用户 B 也可以看到文件数据的变化

  3. “链接”是为了让文件共享更安全而实现的,如果没有链接这种功能

    举个例子,你家两个孩子,你有一个弟弟,但是你家家境普通,父母只能给你俩买一台电脑,只有你爹能用电脑上的管理员帐号,他给你俩一人开了个普通用户帐号

    期末复习周,你爹拷了一份往年试卷放到了电脑中让你俩共享,你弟登入电脑一看,我去!这么多卷子,不写!哐哧你弟就给删了,假如没有“链接”这种东西,晚上你登你帐号还能看到卷子吗?不能!

  4. 但实际情况是卷子并没有被真正删除,虽然你弟看不到卷子且承担着可能挨打的风险但你依然可以看到卷子,这正是因为操作系统在实现文件共享功能的时候,为了防止共享文件被某个用户误删除,实现了“链接”的功能和基于“链接”的文件共享方式,链接分为“软链接”和“硬链接”

什么是硬链接,什么是软链接 ?

节选自王道-操作系统

image-20210922163152322

image-20210922163606353

image-20210922164024964

软链接和硬链接的异同

首先明确:由于用软链接的方式访问共享文件时需要查询多级目录,所以就会产生多次磁盘 I/O,因此理论上用软链接访问文件速度更慢

1
2
3
4
5
6
# 这里我们比较文件使用如下命令

ls -li

# -l, --long display extended file metadata as a table
# -i, --inode list each file's inode number

我们先创建一个普通文件,然后给该文件创建一个硬链接,看看区别

image-20210922172127580

hard.txt 和 src.txt 的 inode 值一样,都为 19407417,说明了它们指向物理磁盘中的同一个区块(同一索引节点)

且二者文件类型和权限完全相同

image-20210922172515608

image-20210922174914922

到此为止,已经印证了硬链接(基于索引节点的共享方式)的原理

接下来我们进行第二个实验:我们创建一个普通文件,然后给该文件创建一个软链接,看看区别

image-20210922175147752

现在我们很清楚地看到,软链接确实是 Link 类型的文件,权限为 777,且指向 src.txt

接下来我们再创建一个硬链接,并尝试删除 src.txt

image-20210922175705326

硬链接仍然有效,符合预期;软连接是一种新类型的文件(Link 类型)保存着它所指向文件的全路径,访问时会替换成绝对路径,我们 rm 掉了 src.txt 自然用软链接就找不到该文件

我们再向这个软链接写点东西(将这个软链接替换后的绝对路径文件创建出来)

image-20210922180847712

看吧,src.txt 又出现了,成功印证软链接访问时会替换成绝对路径的想法

image-20210922181433398

image-20220504155523985

(完)