软硬链接

时间:2024-10-09 10:15:59

操作与现象

仔细观察,现在的 link 目录下只有以下两个文件

在这里插入图片描述

接下来进行 软硬链接

软链接

执行以下 命令

ln -s file_target1.txt file_soft.link

运行 ll -i 命令,如下图 结果

在这里插入图片描述

硬链接

执行以下 命令

ln file_target2.txt file_hard.link

运行 ll -i 命令,如下图 结果

在这里插入图片描述

解释

注意观察上述 软硬链接 现象的结果:

  • 软链接 后,第一列的 inode number 都是不一样的;但在 硬链接 后,相关联的两个文件 inode number 似乎都一样,所以:

    • 软链接是一个独立的文件,因为 file_target1.txtfile_soft.link 具有独立的 inode number ,所以 软链接文件类型l (表示 link
    • 硬链接不是一个独立的文件,因为 file_target2.txtfile_hard.linkinode number 都是 2491846 ,所以 file_hard.link不是一个独立的文件,而是使用目标文件的 inode
  • 仔细观察第三列的数字,居然有变成 2 的文件

    • 其实这一列数字被叫做 硬链接数

软链接

软链接的内容目标文件所对应的路径字符串 ;未来我们要找到一个文件可以通过 软链接 的方式,也就是说,如果现在我们往文件 file_target1.txt 里写数据,也是可以通过 file_soft.link 查看的:

[exercise@localhost link]$ echo "Hello soft link" > file_target1.txt
[exercise@localhost link]$ cat file_soft.link
Hello soft link
[exercise@localhost link]$ 

所以 软链接 特别像 Windows 系统下的快捷方式 ;而 软链接 的删除是不会影响目标文件的,所以多少人在刚接触电脑时卸载软件是直接将快捷方式拖进回收站的呢 ^ ^

软链接 依附于目标文件,是一种依附关系,但它自己和目标文件是两个不同的文件;如果现在删除文件 file_target1.txt ,虽然文件 file_soft.link 还是存在的,只是此时的 软链接 没有了依附对象,根本没用:

在这里插入图片描述

所以你现在可以直接为系统里的某个可执行程序创建 软链接快捷方式),运行起来嘎嘎简单(运行 软链接 的格式还是一样的,路径必须要带上

硬链接

上面说 硬链接 不是一个独立的文件,那 硬链接 是什么?

某些操作上和 软链接 一样,往 file_target2.txt 写数据后,查看 file_hard.link 也可以看到一模一样的数据,这也可以理解,毕竟人家的 inode number 和目标文件是一样的

可是某些又不一样,比如我现在直接把文件 file_target2.txt 删除,会发现文件 file_hard.link 好好的,啥事也没有,你查看它和之前的结果是一样的

所以 硬链接操作 的现象图片里,被称作 硬链接数 的数字 本质上是个引用计数

啊那就明白了呀!那 硬链接 的本质就是:一个文件名和inode 编号的映射关系 ;而 建立硬链接 ,就是 在指定目录下添加一个新的文件名和inode number 的映射关系

所以 硬链接 根本就没创建新文件啊,只是将已存在的文件,再次取个别名;而这时候定然存在 引用计数 来表示有几个 文件名 正在和 同一个inode number 进行映射,显然此 引用计数 就是 硬链接数 啊!

那么上面的现象也就好解释咯

作用

硬链接 有什么用呢?

先看下面的场景:
如果新创建一个 普通文件,那它的 硬链接数 一定是 1 ,毋庸置疑;那如果是 目录文件 呢?硬链接数 就是 2 ,为什么?

在这里插入图片描述

因为任何目录下都存在 ... 目录,新创建的 dir 也不例外,而此时的 dir 目录里就有 . 目录,和 dir 映射同一个 inode number ,所以硬链接数就是 2

运行如下指令查看 . 目录和 dir 目录的 inode number 是否一样:

ll dir -ai

所以啊,第一个作用构建 Linux 的路径结构,让我们可以使用. .. 来进行路径定位

这里 硬链接 是系统为目录建立的,但我们用户是无法使用 ln 命令手动为目录创建 硬链接

其实倒也可以理解,是为了避免形成 路径环绕 ,万一在哪一级子目录下 硬链接根目录 / ,那使用 tree 命令一定会造成死循环,也就是 路径环绕

当然啦,第二个作用就是 文件备份