操作与现象
仔细观察,现在的 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.txt
和file_soft.link
具有独立的inode number
,所以 软链接 的 文件类型 是l
(表示link
) -
硬链接不是一个独立的文件,因为
file_target2.txt
和file_hard.link
的inode 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
命令一定会造成死循环,也就是 路径环绕
当然啦,第二个作用就是 文件备份 咯