Linux 链接创建

LinuxLinuxBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在 Linux 系统中,链接提供了一种强大的方式来引用文件和目录。这些链接在文件名和存储在磁盘上的实际数据之间建立了连接。了解如何有效地使用链接是 Linux 用户和系统管理员的一项基本技能。

本实验将指导你在 Linux 中创建和使用两种类型的链接:

  1. 硬链接:这些是指向相同索引节点(磁盘上的数据)的额外目录项。当你创建硬链接时,实际上是为同一数据赋予了另一个名称。

  2. 符号链接(也称为软链接):这些是通过名称指向其他文件的特殊文件。与硬链接不同,符号链接可以指向目录,并且可以跨不同的文件系统。

在本实验结束时,你将了解如何使用 ln 命令创建这两种类型的链接,并学习它们在 Linux 环境中的实际应用。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("Linux")) -.-> linux/BasicSystemCommandsGroup(["Basic System Commands"]) linux(("Linux")) -.-> linux/BasicFileOperationsGroup(["Basic File Operations"]) linux(("Linux")) -.-> linux/FileandDirectoryManagementGroup(["File and Directory Management"]) linux/BasicSystemCommandsGroup -.-> linux/echo("Text Display") linux/BasicFileOperationsGroup -.-> linux/ls("Content Listing") linux/BasicFileOperationsGroup -.-> linux/cp("File Copying") linux/BasicFileOperationsGroup -.-> linux/mv("File Moving/Renaming") linux/BasicFileOperationsGroup -.-> linux/ln("Link Creating") linux/BasicFileOperationsGroup -.-> linux/cat("File Concatenating") linux/FileandDirectoryManagementGroup -.-> linux/cd("Directory Changing") linux/FileandDirectoryManagementGroup -.-> linux/pwd("Directory Displaying") linux/FileandDirectoryManagementGroup -.-> linux/mkdir("Directory Creating") subgraph Lab Skills linux/echo -.-> lab-271321{{"Linux 链接创建"}} linux/ls -.-> lab-271321{{"Linux 链接创建"}} linux/cp -.-> lab-271321{{"Linux 链接创建"}} linux/mv -.-> lab-271321{{"Linux 链接创建"}} linux/ln -.-> lab-271321{{"Linux 链接创建"}} linux/cat -.-> lab-271321{{"Linux 链接创建"}} linux/cd -.-> lab-271321{{"Linux 链接创建"}} linux/pwd -.-> lab-271321{{"Linux 链接创建"}} linux/mkdir -.-> lab-271321{{"Linux 链接创建"}} end

创建工作目录

在这一步中,我们将创建一个目录结构和文件,用于练习创建链接。

首先,让我们检查当前所在位置,确保处于正确的目录中。运行以下命令:

pwd

你应该会看到输出为 /home/labex/project。如果你位于其他目录,请导航到项目目录:

cd /home/labex/project

现在,让我们创建一个名为 linklab 的新目录,用于存储我们的文件:

mkdir /home/labex/project/linklab

让我们导航到这个目录:

cd /home/labex/project/linklab

现在,让我们创建两个文本文件,用于练习创建链接:

echo "This is the original file for our link examples." > original.txt

让我们检查文件是否正确创建:

ls -l

你应该会看到类似于以下的输出:

-rw-r--r-- 1 labex labex 46 [date and time] original.txt

让我们也查看一下文件的内容:

cat original.txt

你应该会在终端中看到我们之前输入的文本:

This is the original file for our link examples.

创建硬链接

硬链接是指向磁盘上与原始文件完全相同数据的另一个名称。原始文件和硬链接共享相同的索引节点(inode)编号,这意味着它们本质上是具有不同名称的同一个文件。

要创建硬链接,我们使用 ln 命令。让我们为 original.txt 文件创建一个硬链接:

ln /home/labex/project/linklab/original.txt /home/labex/project/linklab/hardlink.txt

此命令创建了一个名为 hardlink.txt 的新文件,它是 original.txt 的硬链接。现在,让我们验证硬链接是否正确创建:

ls -li

-i 选项会显示每个文件的索引节点编号。你应该会看到 original.txthardlink.txt 具有相同的索引节点编号,这表明它们是同一个文件。

输出应该类似于以下内容:

[inode number] -rw-r--r-- 2 labex labex 46 [date and time] hardlink.txt
[inode number] -rw-r--r-- 2 labex labex 46 [date and time] original.txt

注意,文件权限后面的数字 2 表示指向该索引节点的硬链接数量。original.txthardlink.txt 的链接计数均为 2,因为现在有两个文件指向相同的数据。

让我们证明修改其中一个文件会影响另一个文件,因为它们本质上是同一个文件:

echo "This is an added line." >> original.txt
cat hardlink.txt

你应该会在输出中看到这两行内容:

This is the original file for our link examples.
This is an added line.

这证实了对 original.txt 所做的更改会反映在 hardlink.txt 中。

同样,如果我们修改 hardlink.txt,更改也会反映在 original.txt 中:

echo "Another line added through the hard link." >> hardlink.txt
cat original.txt

现在输出应该显示所有三行内容:

This is the original file for our link examples.
This is an added line.
Another line added through the hard link.

创建符号链接

符号链接(也称为软链接或 symlink)与硬链接不同。符号链接是一个单独的文件,它只是通过名称指向另一个文件。它与目标文件不共享相同的索引节点(inode)。

要创建符号链接,我们使用带有 -s 选项的 ln 命令。让我们为 original.txt 文件创建一个符号链接:

ln -s /home/labex/project/linklab/original.txt /home/labex/project/linklab/symlink.txt

此命令创建了一个名为 symlink.txt 的新文件,它是 original.txt 的符号链接。现在,让我们验证符号链接是否正确创建:

ls -li

输出应该类似于以下内容:

[inode number] -rw-r--r-- 2 labex labex  [size] [date and time] hardlink.txt
[inode number] -rw-r--r-- 2 labex labex  [size] [date and time] original.txt
[inode number] lrwxrwxrwx 1 labex labex  [size] [date and time] symlink.txt -> /home/labex/project/linklab/original.txt

注意 symlink.txt 权限开头的 l,这表明它是一个符号链接。此外,输出显示了符号链接所指向的路径。你还可以看到 original.txtsymlink.txt 具有不同的索引节点编号,这证实了它们是单独的文件。

让我们查看符号链接的内容:

cat symlink.txt

你应该会看到与 original.txt 相同的内容:

This is the original file for our link examples.
This is an added line.
Another line added through the hard link.

让我们通过符号链接再添加一行内容:

echo "This line was added through the symbolic link." >> symlink.txt
cat original.txt

现在输出应该包含所有四行内容:

This is the original file for our link examples.
This is an added line.
Another line added through the hard link.
This line was added through the symbolic link.

这证实了通过符号链接所做的更改会影响目标文件。

现在,让我们看看删除目标文件会发生什么:

mv original.txt original.txt.bak
cat symlink.txt

你应该会看到类似这样的错误消息:

cat: symlink.txt: No such file or directory

这是因为符号链接仍然指向 /home/labex/project/linklab/original.txt,而该文件已不存在。这是硬链接和符号链接之间的一个关键区别。

让我们恢复原始文件:

mv original.txt.bak original.txt
cat symlink.txt

符号链接再次可用,因为目标文件又存在了。

理解硬链接和符号链接的区别

既然我们已经创建了硬链接和符号链接,现在让我们来比较它们的关键区别:

硬链接:

  1. 与原始文件共享相同的索引节点(inode)
  2. 不能链接到目录
  3. 不能跨文件系统边界
  4. 即使原始文件被删除或移动,仍然可以正常使用
  5. 对内容所做的更改会反映在所有硬链接中

符号链接:

  1. 有自己的索引节点,与目标文件不同
  2. 可以链接到目录
  3. 可以跨文件系统边界
  4. 如果目标文件被删除或移动,链接会失效
  5. 本质上是包含目标文件路径的指针文件

让我们通过示例来展示其中一些区别:

首先,让我们尝试为一个目录创建硬链接,这是不允许的:

mkdir testdir
ln testdir testdir_hardlink

你应该会看到类似这样的错误消息:

ln: testdir: hard link not allowed for directory

现在,让我们尝试为一个目录创建符号链接,这是允许的:

ln -s testdir testdir_symlink

让我们验证目录符号链接:

ls -la

你应该会在输出中看到 testdir_symlink -> testdir,这表明 testdir_symlink 是指向 testdir 的符号链接。

我们可以在原始目录中创建一个文件:

echo "This is a test file in the directory." > testdir/testfile.txt

并通过符号链接访问它:

cat testdir_symlink/testfile.txt

你应该会看到以下内容:

This is a test file in the directory.

这表明符号链接可以指向目录并用于访问其内容。

另一个重要的区别是,删除原始文件会使符号链接失效,但不会影响硬链接。我们在符号链接的示例中已经看到了这一点。现在让我们用硬链接来演示:

rm original.txt
cat hardlink.txt

你仍然应该看到所有四行内容:

This is the original file for our link examples.
This is an added line.
Another line added through the hard link.
This line was added through the symbolic link.

硬链接仍然可以正常使用,因为数据仍然存在于磁盘上,并且硬链接仍然指向该数据。

然而,我们的符号链接现在已经失效了:

ls -l symlink.txt
cat symlink.txt

你应该会看到 symlink.txt 仍然存在,但它指向的文件已不存在,尝试读取它会产生错误。

让我们从硬链接重新创建原始文件:

cp hardlink.txt original.txt
cat symlink.txt

符号链接再次可用,因为它指向的文件又存在了。

总结

在本次实验中,你学习了 Linux 中的两种链接类型:硬链接和符号链接(软链接)。你练习了使用 ln 命令创建这些链接,并探究了它们的关键区别。

本次实验涵盖的要点如下:

  1. 硬链接

    • 使用不带选项的 ln 命令创建
    • 与原始文件共享相同的索引节点(inode)
    • 不能链接到目录,也不能跨文件系统边界
    • 即使原始文件被删除,仍然可以正常使用
    • 对内容所做的更改会反映在所有硬链接中
  2. 符号链接

    • 使用 ln -s 命令创建
    • 有自己的索引节点,与目标文件不同
    • 可以链接到目录,并且可以跨文件系统边界
    • 如果目标文件被删除或移动,链接会失效
    • 是包含目标文件路径的指针文件
  3. 实际应用

    • 链接可用于为文件和目录创建快捷方式
    • 可用于维护文件的多个版本
    • 系统管理员使用链接进行配置管理
    • 链接有助于在不复制数据的情况下组织文件

理解如何有效地创建和使用链接是 Linux 用户必备的技能。这些工具能让你在 Linux 文件系统中高效地管理和组织文件。