你不得不知的Linux知识(5)——硬链接与软链接
目录
3.软链接/符号链接(soft link / symbolic link)
前言
基于前面学习的基本文件管理,我们面临着文件共享资源的问题,而在Linux系统中链接文件就是为解决文件的共享使用,其引入了两种链接:硬链接(hard link)和软链接(又称符号链接,即soft link或symbolic link)。
1.inode节点
或许你想过Linux系统是怎么读取各个文件当中的内容呢?通过“文件名”进行搜索?
其实并不是,在Linux系统,文件的唯一标识是inode节点,inode 节点就像是文件的 “身份证”,它记录了文件的各种信息,但不包含文件的实际内容。每个文件在文件系统中都有一个唯一的 inode 节点,系统通过 inode 节点来管理文件。

每当一个新的文件被创建时,系统都会为它建立一个inode节点。
2.硬链接(hard link)
2.1 基本概念
硬链接是指向文件系统中一个 inode(索引节点)的多个目录项。每个文件在文件系统中都有一个对应的 inode,inode 包含了文件的元数据,如文件的大小、权限、所有者等信息,但不包含文件的实际数据内容。硬链接实际上是为一个已存在的 inode 创建一个新的目录项,使得这个 inode 被多个文件名所共享。
- 例如,假设有一个文件 “file1”,它有一个 inode 编号为 12345。当我们为它创建一个硬链接 “link1” 时,“link1” 和 “file1” 都指向 inode 12345。从文件系统的角度看,它们是同一个文件的两个不同的名字。

所以当你修改硬连接当中的任意一个文件当中的内容,其余链接文件的内容也会被修改,因为它们指向磁盘中相同的数据块。
2.2 特点
-
硬链接不能跨文件系统。因为 inode 是文件系统特有的,不同的文件系统有自己独立的 inode 空间。所以,当你要在两个不同的文件系统(如两个不同的磁盘分区)之间创建硬链接时,是无法实现的。
-
硬链接不能对目录创建。这是为了防止文件系统出现循环引用等问题,维护文件系统的结构完整性。如果允许对目录创建硬链接,可能会导致一些复杂的文件系统遍历和管理问题。
-
当删除一个硬链接时,只有当该 inode 的链接计数减到 0 时,文件的数据块才会被真正删除。链接计数是 inode 中的一个字段,它记录了有多少个目录项指向这个 inode。例如,一个文件原本有 1 个硬链接(自己),当创建一个硬链接后,链接计数变为 2。如果删除其中一个硬链接,链接计数减 1,文件数据仍然存在。只有当链接计数为 0 时,文件系统才会回收文件占用的数据块。
2.3 命令使用与使用场景
在Linux系统中,可以使用 ln 源文件 目标文件 命令来创建硬链接。
# 为guess.txt文件创建硬链接文件 hard-link.txt
root@user-virtual-machine:/home/user/Desktop# ln guess.txt hard-link.txt
# 使用 ls 添加 i 参数,显示文件的inode节点编号
root@user-virtual-machine:/home/user/Desktop# ls -li | grep "txt"
1179873 -rwxr-xr-x 2 root root 35 4月 26 20:57 guess.txt
1179873 -rwxr-xr-x 2 root root 35 4月 26 20:57 hard-link.txt
# 硬链接文件的inode节点编号相同(第一列数据)
硬链接可以用于在同一文件系统中为重要文件创建多个备份入口。比如,在一个开发项目中,你有一个源代码文件 “source.c”,你可以在同一文件系统中为它创建多个硬链接,如 “backup_source1.c”“backup_source2.c” 等,这样可以通过不同的名字访问同一个文件内容,方便在不同场景下使用,而不用担心占用额外的存储空间来复制文件内容。
3.软链接/符号链接(soft link / symbolic link)
3.1 基本概念
软链接也被称为符号链接(Symbolic Link)。它是一个特殊的文件,其中包含了另一个文件或目录的路径名。软链接有自己的 inode,它不直接指向目标文件的数据块,而是指向目标文件的路径。可以将软链接理解为类似于 Windows 系统中的快捷方式。

PS:直接修改软链接文件的内容,不会影响原文件。
但通过软链接打开原文件并进行修改,会修改原文件。
3.2 特点
-
软链接可以跨越不同的文件系统。例如,你可以在一个文件系统(如分区 A)中创建一个软链接,指向另一个文件系统(如分区 B)中的文件或目录。
-
可以对目录创建软链接。这对于构建复杂的目录结构和快捷访问路径很有用。比如,你可以创建一个软链接,将一个经常使用的子目录链接到一个更方便访问的位置。
-
当目标文件被删除后,软链接会变成一个 “悬空链接”,即它指向的文件或目录已经不存在。此时,软链接本身仍然存在,但访问它会提示错误。不过,一旦目标文件重新被创建,如果软链接仍然存在且路径正确,就可以重新正常访问。
3.3 命令使用与使用场景
使用 ln -s 源文件 目标文件 命令进行创建软链接。
# 创建软链接
root@user-virtual-machine:/home/user/Desktop# ln -s guess.txt soft-link.txt
root@user-virtual-machine:/home/user/Desktop# ls -li | grep "txt"
1179873 -rwxr-xr-x 2 root root 35 4月 26 20:57 guess.txt
1179873 -rwxr-xr-x 2 root root 35 4月 26 20:57 hard-link.txt
1179837 lrwxrwxrwx 1 root root 9 4月 27 11:22 soft-link.txt -> guess.txt
# 软链接文件类型为 l,inode节点不一样
# 输出两个文件内容,内容是一致的
root@user-virtual-machine:/home/user/Desktop# cat guess.txt
hello,world
FJNU
root@user-virtual-machine:/home/user/Desktop# cat soft-link.txt
hello,world
FJNU
-
软链接常用于创建一个方便的访问入口,指向位于其他位置的文件或目录。例如,在一个大型的软件项目中,库文件可能存放在一个特定的目录下,如 “/opt/libs/project_lib”。你可以创建一个软链接 “lib_link” 指向这个目录,这样在代码中就可以通过 “lib_link” 这个相对路径来访问库文件,而不需要每次都使用绝对路径,提高了代码的可移植性和可维护性。
-
另一个场景是为不同版本的软件或文件创建软链接。比如,有一个软件有多个版本,你可以创建一个软链接指向当前正在使用的版本。当需要切换版本时,只需要修改软链接的指向,而不需要修改大量引用该软件的配置文件或脚本。
4.总结
| 特性 | 软链接 | 硬链接 |
|---|---|---|
| 定义 | 指向文件或目录的路径的特殊文件 | 指向文件系统中inode的多个目录项 |
| 数据存储 | 存储目标文件的路径名 | 共享同一个inode,指向同一数据块 |
| 删除影响 | 删除目标文件,软链接变成“悬空链接” | 删除一个硬链接,当inode链接计数减到0时,数据块被删除 |
| 跨文件系统 | 可以跨越不同文件系统 | 不能跨越不同文件系统 |
| 目录支持 | 可以对目录创建软链接 | 不能对目录创建硬链接 |
| 链接计数 | 目标文件的链接计数不变 | 目标文件的链接计数增加 |
| 修改影响 | 直接修改软链接文件内容不影响原文件;通过软链接修改原文件影响原文件 | 修改任何一个硬链接文件内容都会影响原文件 |
| 用途 | 创建文件或目录的快捷访问入口,方便访问不同位置的文件 | 在同一文件系统中为文件创建多个备份入口,节省存储空间 |
更多推荐


所有评论(0)