在Linux中创建符号链接的10多个实际示例

时间:2020-01-09 10:37:55  来源:igfitidea点击:

在本教程中,我们将学习有关Linux中符号链接的所有知识。符号链接也可以称为符号链接

符号链接的类型

Linux中有两种不同类型的符号链接,即软链接或者硬链接。在继续之前,让我们了解这些类型之间的基本区别:

软链接与硬链接比较

软链接硬链接
实际文件和软链接文件的inode编号不同。实际文件和硬链接文件的inode编号相同。
可以跨不同的文件系统创建软链接。硬链接只能在同一文件系统中创建。
软链接可以链接到常规文件和目录。硬链接不链接到目录。
如果实际文件被删除,软链接不会更新。它一直指向一个不存在的文件。如果实际文件被移动或者删除,硬链接将始终更新。

如何创建符号链接

在Linux和Unix中,我们具有用于创建符号链接的ln实用程序。创建链接的基本语法为:

ln [OPTION] TARGET LINK_NAME

" TARGET"是指我们要为其创建链接的文件或者目录," LINK_NAME"是链接的名称。

说明:

建议在创建符号链接时使用绝对路径,否则可能会导致链接断开,因为链接必须指向原始文件的路径。我们也可以谨慎使用相对路径

创建软链接

让我们使用一些示例来了解软链接的概念以及如何创建软链接。

示例1:使用其他链接名称

在这个例子中,我有一个文件/tmp/orig_file.txt。我希望为此文件在/root下创建一个符号链接,并使用另一个名称orig_link。因此,我们的命令如下所示:

# ln -s /tmp/orig_file.txt /root/orig_link

这将创建一个指向/tmp/orig_file.txt的软链接/root/orig_link。

验证符号链接。现在,当我们长长列出orig_file.txt时,它没有为该文件创建的任何链接的信息。

# ls -l /tmp/orig_file.txt
-rw-r--r-- 1 root root 0 Aug  2 18:32 /tmp/orig_file.txt

因此,要验证链接,我们必须列出我们创建的符号链接

# ls -l /root/orig_link
lrwxrwxrwx 1 root root 18 Aug  2 18:32 /root/orig_link -> /tmp/orig_file.txt

这里的符号链接/root/orig_link指向它的原始文件位置

注意符号链接的许可部分中的lrwxrwxrwx,这里的" l"代表软链接

示例2:使用与源文件相同的链接名称

在前面的示例中,我们为软链接明确指定了名称。如果我们仅提供路径而不是名称,则将创建一个与源文件同名的软链接。

让我们在示例中进行检查:

# ln -s /tmp/orig_file.txt /root/

现在我们其中没有为软链接起任何名字,而只是给PATH即"/root",所以这在"/root"下创建了一个软链接" soft_file.txt"。

# ls -l /root/orig_file.txt
lrwxrwxrwx 1 root root 18 Aug  2 18:39 /root/orig_file.txt -> /tmp/orig_file.txt

示例3:使用相对路径进行软链接

现在,在上面的示例中,我们对绝对推荐且简单的软链接使用了绝对路径。但是,有时绝对路径可能是动态的,因此在这种情况下,我们必须为软链接使用相对路径。

例如,我在/tmp中创建了一个目录结构。

# tree /tmp
/tmp
├── dir1
│   └── dir2
│       └── dir3
│           └── dir4

我在/tmp/dir1/dir2/src_file中有一个原始源文件,并且我希望我的符号链接在/tmp/dir1/dir2/dir3/dir4中。

现在,理想情况下,我可以给出绝对路径并通过使用以下方式创建软链接

# ln -s /tmp/dir1/dir2/src_file /tmp/dir1/dir2/dir3/dir4/src_link
# ls -l /tmp/dir1/dir2/dir3/dir4/src_link
lrwxrwxrwx 1 root root 23 Aug  2 18:46 /tmp/dir1/dir2/dir3/dir4/src_link -> /tmp/dir1/dir2/src_file

但是出于本文的考虑,我将使用相对路径,假设我在/tmp/dir1/dir2内部。这里的技巧是,始终确保我们位于要创建软链接的位置,即,在这种情况下,我们的符号链接必须位于/tmp/dir1/dir2/dir2/dir3/dir4内部,因此我们导航至该路径

# pwd
/tmp/dir1/dir2/dir3/dir4

然后使用src_file的相对路径创建符号链接

# ln -s ../../../dir2/src_file src_link

现在验证符号链接

# ls -l
total 0
lrwxrwxrwx 1 root root 22 Aug  2 18:48 src_link -> ../../../dir2/src_file

重要的提示:

有效的软链接将始终显示为青色(浅蓝色),如果我们看到的软链接为红色,则表示该软链接处于断开状态

示例4:为目录创建软链接

我们还可以为目录创建软链接。可以使用现有的命令语法,只需将文件替换为我们要为其创建符号链接的目录即可。在此示例中,我们将使用与源目录相同的链接名称,即" dir2"

# ln -s /tmp/dir1/dir2//root/

验证软链接:

# ls -l /root/dir2
lrwxrwxrwx 1 root root 15 Aug  2 22:22 /root/dir2 -> /tmp/dir1/dir2/

因此,如果我在/root/dir2中导航

# cd /root/dir2
[root@server dir2]# pwd
/root/dir2

我仍然可以看到/tmp/dir1/dir2的内容

[root@server dir2]# ls -l
total 4
drwxr-xr-x 3 root root 4096 Aug  2 22:07 dir3
-rw-r--r-- 2 root root    0 Aug  2 18:45 src_file

查看软链接的统计信息

现在,由于我们熟悉如何在Linux中创建软链接,因此让我们了解更多有关软链接文件类型的知识。我们可以使用统计信息来获取文件详细信息,并比较源文件和软链接。

源文件的统计

软链接状态

我们可以检入图像:

  • 源文件和symlink都有"不同的inode号"

  • 源文件和符号链接都具有"不同的大小"。符号链接几乎不会有几个字节。

找到所有的软链接

我们可以使用find命令在Linux服务器中使用-type作为l来定位所有软链接,这意味着软链接。

# find /tmp/-type l
/tmp/dir1/dir2/dir3/dir4/src_link

另请阅读:

在Linux/Unix中将find和exec结合在一起的10多个示例

创建硬链接

通用术语中的硬链接是文件系统中多个目录中同一文件的合法存在。创建硬链接时,硬链接仅用作对现有文件的引用,并且该链接保留与其源文件完全相同的属性。因此,如果所有权,模式或者什至包含的数据在链接上发生更改,则这些完全相同的更改将在源文件上实现。

我们可以使用相同的ln实用程序来创建硬链接。我们不需要任何带有ln的参数,创建硬链接的语法将是:

ln TARGET LINK_NAME

重要的提示:

硬链接可能会带来很大的安全风险,因为用户可以硬链接配置文件,然后轻松利用系统。保护系统的唯一方法是确保系统数据和用户数据位于单独的文件系统中,因为仅当源和目标位于同一卷上时才能创建硬链接。

示例1:使用其他链接名称

在此示例中,我创建了一个虚拟文件,并将一些内容放入文件中

# echo "Hello, This is a test file" >> /tmp/source_file

接下来,我将在/root/hard_link_file下创建此文件的硬链接

# ln /tmp/source_file /root/hard_link_file

没有输出,因此这意味着执行成功。接下来验证硬链接文件

# ls -l /root/hard_link_file
-rw-r--r-- 2 root root 27 Aug  2 21:45 /root/hard_link_file

如我们所见,与软链接不同,硬链接文件没有指向其源文件,而是充当普通文件。

我将一些数据添加到源文件中

# echo "new content" >> /tmp/source_file

现在验证hard_link_file的内容

# cat hard_link_file
Hello, This is a test file
new content

因此,"相同数据会自动添加到硬链接文件中"。

示例2:使用与源文件相同的链接名称

在此示例中,我们不会为硬链接文件定义名称,因此它将选择与源文件相同的名称

# ln /tmp/source_file /root/

现在验证硬链接文件

# ls -l /root/source_file
-rw-r--r-- 3 root root 39 Aug  2 22:00 /root/source_file

如预期的那样,将创建一个与源文件同名的硬链接

查看硬链接文件的统计信息

现在让我们比较源文件和硬链接文件的统计信息

源文件的统计信息(硬链接)

硬链接文件的统计信息(硬链接)

如我们所见,两个文件都是完全相同的,即使`节点号也相同。通常,在Linux中创建的每个文件的inode编号都会不同,但是由于这里两个文件都是链接的,因此inode编号是相同的。

我们如何识别硬链接?

我们可以使用find命令来查找Linux中的所有硬链接。

示例1:将find与samefile一起使用

使用find我们可以使用-samefile参数,它将查找具有相同inode编号的所有文件

# find /root/-samefile /tmp/source_file
/root/source_file
/root/hard_link_file

示例2:使用find检查链接计数

现在,我们将通过硬链接注意到一件有趣的事情。这是我的源文件,其中" 1 root root"之前的值为1,这意味着该文件具有1个链接,即同一文件。

# ls -l /tmp/source_file
-rw-r--r-- 1 root root 39 Aug  2 22:00 /tmp/source_file

现在让我们创建该文件的硬链接

# ln /tmp/source_file /root/

重新验证/tmp/source_file的链接数

# ls -l /tmp/source_file
-rw-r--r-- 2 root root 39 Aug  2 22:00 /tmp/source_file

链接数已增加到" 2",因此,每次我们创建文件的硬链接时,链接数都会增加。

因此,我们可以将其与find命令一起使用以查找所有硬链接

# find /tmp//root/-type f -links +1
/tmp/dir1/dir2/dir3/hard_link_file
/tmp/dir1/dir2/src_file
/tmp/source_file
/root/source_file

提示:

如前所述,不能为目录创建硬链接,而只能用于文件

如何删除符号链接

由于符号链接也像常规文件一样,我们可以使用rm命令删除符号链接,但是在Linux中,我们有一个单独的实用程序,即unlink,用于删除符号链接

我们不需要任何带有unlink的参数,我们可以按照以下格式执行它

# unlink <path/to/symlink>

例如,我们将删除我们先前创建的文件和目录链接。相同的命令可用于软链接和硬链接。

# unlink /root/dir_link
# unlink /root/source_file

另外,我们也可以使用rm命令删除符号链接,因为它们也是真实文件

# rm <path/to/symlink>

例如:

# rm /tmp/hard_link_file