硬链接
硬链接其实就是一个文件的别名
我们看到下面这张图
ln t1 hard_link
这个命令表示我们给文件t1创建了一个硬链接hard_link
然后可以看到他们两个指向的inode编号(675970, 最左端的数字)是一样的,说明他们是同一个文件,然后在看到一个数字 2 ,这个数字是硬链接的计数,初始为1,就像是t2一样,它只有一个硬链接,其实就是它本身
在看到这张图,我们先是向t1写入hello, hard_link居然也是hello, 然后我们重新向hard_link写入world, t1也变成了world, 这更说明了他们是同一个文件了
在看到这张图,我们删除了hard_link, 发现t1的硬链接计数变成了1
只有当硬链接的计数变成0时,存储在磁盘上的文件才能够被删除
还需要注意的是仅当关闭所有文件描述符时,方可删除一个已打开的文件,这是因为一个进程打开一个文件,获得到文件描述符时,就已经获得了访问对应inode的能力,即访问磁盘上的文件的能力,所以这时候不能删除这个打开的文件
硬链接的创建和删除
-
命令行创建
ln file hard_link
-
系统调用创建
-
系统调用移除
也可以使用remove()系统调用进行移除,本质上也是个文件
符号链接
符号链接其实就相当于快捷方式
看到下面这张图,我们使用 ln -s t1 symbolic_link
为t1创建了一个符号链接
然后可以看到符号链接指向的是t1, 并且他的inode与t1的不同,说明符号链接也是一个区别于链接目标的文件,独立占有一份空间,不像硬链接,它适合链接目标享有同一份空间
我们在看到下面这张图,我把符号链接移动到另一个目录里,发现符号链接失效了,这说名符号链接无法定义到t1文件了,这是因为我们链接时的路径使用的是相对路径
在看到下面这张图,我们定义符号链接时,用的是绝对路径,然后在把符号链接移动到其他目录,发现符号链接仍然有效
符号链接的创建和删除
-
命令行创建
ln -s file symbolic_link
-
系统调用创建
-
系统调用移除
也可以使用remove()系统调用进行移除,本质上也是个文件
但使用符号链接的路径名作为函数参数时,要注意该函数是否会对符号链接解引用
对比
重要性
-
硬链接:
-
真正的文件指向: 硬链接直接指向文件的 inode,因此它们共享相同的数据块。这意味着,删除任何一个硬链接都不会影响文件的实际内容,除非所有链接都被删除
-
链接计数: 文件的链接计数会随着硬链接的创建和删除而变化,这使得文件在物理存储上的存在更加稳定和重要。
-
-
符号链接:
- 指向路径: 符号链接只是指向另一个文件的路径,而不是直接指向文件的 inode。因此,如果目标文件被删除,符号链接将变为无效的悬挂链接
- 无链接计数: 符号链接不维护链接计数,这使得它们在某种程度上对目标文件的存在不那么重要
灵活性
-
硬链接:
- 跨文件系统限制: 硬链接只能在同一文件系统中使用,因为它们依赖于相同的 inode。不同文件系统中的 inode 结构和分配方式不
- 不能链接目录: 硬链接不能链接到目录,以防止循环引用和复杂的文件系统结构。这样可以避免出现死循环情况,导致文件系统的复杂性和潜在错误
-
符号链接:
-
跨文件系统支持: 符号链接可以跨越不同的文件系统,允许用户在不同存储位置之间创建快捷方式,这种灵活性在管理文件和目录时极其有用
-
可以链接目录: 符号链接可以指向目录,使得在复杂的目录结构中导航变得更容易,用户可以创建更复杂的文件系统布局
-