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软链接的特性
- 指向文件或目录:软链接可以指向文件,也可以指向目录。
- 跨文件系统:软链接可以指向位于不同文件系统的文件或目录,甚至可以指向网络文件系统中的目标。
- 目标文件删除的影响:如果软链接指向的目标文件被删除,软链接不会自动删除,但它将变为“悬空链接”或“死链接”,即指向一个不存在的文件。如果尝试访问这种链接,系统会报错提示文件不存在。
- 权限:软链接的权限固定为
rwxrwxrwx,因为它们不直接访问文件内容,而只是指向文件。实际访问权限由目标文件决定。
软链接使用场景
- 便于组织和访问文件:软链接可以在不同的目录中创建指向同一文件或目录的链接,方便在不同位置访问和组织文件。
- 节省磁盘空间:对于需要在多个位置使用的大型文件,可以创建软链接而不是复制文件,节省磁盘空间。
- 维护多个版本的软件:可以将不同版本的软件放在不同的目录中,然后通过软链接指向当前使用的版本,方便切换和管理。
- 简化复杂的目录结构:通过创建软链接,可以在复杂的目录结构中创建便于访问的快捷方式,简化文件访问路径。
硬链接
硬链接的工作原理
每个文件在文件系统中不仅有文件名,还对应着一个唯一的 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.txtfile.txt和file_hardlink.txt两个文件的 inode 编号相同(395076),表示它们指向同一个物理文件。数字2表示该文件有两个硬链接(包括自身)。file.txt和file_symbolic_link.txt的 inode 编号不同(395076和395077),表示它们指向不同的物理文件。
硬链接的特性
- 同一个文件系统内:硬链接只能在同一个文件系统(分区)内创建,因为它依赖于 inode。不同的文件系统拥有独立的 inode 表,硬链接无法跨越不同文件系统。
- 共享 inode:硬链接与目标文件共享相同的 inode,意味着它们访问同一份文件内容。多个硬链接的本质是多个文件名指向相同的数据块。
- 删除安全:删除一个硬链接,并不会删除文件的内容,只有当所有指向同一文件的硬链接都被删除时,文件内容才会被真正移除。
- 文件元数据同步:由于硬链接共享 inode,因此文件的元数据(如权限、所有者、大小等)在所有硬链接中保持一致。如果通过任意硬链接修改文件内容或属性,其他硬链接也会立即反映出这些修改。
- 不可链接目录:通常情况下,Linux 系统不允许创建指向目录的硬链接,因为这样会破坏文件系统的层次结构,导致循环引用和混乱。
删除硬链接
bash
rm file_hardlink.txt删除硬链接并不会影响其他指向同一数据的硬链接,只有当所有硬链接都删除后,文件的物理数据才会被操作系统回收。
硬链接的局限性
- 无法链接目录:硬链接不能用于链接目录,除非使用超级用户权限并在特殊情况下(例如某些备份工具可能会使用这种功能),因为这会破坏文件系统的树形结构。
- 不能跨文件系统:由于硬链接依赖 inode,而 inode 是文件系统特有的,因此硬链接无法跨文件系统创建。
软链接与硬链接的区别
在 Linux 中,除了软链接,还有一种叫做硬链接(Hard Link)。两者之间的区别如下:
| 特性 | 软链接(Symbolic Link) | 硬链接(Hard Link) |
|---|---|---|
| 指向 | 文件或目录路径 | 文件的物理数据块 |
| 不同文件系统 | 可以跨文件系统 | 只能在同一文件系统中 |
| 目标文件删除 | 如果目标文件删除,软链接失效 | 删除目标文件后,硬链接仍然有效 |
| 目录链接 | 可以指向目录 | 不能指向目录(一般情况下,除非超级用户特权) |
| 大小 | 软链接大小仅为存储路径所需的空间 | 硬链接的大小与目标文件的大小相同 |
| 数量 | 不影响目标文件的硬链接计数 | 每个硬链接增加目标文件的链接计数 |
| 本质 | 快捷方式 | 文件 |
| 文件元数据 | 软链接有自己的元数据(权限、大小等) | 所有硬链接共享文件元数据 |
软链接的用途
- 组织文件:通过软链接,用户可以将分散在不同目录下的文件“聚集”到一起,方便管理,而无需移动文件。
- 兼容性:在系统升级或软件更新中,路径可能会改变。可以通过软链接创建旧路径到新路径的映射,避免软件找不到文件。
- 目录替换:当某个目录的空间不足时,可以将其内容迁移到其他磁盘,然后创建指向新位置的软链接,这样可以继续使用旧路径访问数据。