Linux 中的硬链接:您需要了解的所有重要信息Linux 中的硬链接:您需要了解的所有重要信息Linux 中的硬链接:您需要了解的所有重要信息Linux 中的硬链接:您需要了解的所有重要信息
  • 文章
  • 正则表达式
    • 工具
  • 登录
找到的结果: {phrase} (显示: {results_count} 共: {results_count_total})
显示: {results_count} 共: {results_count_total}

加载更多搜索结果...

搜索范围
模糊匹配
搜索标题
搜索内容
发表 admin at 2025年2月28日
类别
  • 未分类
标签

Linux 中的硬链接:您需要了解的所有重要信息

在本教程中了解 Linux 中硬链接的概念及其与 inode 的关联。

在你看到硬链接之前,我建议你先了解一下 Linux 中的 inode。 Linux 文件系统有两个主要组件:存储数据的数据块池和管理该数据池的数据库系统。索引节点就像该数据库系统的索引。

Linux中什么是硬链接?

文件的硬链接指向文件的 inode,而不是指向文件本身。这样硬链接就获取了原文件的所有属性,并指向与原文件相同的数据块。

如果您还记得符号链接或软链接,您就知道它指向该文件。硬链接是目录中手动创建的条目,指向已存在的索引节点。

我将用适当的图表向您解释。我们以这个目录结构为例:

所以基本上,根目录包含 dir_1 和 dir_2 目录。 dir_1 目录包含 file_1 和 file_2 文件,而 dir_2 包含 file_3 和指向文件 2 的硬链接。

让我们看看文件系统中的情况如何。一切都是有代表性的。实际上,根目录将包含数千个文件。在这里,我们假设它只有两个目录。

还记得 Linux 的目录结构吗?从根 (/) 开始。根目录始终有 inode 2。

如果您必须访问文件 3,则绝对路径将为 /dir_2/file_3。在这里,您可以这样阅读:从 inode 2(根始终为 indoe 2)开始,然后沿着箭头到达其数据块。该数据块包含有关 dir_2 的 inode 的信息(在我们的示例中为 inode 27)。

现在查看 inode 27。它的类型是目录。您可以跟踪其数据块,其中包含有关 file_3 的索引节点(索引节点 88)的信息。您查看索引节点 88。它的类型是文件,如果您跟踪它的数据块,您就可以访问文件的内容。

您是否注意到目录本身不包含其文件数据?目录本质上是一个文件,其中包含有关其文件和子目录的索引节点的信息。

您一定想知道上图中的链接计数。这非常重要,特别是当您处理硬链接时。链接计数是指向某个 inode 的目录条目的数量。以 dir_2 的 inode 27 为例。 inode 27 一次位于根目录的数据块中,一次位于其自己的数据块(特殊目录.)中。因此它的链接计数为 2。

请注意,除了 file_2 之外,所有文件的链接计数都是 1?如果一个文件的链接计数超过 1,则意味着存在“指向该文件”的硬链接。由于硬链接指向与目标文件相同的 inode(在我们的示例中为 inode 17),因此您将获得 inode 17 的 2 个目录列表(在 dir_1 和 dir_2 的数据块中)。

如何在 Linux 中创建硬链接

您可以使用 ln 命令来创建硬链接:

ln target_file link_name

这将创建一个指向 target_file 的名为 link_name 的硬链接。你会看到 link_name 看起来像一个普通文件,它的属性与目标文件相同。

如果使用 ls -li 命令(-i 选项显示 inode 编号),您将看到其链接计数为 2。链接计数位于文件权限字段之后。

134195 -rw-r--r-- 2 abhishek abhishek        0 Jul 17 19:49  target_file
134195 -rw-r--r-- 2 abhishek abhishek        0 Jul 17 19:49  link_target_file

显然,两者都有相同的 inode 编号 134195。

关于硬链接的注意事项

现在您已经对 Linux 中的硬链接有了一个很好的了解,让我们进一步了解一下。

如果目标文件有硬链接,则删除目标文件不会再删除其数据

如果删除目标文件,您仍然可以通过硬链接访问其内容。这是因为目标文件和硬链接都有相同的inode,因此它们指向相同的数据块。

Linux中删除文件基本上就是取消链接。假设您使用 rm 命令删除 file_1。 Linux 内核会发现 file_1 对应于 inode 16。它将从 dir_1 的列表中删除 file_1 条目,并将 inode 16 的链接计数减少 1。现在 inode 16 的链接计数为 0,内核知道没有人链接到此inode,因此可以安全地删除 inode 并删除与其关联的数据块。

现在假设您删除 file_2。内核将从 dir_1 的列表中删除 file_2 并转到 inode 17。它将减少 inode 17 的链接计数,使其降至 1。由于链接计数不为零,因此内核不会删除该 inode 或与它。因此,如果您访问硬链接,即使原始文件已被删除,您仍然可以访问数据。

您不应创建指向目录的硬链接

您可以创建到目录的软链接,但是当您尝试创建到目录的硬链接时,您会看到如下错误:

ln: newdir/test_dir: hard link not allowed for directory

为什么目录不允许硬链接?这是因为对目录使用硬链接可能会破坏文件系统。理论上,您可以使用 -d 或 -F 选项创建目录的硬链接。但即使您是 root 用户,大多数 Linux 发行版也不允许这样做。

几乎不可能区分硬链接和原始文件

让我们再看一下我之前创建的硬链接:

134195 -rw-r--r-- 2 abhishek abhishek        0 Jul 17 19:49  target_file
134195 -rw-r--r-- 2 abhishek abhishek        0 Jul 17 19:49  link_target_file

它们具有相同的属性,但您可以根据上面示例中的名称猜测哪个是链接,但如果名称不明显怎么办?您如何知道他们的名字是否为 target_1 和 target_2?

如果文件和链接位于不同的目录中,您可以尝试检查 mtime 和其他参数以了解目录内容何时更改,但即使这样也不确定。如果文件和硬链接位于同一目录中并且历史记录已被清除,我不确定如何确定哪个是原始文件,哪个是硬链接。

额外提示:如何查找给定文件的所有硬链接

如果您发现某个文件具有多个链接计数,您可能会对与其关联的其他硬链接感到好奇。

找到它的一种方法是使用文件的索引节点号。您可以使用ls -i命令或stat命令来获取inode编号。

获得索引节点号后,您可以使用 find 命令查看与其关联的所有链接。

find . -inum inode_number

硬链接很难理解吗?

我希望这不是太“难”,并且您可以更好地理解 Linux 中硬链接的概念。如果您对此主题有疑问或建议,请在下面发表评论。

©2015-2025 艾丽卡 support@alaica.com