Linux 中的符号链接与硬链接:您需要了解的内容Linux 中的符号链接与硬链接:您需要了解的内容Linux 中的符号链接与硬链接:您需要了解的内容Linux 中的符号链接与硬链接:您需要了解的内容
  • 业务
  • 目标
  • 支持
  • 登录
找到的结果: {phrase} (显示: {results_count} 共: {results_count_total})
显示: {results_count} 共: {results_count_total}

加载更多搜索结果...

搜索范围
模糊匹配
搜索标题
搜索内容

Linux 中的符号链接与硬链接:您需要了解的内容

发表 admin at 2025年2月28日
类别
  • 未分类
标签

要点

  • Linux 中的链接就像快捷方式:对不重复文件的引用。
  • 符号链接按文件名引用,但如果其目标移动则中断。
  • 文件索引节点引用的硬链接可能更健壮,但更难理解。

在 Linux 上,链接就像文件的快捷方式,使您能够决定如何组织文件系统。但链接有两种类型,而且它们有很大不同。

Linux 中的链接是什么?

在 Linux 中,文件由两部分组成:名称和内容。称为“inode”的结构将文件名与其包含的数据连接起来。该索引节点还存储有关文件的元数据,例如文件的所有者、权限和上次更改的日期。

文件名只是指向或“链接”到该索引节点结构。这意味着多个文件名可以引用相同的结构,即相同的底层文件。

创建硬链接

默认的链接类型是“硬链接”。您可以使用以下形式的 ln 命令创建指向现有文件的硬链接:

ln existing_file new_hard_link

现在您将有两个文件名指向同一个 inode。重要的是要理解这里实际上只有一个文件,只是碰巧有两个文件名。因此,您可以使用名称(或路径)来引用同一个文件,并且所有内容都将保持同步。

尝试一下,您就会看到发生了什么。首先像平常一样使用 cp 命令复制文件:

echo "hello world" > foo
cp foo bar
ls -li
cat foo bar

将 i 选项传递给 ls 指示它在行的开头打印每个文件的索引节点号。请注意,新文件具有不同的索引节点,但内容与原始文件相同。

现在创建到原始文件的硬链接并进行比较:

ln foo hum
ls -li
cat foo bar hum

请注意,硬链接与原始文件具有相同的 inode:43458473。 foo 和 hum 都指向同一个底层文件。另请注意第三列中的数字,就在权限的右侧。对于原始文件 (foo) 和硬链接 (hum),这显示为“2”,但对于副本 (bar) 则显示为“1”。该数字表示该文件的硬链接总数。

重新绘制第一个图来表示原始文件及其硬链接给出:

原始文件和硬链接之间没有任何有意义的区别。事实上,两者都是 Linux 意义上的“链接”,这就是为什么有一个 unlink 命令与 rm 执行相同的工作来删除文件。

通过列出索引节点号,您可以确认这两个文件名确实只有一个实际文件。如果您仍然有任何疑问,请尝试更改任一文件的内容:

echo "some new contents" > hum
cat foo

创建符号(软)链接

符号链接(symlinks)还允许您在多个位置引用同一文件。不同之处在于,硬链接引用 inode,而软链接则通过文件名引用其他文件。您仍然使用 ln 命令创建符号链接,但也传递 -s (符号)标志:

ln -s existing_file new_soft_link

符号链接本身就是一个文件;它有一个包含自己内容的索引节点。但符号链接的内容只不过是一个文件名,一个对符号链接应充当代理的单独文件的引用。存储在符号链接 inode 中的元数据显式地将其标记为符号链接,因此任何使用它的程序都会知道获取它指向的文件名。

这是一个例子:

ln -s foo baz
cat baz
ls -li

请注意,这看起来与硬链接情况非常相似,但 ls 的输出却截然不同。首先,符号链接在权限的开头标有“l”(链接)。但是,更有用的是,符号链接的文件名是粉红色的,后面跟着一个箭头和原始文件名。

符号链接和原始文件之间的关系是这样的:

创建符号链接时,您可以准确选择如何引用它指向的文件。前面的示例仅使用普通文件名,它是对同一目录中文件的相对引用。但您可以使用任何有效的路径,相对或绝对,例如:

ln -s foo sub/dir/baz
ln -s foo ../../baz
ln -s foo /tmp/baz

您可能已经在这里发现了一个缺陷:如果原始文件更改了名称或位置怎么办?事实上,如果符号链接文件更改了位置怎么办?好吧,根据您使用的路径类型(相对路径还是绝对路径)以及是移动两个文件还是仅移动一个文件,您可能没问题。但你需要小心。

什么时候应该使用硬链接或软链接?

符号链接的一种常见用途是管理已安装的软件。例如,在我的系统上,我有 vim(文本编辑器)和 vi(它是由它演变而来的旧编辑器)。它们的安装方式如下:

通过此设置,任何使用 vi 的脚本都将默默地使用 vim。

两种类型的链接都适合文件系统管理。您可以使用链接来组织文件和目录,使它们更易于访问,而不会浪费磁盘空间。例如:

# Create a hard link to the apache log file in home directory
~ $ ln /var/log/apache2/access_log apache-log
# Create a soft link to a deeply-nested directory
~ $ ln -s ./work/acme/2024/10 current-work

链接作为一种在不同文件之间切换而无需修改它们的方式非常有用。例如,假设您有一个配置文件conf,供某些软件使用。您可以创建多个配置,将它们存储在单独的文件中,然后使用链接在它们之间切换:

# Create two config files
config $ mv conf dark.conf
config $ cp dark.conf light.conf
# Use the dark config
config $ ln -s dark.conf conf
# Switch to the light config. Note -f to force overwrite of existing link.
config $ ln -fs light.conf conf

软链接一直有效,直到它指向的文件被移动或重命名,然后它就成为损坏的链接:

因此,软链接通常在狭窄的范围内效果最佳,例如,当文件及其链接位于同一目录中时。

硬链接不会遇到这个问题;您可以安全地将它们移动到同一文件系统中的任何位置。然而,他们面临着不同的问题。一些编辑器和其他作用于文件的程序会创建文件的副本并在保存时重命名,以用于备份目的。此行为可能会破坏硬链接,导致它们不同步并占用两倍的磁盘空间。您需要仔细检查用于编辑硬链接的程序,以确保它们不会这样做。

如果您要链接到目录,则软链接是您唯一的选择。当涉及到目录时,硬链接没有多大意义,并且会产生比它们解决的问题更多的问题。硬链接也不能存储在 git 存储库中。

在命令行上,硬链接是默认设置,但 GUI(例如 Nautilus)通常仅支持软链接。即使如此,您也必须通过首选项启用该选项:

软链接的概念更容易理解,而且可能更安全。软链接更明显、更流行,并且通常更容易理解。


无论您使用哪种类型的链接,您都可能需要一些时间和练习才能理解这个概念。但链接非常强大且受欢迎,因此您会感受到它们的好处。确保使用 ls 来跟踪链接并尽量不要过度!

©2015-2025 Norria support@alaica.com