Linux ------ 再谈软硬链接
- 再识软硬链接
-
- [用ln -s指令创建软链接](#用ln -s指令创建软链接)
- 用ln指令创建硬链接
- 软硬链接的特征
- 软硬链接的作用(使用场景)
- 为什么硬链接不能链接目录
再识软硬链接
软连接(也称为符号链接或符号连接)在Linux和其他Unix-like系统中是一种特殊类型的文件,它用于创建一个指向另一个文件或目录的引用。软连接不同于硬链接,它不直接指向数据的存储位置,而是通过路径名指向另一个文件或目录。
软连接的格式实质上是一个包含目标路径的文本文件。这个目标路径可以是绝对路径 或相对路径:
- 绝对路径:从文件系统的根目录开始,如 /home/user/file.txt。
- 相对路径:相对于链接文件所在位置的路径,如 .../file.txt 表示当前目录的上级目录中的 file.txt 文件。
格式:
cpp
ln -s 目标文件路径 软连接文件的名称
用ln -s指令创建软链接
硬连接(Hard Link)是Linux和其他Unix-like操作系统中的一个文件系统特性,它允许一个文件在文件系统中有多个有效路径名。与软连接不同,硬连接不是一个单独的文件类型,而是对现有文件的另一个引用或指针。
格式:
cpp
ln 目标文件路径 软连接文件的名称
用ln指令创建硬链接
软硬链接的特征
用 ll -i
观察软链接的inode和目标文件的inode:
可以看出,软链接的file_soft.link -> file_target1.txt
与 file_target1.txt
具有相同的inode而硬链接的 file_hard.link
与file_target2.txt
的inode不同。
软链接的特征:
- 独立的inode:软连接拥有自己的inode和文件系统条目。这意味着软连接与它所指向的目标文件具有不同的文件系统属性,如权限、所有者和时间戳等。
- 路径指向 :软连接通过存储一个路径来指向其目标文件或目录。当访问软连接时,文件系统会读取这个路径并解析到实际的文件或目录。
- 权限 :软连接的权限通常不受限制,因为它们本质上是一个包含路径的文本文件。实际的文件访问权限由目标文件的权限决定。
- 大小 :软连接的大小是其存储的路径字符串的长度,而不是目标文件的大小。
- 跨文件系统:软连接可以跨文件系统工作,因为它们仅指向一个路径。这与硬链接不同,硬链接不能跨越文件系统。
- 悬挂链接:如果软连接指向的文件或目录被删除,软连接仍然存在,但会成为一个"悬挂链接"(dangling link),即指向一个不存在的路径。
硬连接的特征
- 共享inode :硬连接和它所指向的目标文件共享相同的inode和数据块。这意味着它们在文件系统中是完全相同的,任何对硬连接的修改都会直接反映在原始文件上,反之亦然。
- 不存储路径信息 :与软连接不同,硬连接不包含任何路径信息。它仅是文件系统中另一个指向相同inode的名称。
- 不能跨文件系统:由于硬连接直接依赖于inode编号,而这些编号在不同的文件系统中可能不相同,硬连接不能跨越不同的文件系统创建。
- 不能用于目录:出于防止循环引用和保持文件系统的一致性的考虑,大多数Unix-like系统不允许对目录进行硬连接。
- 权限和属性共享:硬连接共享其目标文件的权限和属性,因为它们指向同一个inode。更改其中一个链接的属性(如修改时间、权限等)会影响所有其他链接。
- 删除和持久性 :删除一个硬连接不会影响文件的物理数据,只有当所有指向同一inode的链接都被删除后,文件的数据才会被操作系统删除。
软硬链接的作用(使用场景)
软链接
快捷方式
软链接可以将其类比成Windows的里面的快捷方式,比如我们想要打开pc上的edge浏览器,我们一般直接点击桌面上的快捷方式,而并不是找到edge的 .exe 文件。
所以,软连接本身就可以当作一个快捷方式来使用。
比如我们想使用/home/qq/documents/projrcts
路径下的imoprtant.txt
这个文件,因为其存放系统中比较深的位置,先找到源文件的位置再使用的话是比较麻烦的,此时我们就可以使用软链列的方式来创建一个快捷方式。
在/home/qq/bt111/Linux/4_22
的目录下使用imoprtant.txt
这个文件,通过软链接,形成快捷方式:ln -s /home/qq/documents/projrcts/imoprtant.txt ./important_soft.link
。
其次软连接还可以用于 配置文件的共享 即:在多个应用或环境中共享配置文件时,可以使用软连接指向一个共同的配置文件,这样只需维护一份文件即可更新所有应用的配置。该演示将在下一篇博客中讲解。
硬链接
1. 节省空间
硬链接让多个文件名指向同一块磁盘上的数据, 这样做可以避免重复存储相同的数据内容,从而节省磁盘空间。
示例:
假设你有一个非常大的数据文件 data.csv
存在于 /home/user/reports/
目录下,你需要在 /home/user/backup/
下也能访问这个文件,但不想占用两份存储空间。你可以创建一个硬链接:
cpp
ln /home/user/reports/data.csv /home/user/backup/data.csv
现在 data.csv
在两个目录中都有对应的入口,但实际上只存储了一份在磁盘上。
2. 备份和同步
利用硬链接进行数据备份,可以确保多个备份点间的数据实时同步,而不必担心同步延迟或额外的存储开销。
3. 数据一致性
所有硬链接对应的文件,由于指向同一个inode,因此文件内容总是一致的。
示例:
在开发环境中,可能需要多个项目共享某些公共库的最新版本。
cpp
ln /libs/libcommon.so /project1/libs/libcommon.so
ln /libs/libcommon.so /project2/libs/libcommon.so
这种方式确保所有项目都使用同一个库的版本,一旦库更新,所有项目立即可以访问最新的库。
4. 避免意外删除
如果文件具有多个硬链接,删除其中一个链接不会影响到文件的实际数据,只有最后一个链接被删除时,文件的数据才会从磁盘中删除。
为什么硬链接不能链接目录
防止循环引用是限制硬链接不能链接到目录的一个重要理由。循环引用是指一个目录通过一系列的链接或子目录间接或直接地指向自己,这样的结构可以导致多种问题,尤其是在执行文件系统操作如目录遍历时。
让我们通过一个具体的示例来更好地理解这一点:
示例:假设硬链接可以链接目录
假设你有如下的目录结构:
bash
/parent
/dir
在这种结构中,/parent
是一个父目录,而 /parent/dir
是其子目录。
如果硬链接能够链接到目录,你可能会在 /parent/dir
下创建一个硬链接指向 /parent
,如此操作:
bash
ln /parent /parent/dir/sub_link
这样,/parent/dir/sub_link
实际上就是指向 /parent
。这就形成了一个循环:
/parent/dir/sub_link
指向/parent
/parent
包含/parent/dir
- 而
/parent/dir
又通过sub_link
指回了/parent
循环引用导致的问题:
-
遍历目录时的无限循环 :
当使用诸如
ls
或find
这样的命令遍历目录结构时,遇到循环引用会导致进程陷入无限循环,系统可能需要特殊的机制来检测并中断这种循环,否则会消耗大量的系统资源,甚至导致系统挂起。 -
磁盘使用和文件数量统计的错误 :
计算磁盘使用量或文件数量时,循环引用会使结果不准确,因为同一个目录或文件可能被重复计算多次。
-
文件系统的完整性和可靠性问题 :
如果文件系统允许目录的循环引用,那么任何依赖于目录层次结构的安全性或策略控制都可能因路径解析的不确定性而受到影响。
正是由于这些潜在的严重问题,大多数UNIX和类UNIX系统设计中禁止了对目录的硬链接,以保持系统的稳定性和可靠性。符号链接(软链接)虽然可以链接到目录,但系统处理软链接的方式与硬链接不同,它只是一个指向目标的路径引用,不会造成同样的循环引用问题。