硬链接

硬链接其实就是一个文件的别名

我们看到下面这张图

ln t1 hard_link 这个命令表示我们给文件t1创建了一个硬链接hard_link

然后可以看到他们两个指向的inode编号(675970, 最左端的数字)是一样的,说明他们是同一个文件,然后在看到一个数字 2 ,这个数字是硬链接的计数,初始为1,就像是t2一样,它只有一个硬链接,其实就是它本身

1

在看到这张图,我们先是向t1写入hello, hard_link居然也是hello, 然后我们重新向hard_link写入world, t1也变成了world, 这更说明了他们是同一个文件了
2

在看到这张图,我们删除了hard_link, 发现t1的硬链接计数变成了1
3

只有当硬链接的计数变成0时,存储在磁盘上的文件才能够被删除

还需要注意的是仅当关闭所有文件描述符时,方可删除一个已打开的文件,这是因为一个进程打开一个文件,获得到文件描述符时,就已经获得了访问对应inode的能力,即访问磁盘上的文件的能力,所以这时候不能删除这个打开的文件

硬链接的创建和删除

  • 命令行创建 ln file hard_link

  • 系统调用创建
    5

  • 系统调用移除
    6

也可以使用remove()系统调用进行移除,本质上也是个文件

符号链接

符号链接其实就相当于快捷方式

看到下面这张图,我们使用 ln -s t1 symbolic_link 为t1创建了一个符号链接

然后可以看到符号链接指向的是t1, 并且他的inode与t1的不同,说明符号链接也是一个区别于链接目标的文件,独立占有一份空间,不像硬链接,它适合链接目标享有同一份空间

7

我们在看到下面这张图,我把符号链接移动到另一个目录里,发现符号链接失效了,这说名符号链接无法定义到t1文件了,这是因为我们链接时的路径使用的是相对路径
8

在看到下面这张图,我们定义符号链接时,用的是绝对路径,然后在把符号链接移动到其他目录,发现符号链接仍然有效
9

符号链接的创建和删除

  • 命令行创建 ln -s file symbolic_link

  • 系统调用创建
    10

  • 系统调用移除
    6

也可以使用remove()系统调用进行移除,本质上也是个文件

但使用符号链接的路径名作为函数参数时,要注意该函数是否会对符号链接解引用

对比

重要性

  • 硬链接:

    • 真正的文件指向: 硬链接直接指向文件的 inode,因此它们共享相同的数据块。这意味着,删除任何一个硬链接都不会影响文件的实际内容,除非所有链接都被删除

    • 链接计数: 文件的链接计数会随着硬链接的创建和删除而变化,这使得文件在物理存储上的存在更加稳定和重要。

  • 符号链接:

    • 指向路径: 符号链接只是指向另一个文件的路径,而不是直接指向文件的 inode。因此,如果目标文件被删除,符号链接将变为无效的悬挂链接
    • 无链接计数: 符号链接不维护链接计数,这使得它们在某种程度上对目标文件的存在不那么重要

灵活性

  • 硬链接:

    • 跨文件系统限制: 硬链接只能在同一文件系统中使用,因为它们依赖于相同的 inode。不同文件系统中的 inode 结构和分配方式不
    • 不能链接目录: 硬链接不能链接到目录,以防止循环引用和复杂的文件系统结构。这样可以避免出现死循环情况,导致文件系统的复杂性和潜在错误
  • 符号链接:

    • 跨文件系统支持: 符号链接可以跨越不同的文件系统,允许用户在不同存储位置之间创建快捷方式,这种灵活性在管理文件和目录时极其有用

    • 可以链接目录: 符号链接可以指向目录,使得在复杂的目录结构中导航变得更容易,用户可以创建更复杂的文件系统布局

 posted on 2024-09-29 20:44  Dylaris  阅读(78)  评论(0)    收藏  举报