Skip to content

04 身影随行 - 软连接与硬链接

  • Linux 中的软链接(Symbolic Link 或 Symlink),也称为符号链接,是一种特殊类型的文件,其包含有一条指向其他文件或者目录的引用。
  • 软链接类似于 Windows 中的快捷方式,但它是一个独立的文件,有自己的 inode 和文件权限。软链接可以跨越文件系统边界,并且可以指向文件或目录。
  • 通过软链接,用户可以创建指向目标文件或目录的引用,而不占用额外的存储空间,也不复制数据内容。

软链接

bash
  ~ ls -l  /lib64/lib*
lrwxrwxrwx  1 root root        18 Oct  6  2023 /lib64/libacl.so.1 -> libacl.so.1.1.2301
-rwxr-xr-x  1 root root     40496 Oct  6  2023 /lib64/libacl.so.1.1.2301
-rw-r--r--  1 root root         8 Jul  4 06:46 /lib64/libanl.a
lrwxrwxrwx  1 root root        23 Jul  4 06:44 /lib64/libanl.so -> ../../lib64/libanl.so.1
-rwxr-xr-x  1 root root     15624 Jul  4 06:46 /lib64/libanl.so.1
lrwxrwxrwx  1 root root        20 Dec  6  2022 /lib64/libarchive.so.13 -> libarchive.so.13.5.3
-rwxr-xr-x  1 root root    840832 Dec  6  2022 /lib64/libarchive.so.13.5.3
-rwxr-xr-x  1 root root     36456 Apr 24 20:52 /lib64/libasm-0.191.so
lrwxrwxrwx  1 root root        15 Apr 24 20:51 /lib64/libasm.so.1 -> libasm-0.191.so
lrwxrwxrwx  1 root root        20 Mar 30  2023 /lib64/libasprintf.so.0 -> libasprintf.so.0.0.0
-rwxr-xr-x  1 root root     15232 Mar 30  2023 /lib64/libasprintf.so.0.0.0
lrwxrwxrwx. 1 root root        18 Aug 10  2021 /lib64/libassuan.so.0 -> libassuan.so.0.8.5
-rwxr-xr-x. 1 root root     86944 Aug 10  2021 /lib64/libassuan.so.0.8.5
lrwxrwxrwx. 1 root root        19 Aug 10  2021 /lib64/libattr.so.1 -> libattr.so.1.1.2501
-rwxr-xr-x. 1 root root     28552 Aug 10  2021 /lib64/libattr.so.1.1.2501
lrwxrwxrwx  1 root root        17 Nov  8  2023 /lib64/libaudit.so.1 -> libaudit.so.1.0.0
  • 通过 ln -l 命令可以查看文件具体信息,若输出详细信息的首字母为 l,则表示这是一个软链接文件或目录;
  • 可以看到 /lib64/libattr.so.1 文件就是一个软链接文件,其指向了 /lib64/libattr.so.1.1.2501 文件;
  • /lib64/ 目录下大多数文件都是软链接文件。
bash
  ~ ls -l example_link.txt
lrwxrwxrwx 1 user user  11 Sep 22 14:30 example_link.txt -> example.txt
  • 文件类型:lrwxrwxrwx 表示这是一个符号链接。
  • 文件权限:lrwxrwxrwx 的权限通常与目标文件相同,因为符号链接本身不包含任何实际数据。
  • 文件大小:11 表示文件大小为 11 字节。
  • 文件名:example_link.txt 是符号链接的名称。
  • 目标文件:-> example.txt 表示符号链接指向的目标文件。

软链接的工作原理

软链接本身是一个独立的文件,它包含了目标文件或目录的路径。它不会直接保存目标文件的内容,而是提供一种间接访问目标文件的方式。换句话说,软链接只存储指向目标文件的路径,而操作系统则通过这个路径找到目标文件。

创建软链接

使用 ln -s 命令来创建软链接。

bash
ln -s <目标文件或目> <软链接>
  • -s 参数表示创建软链接(Symbolic Link
  • <目标文件或目录> 要创建软链接的文件或目录的路径。
  • <软链接名> 软链接文件路径(也就是要起的文件名)。
bash
# 创建一个指向 /home/user/documents 目录的软链接 docs
ln -s /home/user/documents docs

# 在当前目录下创建一个名为 example_link.txt 的软链接,指向 example.txt 文件
ln -s example.txt example_link.txt

# 在当前目录下创建一个名为 link_to_file.txt 的软链接,指向 original_file.txt 文件
ln -s original_file.txt link_to_file.txt

# 在 /usr/bin 目录下创建一个名为 python3 的软链接,指向 /usr/local/bin/python3.12 文件
ln -s /usr/local/bin/python3.12 /usr/bin/python3

# 将编译的 QEMU-5.0.0 生成的二进制文件 qemu-system-x86_64 通过软链接,映射到 /usr/bin/qemu-kvm
# 从而我们可以直接在终端命令行运行 qemu-kvm 这个二进制,而不需要每次都cd到/usr/local/qemu-5.0.0/bin/这个文件夹;
ln -s /usr/local/qemu-5.0.0/bin/qemu-system-x86_64 /usr/bin/qemu-kvm

软链接的删除

删除软链接不会影响它所指向的文件或目录。

bash
rm link_to_file.txt

软链接的特性

  1. 指向文件或目录:软链接可以指向文件,也可以指向目录。
  2. 跨文件系统:软链接可以指向位于不同文件系统的文件或目录,甚至可以指向网络文件系统中的目标。
  3. 目标文件删除的影响:如果软链接指向的目标文件被删除,软链接不会自动删除,但它将变为“悬空链接”或“死链接”,即指向一个不存在的文件。如果尝试访问这种链接,系统会报错提示文件不存在。
  4. 权限:软链接的权限固定为 rwxrwxrwx,因为它们不直接访问文件内容,而只是指向文件。实际访问权限由目标文件决定。

软链接使用场景

  1. 便于组织和访问文件:软链接可以在不同的目录中创建指向同一文件或目录的链接,方便在不同位置访问和组织文件。
  2. 节省磁盘空间:对于需要在多个位置使用的大型文件,可以创建软链接而不是复制文件,节省磁盘空间。
  3. 维护多个版本的软件:可以将不同版本的软件放在不同的目录中,然后通过软链接指向当前使用的版本,方便切换和管理。
  4. 简化复杂的目录结构:通过创建软链接,可以在复杂的目录结构中创建便于访问的快捷方式,简化文件访问路径。

硬链接

硬链接的工作原理

每个文件在文件系统中不仅有文件名,还对应着一个唯一的 inode(索引节点),inode 存储着文件的元数据(如文件大小、权限、数据块位置等)。硬链接的关键点在于,它们为同一个 inode 创建了不同的文件名,意味着多个硬链接指向同一个 inode 和数据块。

  • 硬链接与目标文件共享相同的 inode。
  • 删除其中的一个硬链接,文件内容并不会被删除,其他硬链接仍然可以访问该文件内容。
  • 文件的内容只有当所有指向它的硬链接都被删除时,才会从磁盘中真正移除。

创建硬链接

在 Linux 中,使用 ln 命令可以创建硬链接。

bash
ln <目标文> <硬链接>
  • <目标文件> 是你要为其创建硬链接的文件。
  • <硬链接名> 是硬链接的名称。
bash
# 为 file.txt 文件创建一个硬链接 file_hardlink.txt
# 此时,file.txt 和 file_hardlink.txt 指向相同的文件数据。
# 无论修改哪一个,修改的内容都会同步反映在另一个文件中,因为它们实际上是同一个文件。
ln file.txt file_hardlink.txt

查看硬链接

bash
  ~ ls -lha file.txt
-rw-r--r-- 1 root root 19 Sep 22 02:54 file.txt
  ~ head -n1 file.txt
filename: file.txt
  ~ ln file.txt file_hardlink.txt # 创建硬链接
  ~ ls -li file.txt file_hardlink.txt  # 使用 ls -li 命令查看文件的 inode 信息和硬链接数
395076 -rw-r--r-- 2 root root 19 Sep 22 02:54 file_hardlink.txt
395076 -rw-r--r-- 2 root root 19 Sep 22 02:54 file.txt


  ~ ln -s file.txt file_symbolic_link.txt # 创建软链接
  ~ ls -li file.txt file_hardlink.txt file_symbolic_link.txt
395076 -rw-r--r-- 2 root root 19 Sep 22 02:54 file_hardlink.txt
395077 lrwxrwxrwx 1 root root  8 Sep 22 02:58 file_symbolic_link.txt -> file.txt
395076 -rw-r--r-- 2 root root 19 Sep 22 02:54 file.txt

  ~ sed -i '1i# 这是 file.txt 文件的新增内容' file.txt # 在 file.txt 文件的第一行添加内容
  ~ head -n1 file* # 查看三个文件的第一行内容
==> file_hardlink.txt <==
filename: file.txt

==> file_symbolic_link.txt <==
# 这是 file.txt 文件的新增内容

==> file.txt <==
# 这是 file.txt 文件的新增内容
  ~ ls -li file.txt file_hardlink.txt file_symbolic_link.txt # 查看三个文件的 inode 信息和链接数
395076 -rw-r--r-- 1 root root 19 Sep 22 02:54 file_hardlink.txt
395077 lrwxrwxrwx 1 root root  8 Sep 22 02:58 file_symbolic_link.txt -> file.txt
395079 -rw-r--r-- 1 root root 59 Sep 22 03:05 file.txt
  • file.txtfile_hardlink.txt 两个文件的 inode 编号相同(395076),表示它们指向同一个物理文件。数字 2 表示该文件有两个硬链接(包括自身)。
  • file.txtfile_symbolic_link.txt 的 inode 编号不同(395076395077),表示它们指向不同的物理文件。

硬链接的特性

  1. 同一个文件系统内:硬链接只能在同一个文件系统(分区)内创建,因为它依赖于 inode。不同的文件系统拥有独立的 inode 表,硬链接无法跨越不同文件系统。
  2. 共享 inode:硬链接与目标文件共享相同的 inode,意味着它们访问同一份文件内容。多个硬链接的本质是多个文件名指向相同的数据块。
  3. 删除安全:删除一个硬链接,并不会删除文件的内容,只有当所有指向同一文件的硬链接都被删除时,文件内容才会被真正移除。
  4. 文件元数据同步:由于硬链接共享 inode,因此文件的元数据(如权限、所有者、大小等)在所有硬链接中保持一致。如果通过任意硬链接修改文件内容或属性,其他硬链接也会立即反映出这些修改。
  5. 不可链接目录:通常情况下,Linux 系统不允许创建指向目录的硬链接,因为这样会破坏文件系统的层次结构,导致循环引用和混乱。

删除硬链接

bash
rm file_hardlink.txt

删除硬链接并不会影响其他指向同一数据的硬链接,只有当所有硬链接都删除后,文件的物理数据才会被操作系统回收。

硬链接的局限性

  1. 无法链接目录:硬链接不能用于链接目录,除非使用超级用户权限并在特殊情况下(例如某些备份工具可能会使用这种功能),因为这会破坏文件系统的树形结构。
  2. 不能跨文件系统:由于硬链接依赖 inode,而 inode 是文件系统特有的,因此硬链接无法跨文件系统创建。

软链接与硬链接的区别

在 Linux 中,除了软链接,还有一种叫做硬链接(Hard Link)。两者之间的区别如下:

特性软链接(Symbolic Link)硬链接(Hard Link)
指向文件或目录路径文件的物理数据块
不同文件系统可以跨文件系统只能在同一文件系统中
目标文件删除如果目标文件删除,软链接失效删除目标文件后,硬链接仍然有效
目录链接可以指向目录不能指向目录(一般情况下,除非超级用户特权)
大小软链接大小仅为存储路径所需的空间硬链接的大小与目标文件的大小相同
数量不影响目标文件的硬链接计数每个硬链接增加目标文件的链接计数
本质快捷方式文件
文件元数据软链接有自己的元数据(权限、大小等)所有硬链接共享文件元数据

软链接的用途

  1. 组织文件:通过软链接,用户可以将分散在不同目录下的文件“聚集”到一起,方便管理,而无需移动文件。
  2. 兼容性:在系统升级或软件更新中,路径可能会改变。可以通过软链接创建旧路径到新路径的映射,避免软件找不到文件。
  3. 目录替换:当某个目录的空间不足时,可以将其内容迁移到其他磁盘,然后创建指向新位置的软链接,这样可以继续使用旧路径访问数据。